github.com/EngineerKamesh/gofullstack@v0.0.0-20180609171605-d41341d7d4ee/volume3/section4/gopherface/common/datastore/mysql.go (about) 1 package datastore 2 3 import ( 4 "database/sql" 5 "log" 6 7 "github.com/EngineerKamesh/gofullstack/volume3/section4/gopherface/models" 8 9 _ "github.com/go-sql-driver/mysql" 10 ) 11 12 type MySQLDatastore struct { 13 *sql.DB 14 } 15 16 func NewMySQLDatastore(dataSourceName string) (*MySQLDatastore, error) { 17 18 connection, err := sql.Open("mysql", dataSourceName) 19 20 if err != nil { 21 return nil, err 22 } 23 24 return &MySQLDatastore{ 25 DB: connection}, nil 26 } 27 28 func (m *MySQLDatastore) CreateUser(user *models.User) error { 29 30 tx, err := m.Begin() 31 if err != nil { 32 log.Print(err) 33 } 34 35 defer tx.Rollback() 36 37 stmt, err := tx.Prepare("INSERT INTO user(uuid, username, first_name, last_name, email, password_hash) VALUES (?,?,?,?,?,?)") 38 if err != nil { 39 return err 40 } 41 42 defer stmt.Close() 43 44 _, err = stmt.Exec(user.UUID, user.Username, user.FirstName, user.LastName, user.Email, user.PasswordHash) 45 if err != nil { 46 return err 47 } 48 49 err = tx.Commit() 50 if err != nil { 51 return err 52 } 53 54 return nil 55 } 56 57 func (m *MySQLDatastore) GetUser(username string) (*models.User, error) { 58 59 stmt, err := m.Prepare("SELECT uuid, username, first_name, last_name, email, password_hash, UNIX_TIMESTAMP(created_ts), UNIX_TIMESTAMP(updated_ts) FROM user WHERE username = ?") 60 if err != nil { 61 log.Print(err) 62 return nil, err 63 } 64 65 defer stmt.Close() 66 67 row := stmt.QueryRow(username) 68 u := models.User{} 69 err = row.Scan(&u.UUID, &u.Username, &u.FirstName, &u.LastName, &u.Email, &u.PasswordHash, &u.TimestampCreated, &u.TimestampModified) 70 return &u, err 71 } 72 73 func (m *MySQLDatastore) Close() { 74 m.Close() 75 }