From a015408486564d22b6028c97128c3987c2687f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Wed, 18 Sep 2024 10:16:56 +0200 Subject: [PATCH] Manager: convert foreign key integrity check to sqlc Ref: #104305 --- internal/manager/persistence/integrity.go | 17 ++------- .../manager/persistence/sqlc/integrity.go | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/internal/manager/persistence/integrity.go b/internal/manager/persistence/integrity.go index 61dd336c..e16ec45d 100644 --- a/internal/manager/persistence/integrity.go +++ b/internal/manager/persistence/integrity.go @@ -16,13 +16,6 @@ const ( integrityCheckTimeout = 10 * time.Second ) -type PragmaForeignKeyCheckResult struct { - Table string `gorm:"column:table"` - RowID int `gorm:"column:rowid"` - Parent string `gorm:"column:parent"` - FKID int `gorm:"column:fkid"` -} - // PeriodicIntegrityCheck periodically checks the database integrity. // This function only returns when the context is done. func (db *DB) PeriodicIntegrityCheck( @@ -127,13 +120,11 @@ func (db *DB) pragmaIntegrityCheck(ctx context.Context) (ok bool) { // // See https: //www.sqlite.org/pragma.html#pragma_foreign_key_check func (db *DB) pragmaForeignKeyCheck(ctx context.Context) (ok bool) { - var issues []PragmaForeignKeyCheckResult + queries := db.queries() - tx := db.gormDB.WithContext(ctx). - Raw("PRAGMA foreign_key_check"). - Scan(&issues) - if tx.Error != nil { - log.Error().Err(tx.Error).Msg("database: error checking foreign keys") + issues, err := queries.PragmaForeignKeyCheck(ctx) + if err != nil { + log.Error().Err(err).Msg("database: error checking foreign keys") return false } diff --git a/internal/manager/persistence/sqlc/integrity.go b/internal/manager/persistence/sqlc/integrity.go index e412a2d7..0ec345ed 100644 --- a/internal/manager/persistence/sqlc/integrity.go +++ b/internal/manager/persistence/sqlc/integrity.go @@ -63,3 +63,40 @@ func (q *Queries) PragmaForeignKeysGet(ctx context.Context) (bool, error) { err := row.Scan(&fkEnabled) return fkEnabled, err } + +const pragmaForeignKeyCheck = `PRAGMA foreign_key_check` + +type PragmaForeignKeyCheckResult struct { + Table string + RowID int + Parent string + FKID int +} + +func (q *Queries) PragmaForeignKeyCheck(ctx context.Context) ([]PragmaForeignKeyCheckResult, error) { + rows, err := q.db.QueryContext(ctx, pragmaForeignKeyCheck) + if err != nil { + return nil, err + } + defer rows.Close() + var items []PragmaForeignKeyCheckResult + for rows.Next() { + var i PragmaForeignKeyCheckResult + if err := rows.Scan( + &i.Table, + &i.RowID, + &i.Parent, + &i.FKID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +}