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  }