From 9be3a3d8072be87190ae17c7208ea263f73976ac Mon Sep 17 00:00:00 2001 From: Nathan Coad Date: Wed, 14 Jan 2026 18:01:57 +1100 Subject: [PATCH] more sql consolidation [CI SKIP] --- db/helpers.go | 23 +++++++++++++++++++++++ internal/tasks/inventorySnapshots.go | 10 +--------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/db/helpers.go b/db/helpers.go index 027b23d..4e4f7ce 100644 --- a/db/helpers.go +++ b/db/helpers.go @@ -238,6 +238,29 @@ func EnsureSnapshotTable(ctx context.Context, dbConn *sqlx.DB, tableName string) return err } +// BackfillSerialColumn sets missing values in a serial-like column for Postgres tables. +func BackfillSerialColumn(ctx context.Context, dbConn *sqlx.DB, tableName, columnName string) error { + if err := ValidateTableName(tableName); err != nil { + return err + } + if columnName == "" { + return fmt.Errorf("column name is empty") + } + query := fmt.Sprintf( + `UPDATE %s SET "%s" = nextval(pg_get_serial_sequence('%s','%s')) WHERE "%s" IS NULL`, + tableName, columnName, tableName, columnName, columnName, + ) + _, err := dbConn.ExecContext(ctx, query) + if err != nil { + errText := strings.ToLower(err.Error()) + if strings.Contains(errText, "pg_get_serial_sequence") || strings.Contains(errText, "sequence") { + return nil + } + return err + } + return nil +} + // BuildDailySummaryInsert returns the SQL to aggregate hourly snapshots into a daily summary table. func BuildDailySummaryInsert(tableName string, unionQuery string) (string, error) { if _, err := SafeTableName(tableName); err != nil { diff --git a/internal/tasks/inventorySnapshots.go b/internal/tasks/inventorySnapshots.go index d2eec7c..72de0cb 100644 --- a/internal/tasks/inventorySnapshots.go +++ b/internal/tasks/inventorySnapshots.go @@ -604,15 +604,7 @@ func ensureSnapshotRowID(ctx context.Context, dbConn *sqlx.DB, tableName string) return err } } - _, err = dbConn.ExecContext(ctx, fmt.Sprintf( - `UPDATE %s SET "RowId" = nextval(pg_get_serial_sequence('%s','RowId')) WHERE "RowId" IS NULL`, - tableName, tableName, - )) - if err != nil { - errText := strings.ToLower(err.Error()) - if strings.Contains(errText, "pg_get_serial_sequence") || strings.Contains(errText, "sequence") { - return nil - } + if err := db.BackfillSerialColumn(ctx, dbConn, tableName, "RowId"); err != nil { return err } case "sqlite":