Preview BIRD-фрагменты в config_revision_preview; meta_json только счётчик префиксов. Co-authored-by: Cursor <[email protected]>
91 lines
2.4 KiB
Go
91 lines
2.4 KiB
Go
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
|
|
}
|