From 126fd4e451a61db8a6b79b609ed54235d32aa761 Mon Sep 17 00:00:00 2001 From: Winter Date: Mon, 11 Aug 2025 18:21:43 -0400 Subject: [PATCH] */db: actually enable foreign keys Change-Id: zrzuvtwqqooklrooxvxlsqzrmnkvuytx `sql.DB` pools connections, which means that there's a good chance that our foreign keys aren't actually being enforced, unless a goroutine happens to be using the connection that was made when we set `pragma foreign_keys = 1`. Signed-off-by: Winter --- appview/db/db.go | 3 +-- cmd/punchcardPopulate/main.go | 2 +- eventconsumer/cursor/sqlite.go | 2 +- knotserver/db/init.go | 3 +-- rbac/rbac.go | 2 +- rbac/rbac_test.go | 2 +- spindle/db/db.go | 3 +-- spindle/secrets/sqlite.go | 2 +- 8 files changed, 8 insertions(+), 11 deletions(-) diff --git a/appview/db/db.go b/appview/db/db.go index e3b3d6e..61c7fb0 100644 --- a/appview/db/db.go +++ b/appview/db/db.go @@ -27,14 +27,13 @@ type Execer interface { } func Make(dbPath string) (*DB, error) { - db, err := sql.Open("sqlite3", dbPath) + db, err := sql.Open("sqlite3", dbPath+"?_foreign_keys=1") if err != nil { return nil, err } _, err = db.Exec(` pragma journal_mode = WAL; pragma synchronous = normal; - pragma foreign_keys = on; pragma temp_store = memory; pragma mmap_size = 30000000000; pragma page_size = 32768; diff --git a/cmd/punchcardPopulate/main.go b/cmd/punchcardPopulate/main.go index 244ddef..23ad90a 100644 --- a/cmd/punchcardPopulate/main.go +++ b/cmd/punchcardPopulate/main.go @@ -11,7 +11,7 @@ import ( ) func main() { - db, err := sql.Open("sqlite3", "./appview.db") + db, err := sql.Open("sqlite3", "./appview.db?_foreign_keys=1") if err != nil { log.Fatal("Failed to open database:", err) } diff --git a/eventconsumer/cursor/sqlite.go b/eventconsumer/cursor/sqlite.go index a6b815a..266fb99 100644 --- a/eventconsumer/cursor/sqlite.go +++ b/eventconsumer/cursor/sqlite.go @@ -21,7 +21,7 @@ func WithTableName(name string) SqliteStoreOpt { } func NewSQLiteStore(dbPath string, opts ...SqliteStoreOpt) (*SqliteStore, error) { - db, err := sql.Open("sqlite3", dbPath) + db, err := sql.Open("sqlite3", dbPath+"?_foreign_keys=1") if err != nil { return nil, fmt.Errorf("failed to open sqlite database: %w", err) } diff --git a/knotserver/db/init.go b/knotserver/db/init.go index d114533..b59ee0b 100644 --- a/knotserver/db/init.go +++ b/knotserver/db/init.go @@ -11,7 +11,7 @@ type DB struct { } func Setup(dbPath string) (*DB, error) { - db, err := sql.Open("sqlite3", dbPath) + db, err := sql.Open("sqlite3", dbPath+"?_foreign_keys=1") if err != nil { return nil, err } @@ -19,7 +19,6 @@ func Setup(dbPath string) (*DB, error) { _, err = db.Exec(` pragma journal_mode = WAL; pragma synchronous = normal; - pragma foreign_keys = on; pragma temp_store = memory; pragma mmap_size = 30000000000; pragma page_size = 32768; diff --git a/rbac/rbac.go b/rbac/rbac.go index a7fd5a0..2def55d 100644 --- a/rbac/rbac.go +++ b/rbac/rbac.go @@ -43,7 +43,7 @@ func NewEnforcer(path string) (*Enforcer, error) { return nil, err } - db, err := sql.Open("sqlite3", path) + db, err := sql.Open("sqlite3", path+"?_foreign_keys=1") if err != nil { return nil, err } diff --git a/rbac/rbac_test.go b/rbac/rbac_test.go index d2eba46..4c7252a 100644 --- a/rbac/rbac_test.go +++ b/rbac/rbac_test.go @@ -14,7 +14,7 @@ import ( ) func setup(t *testing.T) *rbac.Enforcer { - db, err := sql.Open("sqlite3", ":memory:") + db, err := sql.Open("sqlite3", ":memory:?_foreign_keys=1") assert.NoError(t, err) a, err := adapter.NewAdapter(db, "sqlite3", "acl") diff --git a/spindle/db/db.go b/spindle/db/db.go index 89be341..faa0b6b 100644 --- a/spindle/db/db.go +++ b/spindle/db/db.go @@ -11,7 +11,7 @@ type DB struct { } func Make(dbPath string) (*DB, error) { - db, err := sql.Open("sqlite3", dbPath) + db, err := sql.Open("sqlite3", dbPath+"?_foreign_keys=1") if err != nil { return nil, err } @@ -19,7 +19,6 @@ func Make(dbPath string) (*DB, error) { _, err = db.Exec(` pragma journal_mode = WAL; pragma synchronous = normal; - pragma foreign_keys = on; pragma temp_store = memory; pragma mmap_size = 30000000000; pragma page_size = 32768; diff --git a/spindle/secrets/sqlite.go b/spindle/secrets/sqlite.go index f514c39..c74fcde 100644 --- a/spindle/secrets/sqlite.go +++ b/spindle/secrets/sqlite.go @@ -24,7 +24,7 @@ func WithTableName(name string) SqliteManagerOpt { } func NewSQLiteManager(dbPath string, opts ...SqliteManagerOpt) (*SqliteManager, error) { - db, err := sql.Open("sqlite3", dbPath) + db, err := sql.Open("sqlite3", dbPath+"?_foreign_keys=1") if err != nil { return nil, fmt.Errorf("failed to open sqlite database: %w", err) } -- 2.43.0