Created
July 31, 2018 07:25
-
-
Save s1s1ty/f26b287f0b31ba83b48c2e21ef63b53f to your computer and use it in GitHub Desktop.
post-mysql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package post | |
import ( | |
"context" | |
"database/sql" | |
models "github.com/s1s1ty/go-mysql-crud/models" | |
pRepo "github.com/s1s1ty/go-mysql-crud/repository" | |
) | |
// NewSQLPostRepo retunrs implement of post repository interface | |
func NewSQLPostRepo(Conn *sql.DB) pRepo.PostRepo { | |
return &mysqlPostRepo{ | |
Conn: Conn, | |
} | |
} | |
type mysqlPostRepo struct { | |
Conn *sql.DB | |
} | |
func (m *mysqlPostRepo) fetch(ctx context.Context, query string, args ...interface{}) ([]*models.Post, error) { | |
rows, err := m.Conn.QueryContext(ctx, query, args...) | |
if err != nil { | |
return nil, err | |
} | |
defer rows.Close() | |
payload := make([]*models.Post, 0) | |
for rows.Next() { | |
data := new(models.Post) | |
err := rows.Scan( | |
&data.ID, | |
&data.Title, | |
&data.Content, | |
) | |
if err != nil { | |
return nil, err | |
} | |
payload = append(payload, data) | |
} | |
return payload, nil | |
} | |
func (m *mysqlPostRepo) Fetch(ctx context.Context, num int64) ([]*models.Post, error) { | |
query := "Select id, title, content From posts limit ?" | |
return m.fetch(ctx, query, num) | |
} | |
func (m *mysqlPostRepo) GetByID(ctx context.Context, id int64) (*models.Post, error) { | |
query := "Select id, title, content From posts where id=?" | |
rows, err := m.fetch(ctx, query, id) | |
if err != nil { | |
return nil, err | |
} | |
payload := &models.Post{} | |
if len(rows) > 0 { | |
payload = rows[0] | |
} else { | |
return nil, models.ErrNotFound | |
} | |
return payload, nil | |
} | |
func (m *mysqlPostRepo) Create(ctx context.Context, p *models.Post) (int64, error) { | |
query := "Insert posts SET title=?, content=?" | |
stmt, err := m.Conn.PrepareContext(ctx, query) | |
if err != nil { | |
return -1, err | |
} | |
res, err := stmt.ExecContext(ctx, p.Title, p.Content) | |
defer stmt.Close() | |
if err != nil { | |
return -1, err | |
} | |
return res.LastInsertId() | |
} | |
func (m *mysqlPostRepo) Update(ctx context.Context, p *models.Post) (*models.Post, error) { | |
query := "Update posts set title=?, content=? where id=?" | |
stmt, err := m.Conn.PrepareContext(ctx, query) | |
if err != nil { | |
return nil, err | |
} | |
_, err = stmt.ExecContext( | |
ctx, | |
p.Title, | |
p.Content, | |
p.ID, | |
) | |
if err != nil { | |
return nil, err | |
} | |
defer stmt.Close() | |
return p, nil | |
} | |
func (m *mysqlPostRepo) Delete(ctx context.Context, id int64) (bool, error) { | |
query := "Delete From posts Where id=?" | |
stmt, err := m.Conn.PrepareContext(ctx, query) | |
if err != nil { | |
return false, err | |
} | |
_, err = stmt.ExecContext(ctx, id) | |
if err != nil { | |
return false, err | |
} | |
return true, nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment