package db import ( "context" "fmt" "strconv" "github.com/jmoiron/sqlx" ) type Folder struct { ID uint Name string Sorting string Color string Packs []string Folders []*Folder } func (f *Folder) Query(data *InsertId[string]) { data.query = fmt.Sprintf(` INSERT INTO folder (%s, name, sorting, color) VALUES ($1, $2, $3, $4) RETURNING id`, data.fieldName) } func (f *Folder) InsertObjects(tx *sqlx.Tx) error { relId := &InsertId[string]{ id: strconv.FormatUint(uint64(f.ID), 10), fieldName: "folder_id", tableName: "folder_packs", } syncDB := NewSyncDB() defer close(syncDB.errChan) InsertSimpleSliceParallel(syncDB, tx, f.Packs, relId) InsertSliceParallel(syncDB, tx, f.Folders, relId) return syncDB.Wait() } func (f *Folder) Insert(tx *sqlx.Tx, data *InsertId[string]) error { if data.query == "" { return ErrNoQuery } args := []any{data.id, f.Name, f.Sorting, f.Color} err := tx.QueryRow(data.query, args...).Scan(&f.ID) if err != nil { return err } return f.InsertObjects(tx) } func (f *Folder) InsertCtx(ctx context.Context, tx *sqlx.Tx, data *InsertId[string]) error { if data.query == "" { return ErrNoQuery } args := []any{data.id, f.Name, f.Sorting, f.Color} err := tx.QueryRowContext(ctx, data.query, args...).Scan(&f.ID) if err != nil { return err } return f.InsertObjects(tx) } type WorldFolder struct { ID string Name string Type string Folder string Sorting string Description string Color string Sort int Stats Stats // Flags any `json:"flags,omitempty"` }