package main import ( "context" "zombiezen.com/go/sqlite" "zombiezen.com/go/sqlite/sqlitex" ) // load scans all results of sql and appends them to r. func load[T any](ctx context.Context, db *sqlitex.Pool, r []T, sql string, row func(*sqlite.Stmt) T) ([]T, error) { conn, err := db.Take(ctx) defer db.Put(conn) if err != nil { return nil, err } stmt, err := conn.Prepare(sql) if err != nil { return nil, err } for { ok, err := stmt.Step() if err != nil { return r, err } if !ok { break } r = append(r, row(stmt)) } return r, err } func skillIconIDs(ctx context.Context, db *sqlitex.Pool) ([]int32, error) { return load(ctx, db, nil, "SELECT DISTINCT icon_id FROM skill_data", func(s *sqlite.Stmt) int32 { return s.ColumnInt32(0) }) } func charaIDs(ctx context.Context, db *sqlitex.Pool) ([]int32, error) { return load(ctx, db, nil, "SELECT id FROM chara_data", func(s *sqlite.Stmt) int32 { return s.ColumnInt32(0) }) } func rankIDs(ctx context.Context, db *sqlitex.Pool) ([]int32, error) { return load(ctx, db, nil, "SELECT id-1 FROM single_mode_rank", func(s *sqlite.Stmt) int32 { return s.ColumnInt32(0) }) }