github.com/EngineerKamesh/gofullstack@v0.0.0-20180609171605-d41341d7d4ee/volume2/section5/gopherfacedb/common/datastore/mysql.go (about) 1 package datastore 2 3 import ( 4 "database/sql" 5 "log" 6 7 "github.com/EngineerKamesh/gofullstack/volume2/section5/gopherfacedb/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 log.Fatal(err) 22 return nil, err 23 } 24 25 return &MySQLDatastore{ 26 DB: connection}, nil 27 } 28 29 func (m *MySQLDatastore) CreateUser(user *models.User) error { 30 31 tx, err := m.Begin() 32 if err != nil { 33 log.Print(err) 34 } 35 36 defer tx.Rollback() 37 38 stmt, err := tx.Prepare("INSERT INTO user(uuid, username, first_name, last_name, email, password_hash) VALUES (?,?,?,?,?,?)") 39 if err != nil { 40 return err 41 } 42 43 defer stmt.Close() 44 45 _, err = stmt.Exec(user.UUID, user.Username, user.FirstName, user.LastName, user.Email, user.PasswordHash) 46 if err != nil { 47 return err 48 } 49 50 err = tx.Commit() 51 if err != nil { 52 return err 53 } 54 55 return nil 56 } 57 58 func (m *MySQLDatastore) GetUser(username string) (*models.User, error) { 59 60 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 = ?") 61 if err != nil { 62 log.Print(err) 63 return nil, err 64 } 65 66 defer stmt.Close() 67 68 row := stmt.QueryRow(username) 69 u := models.User{} 70 err = row.Scan(&u.UUID, &u.Username, &u.FirstName, &u.LastName, &u.Email, &u.PasswordHash, &u.TimestampCreated, &u.TimestampModified) 71 if err != nil { 72 log.Print(err) 73 return nil, err 74 } 75 76 return &u, err 77 } 78 79 func (m *MySQLDatastore) Close() { 80 m.Close() 81 }