|
|
package mysql
import ( "context" "database/sql" "encoding/json" "fmt" "git.aiterp.net/stufflog3/stufflog3/models" "git.aiterp.net/stufflog3/stufflog3/ports/mysql/mysqlcore" "git.aiterp.net/stufflog3/stufflog3/ports/mysql/sqltypes" "git.aiterp.net/stufflog3/stufflog3/usecases/items" "git.aiterp.net/stufflog3/stufflog3/usecases/projects" "git.aiterp.net/stufflog3/stufflog3/usecases/scopes" "git.aiterp.net/stufflog3/stufflog3/usecases/sprints" "git.aiterp.net/stufflog3/stufflog3/usecases/stats" "time"
_ "github.com/go-sql-driver/mysql" )
type Database struct { db *sql.DB q *mysqlcore.Queries }
func (db *Database) Scopes() scopes.Repository { return &scopeRepository{ db: db.db, q: db.q, } }
func (db *Database) Projects() projects.Repository { return &projectRepository{ db: db.db, q: db.q, } }
func (db *Database) Stats() stats.Repository { return &statsRepository{ db: db.db, q: db.q, } }
func (db *Database) Items() items.Repository { return &itemRepository{ db: db.db, q: db.q, } }
func (db *Database) Sprints() sprints.Repository { return &sprintRepository{ db: db.db, q: db.q, } }
func Connect(host string, port int, username, password, database string) (*Database, error) { db, err := sql.Open("mysql", fmt.Sprintf( "%s:%s@(%s:%d)/%s?parseTime=true", username, password, host, port, database, )) if err != nil { return nil, err }
db.SetMaxOpenConns(10) db.SetMaxIdleConns(10) db.SetConnMaxIdleTime(time.Minute)
err = db.Ping() if err != nil { return nil, err }
q, err := mysqlcore.Prepare(context.Background(), db) if err != nil { return nil, err }
return &Database{db: db, q: q}, nil }
func timePtr(nullTime sql.NullTime) *time.Time { if nullTime.Valid { return &nullTime.Time } else { return nil } }
func intPtr(nullInt32 sql.NullInt32) *int { if nullInt32.Valid { v := int(nullInt32.Int32) return &v } else { return nil } }
func sqlTimePtr(ptr *time.Time) sql.NullTime { if ptr != nil { return sql.NullTime{Time: *ptr, Valid: true} } else { return sql.NullTime{Valid: false} } }
func sqlDatePtr(ptr *models.Date) sqltypes.NullDate { if ptr != nil { return sqltypes.NullDate{Date: *ptr, Valid: true} } else { return sqltypes.NullDate{Valid: false} } }
func sqlIntPtr(ptr *int) sql.NullInt32 { if ptr != nil { return sql.NullInt32{Int32: int32(*ptr), Valid: true} } else { return sql.NullInt32{Valid: false} } }
func sqlJsonPtr(ptr interface{}) sqltypes.NullRawMessage { if ptr != nil { j, err := json.Marshal(ptr)
return sqltypes.NullRawMessage{RawMessage: j, Valid: err == nil} } else { return sqltypes.NullRawMessage{Valid: false} } }
|