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  }