diff --git a/util/dbutil/database.go b/util/dbutil/database.go index a09cbeec..3e105fd8 100644 --- a/util/dbutil/database.go +++ b/util/dbutil/database.go @@ -40,7 +40,7 @@ func ParseDialect(engine string) (Dialect, error) { switch strings.ToLower(engine) { case "postgres", "postgresql": return Postgres, nil - case "sqlite3", "sqlite", "litestream": + case "sqlite3", "sqlite", "litestream", "sqlite3-fk-wal": return SQLite, nil default: return DialectUnknown, fmt.Errorf("unknown dialect '%s'", engine) diff --git a/util/dbutil/litestream/register.go b/util/dbutil/litestream/register.go index 29834058..429372a6 100644 --- a/util/dbutil/litestream/register.go +++ b/util/dbutil/litestream/register.go @@ -31,4 +31,25 @@ func init() { return }, }) + + sql.Register("sqlite3-fk-wal", &sqlite3.SQLiteDriver{ + ConnectHook: func(conn *sqlite3.SQLiteConn) (err error) { + if err = conn.SetFileControlInt("main", sqlite3.SQLITE_FCNTL_PERSIST_WAL, 1); err != nil { + return + } + if _, err = conn.Exec("PRAGMA foreign_keys = ON", []driver.Value{}); err != nil { + return + } + if _, err = conn.Exec("PRAGMA journal_mode = WAL", []driver.Value{}); err != nil { + return + } + if _, err = conn.Exec("PRAGMA synchronous = NORMAL", []driver.Value{}); err != nil { + return + } + if _, err = conn.Exec("PRAGMA busy_timeout = 5000", []driver.Value{}); err != nil { + return + } + return + }, + }) }