@@ -234,14 +234,28 @@ func Backup(ctx context.Context, srcPath, destPath string) (err error) {
234
234
return backupDB (ctx , src , destPath )
235
235
}
236
236
237
- func integrityCheck (db * sql.DB , log * zap.Logger ) error {
238
- rows , err := db .Query ("PRAGMA integrity_check" )
237
+ // IntegrityCheck runs a PRAGMA integrity_check on the database and logs any
238
+ // integrity errors. If any errors are found, an error is returned.
239
+ func IntegrityCheck (ctx context.Context , fp string , log * zap.Logger ) error {
240
+ db , err := sql .Open ("sqlite3" , sqliteFilepath (fp ))
241
+ if err != nil {
242
+ return fmt .Errorf ("failed to open database: %w" , err )
243
+ }
244
+ defer db .Close ()
245
+
246
+ rows , err := db .QueryContext (ctx , "PRAGMA integrity_check" )
239
247
if err != nil {
240
248
return fmt .Errorf ("failed to run integrity check: %w" , err )
241
249
}
242
250
defer rows .Close ()
243
251
var hasErrors bool
244
252
for rows .Next () {
253
+ select {
254
+ case <- ctx .Done ():
255
+ return ctx .Err ()
256
+ default :
257
+ }
258
+
245
259
var result string
246
260
if err := rows .Scan (& result ); err != nil {
247
261
return fmt .Errorf ("failed to scan integrity check result: %w" , err )
@@ -258,41 +272,29 @@ func integrityCheck(db *sql.DB, log *zap.Logger) error {
258
272
return nil
259
273
}
260
274
261
- func dbForeignKeyCheck (db * sql.DB , log * zap.Logger ) error {
262
- rows , err := db .Query ("PRAGMA foreign_key_check" )
275
+ // ForeignKeyCheck runs a PRAGMA foreign_key_check on the database and logs any
276
+ // foreign key constraint violations. If any violations are found, an error is
277
+ // returned.
278
+ func ForeignKeyCheck (ctx context.Context , fp string , log * zap.Logger ) error {
279
+ db , err := sql .Open ("sqlite3" , sqliteFilepath (fp ))
263
280
if err != nil {
264
- return fmt .Errorf ("failed to run foreign key check : %w" , err )
281
+ return fmt .Errorf ("failed to open database : %w" , err )
265
282
}
266
- defer rows .Close ()
267
- var hasErrors bool
268
- for rows .Next () {
269
- var table string
270
- var rowid sql.NullInt64
271
- var fkTable string
272
- var fkRowid sql.NullInt64
283
+ defer db .Close ()
273
284
274
- if err := rows .Scan (& table , & rowid , & fkTable , & fkRowid ); err != nil {
275
- return fmt .Errorf ("failed to scan foreign key check result: %w" , err )
276
- }
277
- hasErrors = true
278
- log .Error ("foreign key constraint violated" , zap .String ("table" , table ), zap .Int64 ("rowid" , rowid .Int64 ), zap .String ("fkTable" , fkTable ), zap .Int64 ("fkRowid" , fkRowid .Int64 ))
279
- }
280
- if err := rows .Err (); err != nil {
281
- return fmt .Errorf ("failed to iterate foreign key check results: %w" , err )
282
- } else if hasErrors {
283
- return errors .New ("foreign key constraint violated" )
284
- }
285
- return nil
286
- }
287
-
288
- func foreignKeyCheck (txn * txn , log * zap.Logger ) error {
289
- rows , err := txn .Query ("PRAGMA foreign_key_check" )
285
+ rows , err := db .QueryContext (ctx , "PRAGMA foreign_key_check" )
290
286
if err != nil {
291
287
return fmt .Errorf ("failed to run foreign key check: %w" , err )
292
288
}
293
289
defer rows .Close ()
294
290
var hasErrors bool
295
291
for rows .Next () {
292
+ select {
293
+ case <- ctx .Done ():
294
+ return ctx .Err ()
295
+ default :
296
+ }
297
+
296
298
var table string
297
299
var rowid sql.NullInt64
298
300
var fkTable string
@@ -325,10 +327,6 @@ func OpenDatabase(fp string, log *zap.Logger) (*Store, error) {
325
327
}
326
328
if err := store .init (); err != nil {
327
329
return nil , err
328
- } else if err := dbForeignKeyCheck (db , log .Named ("foreignkeys" )); err != nil {
329
- return nil , fmt .Errorf ("foreign key check failed: %w" , err )
330
- } else if err := integrityCheck (db , log .Named ("integrity" )); err != nil {
331
- return nil , fmt .Errorf ("integrity check failed: %w" , err )
332
330
}
333
331
sqliteVersion , _ , _ := sqlite3 .Version ()
334
332
log .Debug ("database initialized" , zap .String ("sqliteVersion" , sqliteVersion ), zap .Int ("schemaVersion" , len (migrations )+ 1 ), zap .String ("path" , fp ))
0 commit comments