package repository import ( "context" "encoding/json" "errors" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgconn" ) func revisionPreviewTableExists(ctx context.Context, q queryRower) bool { var n int err := q.QueryRow(ctx, ` SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'config_revision_preview' LIMIT 1`).Scan(&n) return err == nil } type queryRower interface { QueryRow(ctx context.Context, sql string, args ...any) pgx.Row } func loadRevisionPreview(ctx context.Context, q queryRower, revisionID string, metaPreview map[string]string) map[string]string { if revisionPreviewTableExists(ctx, q) { var raw []byte err := q.QueryRow(ctx, ` SELECT fragments FROM config_revision_preview WHERE revision_id = $1::uuid`, revisionID).Scan(&raw) if err == nil { out := map[string]string{} _ = json.Unmarshal(raw, &out) if out == nil { out = map[string]string{} } return out } if !errors.Is(err, pgx.ErrNoRows) { return metaPreview } } if metaPreview == nil { return map[string]string{} } return metaPreview } type execQuerier interface { queryRower Exec(ctx context.Context, sql string, arguments ...any) (pgconn.CommandTag, error) } func insertRevisionPreview(ctx context.Context, db execQuerier, revisionID string, preview map[string]string) error { if !revisionPreviewTableExists(ctx, db) { return nil } if preview == nil { preview = map[string]string{} } raw, err := json.Marshal(preview) if err != nil { return err } _, err = db.Exec(ctx, ` INSERT INTO config_revision_preview (revision_id, fragments) VALUES ($1::uuid, $2::jsonb) ON CONFLICT (revision_id) DO UPDATE SET fragments = EXCLUDED.fragments`, revisionID, string(raw)) return err } func copyRevisionPreview(ctx context.Context, db execQuerier, dstRevisionID, srcRevisionID string) error { if !revisionPreviewTableExists(ctx, db) { return nil } _, err := db.Exec(ctx, ` INSERT INTO config_revision_preview (revision_id, fragments) SELECT $1::uuid, fragments FROM config_revision_preview WHERE revision_id = $2::uuid ON CONFLICT (revision_id) DO UPDATE SET fragments = EXCLUDED.fragments`, dstRevisionID, srcRevisionID) return err } func revisionMetaWithoutPreview(materializedPrefixCount int) (string, error) { raw, err := json.Marshal(map[string]any{ "materialized_prefix_count": materializedPrefixCount, }) return string(raw), err }