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} } }