package sqaffold import ( "context" "database/sql" "code.aneur.in/go/record" "code.aneur.in/go/sqimple" "code.aneur.in/go/version" ) type Scaffold struct { ctx context.Context conn *sql.DB apps map[string]version.Migration } func (s *Scaffold) Delete(from string) *sqimple.DeleteStatement { return sqimple.Delete(from).ExecFunc(s.sqimpleExec) } func (s *Scaffold) Exec(query string, args ...any) (sql.Result, error) { return s.conn.ExecContext(s.ctx, query, args...) } func (s *Scaffold) Insert(into string) *sqimple.InsertStatement { return sqimple.Insert(into).ExecFunc(s.sqimpleExec) } func (s *Scaffold) Query(query string, args ...any) ([]record.Record, error) { rows, err := s.conn.QueryContext(s.ctx, query, args...) if err != nil { return nil, Err(err) } return ScanRecords(rows) } func (s *Scaffold) QueryOne(query string, args ...any) (record.Record, error) { rows, err := s.conn.QueryContext(s.ctx, query, args...) if err != nil { return nil, Err(err) } return ScanOneRecord(rows) } func (s *Scaffold) Select(from string) *sqimple.SelectQuery { return sqimple.Select(from).QueryFunc(s.sqimpleQuery).QueryRowFunc(s.sqimpleQueryRow) } func (s *Scaffold) Update(table string) *sqimple.UpdateStatement { return sqimple.Update(table).ExecFunc(s.sqimpleExec) } func (s *Scaffold) sqimpleExec(query sqimple.Query) (sql.Result, error) { return s.Exec(query.String(), query.Args()...) } func (s *Scaffold) sqimpleQuery(query sqimple.Query) (*sql.Rows, error) { return s.conn.QueryContext(s.ctx, query.String(), query.Args()...) } func (s *Scaffold) sqimpleQueryRow(query sqimple.Query) *sql.Row { return s.conn.QueryRowContext(s.ctx, query.String(), query.Args()...) } func (s *Scaffold) WithApp(name string, migration version.Migration) *Scaffold { s.apps[name] = migration return s } func NewScaffold(ctx context.Context, conn *sql.DB) *Scaffold { s := &Scaffold{ ctx: ctx, conn: conn, apps: map[string]version.Migration{}, } return s }