on main help sign in
fix(sqlite): increase busy timeout (#2181)
48157c6Carlos Alexandro Becker
internal/db/connect.go+10
@@ -10,6 +10,16 @@ import (
10 "github.com/pressly/goose/v3"
10 "github.com/pressly/goose/v3"
11)
11)
12
12
13+var pragmas = map[string]string{
14+ "foreign_keys": "ON",
15+ "journal_mode": "WAL",
16+ "page_size": "4096",
17+ "cache_size": "-8000",
18+ "synchronous": "NORMAL",
19+ "secure_delete": "ON",
20+ "busy_timeout": "30000",
21+}
22+
13// Connect opens a SQLite database connection and runs migrations.
23// Connect opens a SQLite database connection and runs migrations.
14func Connect(ctx context.Context, dataDir string) (*sql.DB, error) {
24func Connect(ctx context.Context, dataDir string) (*sql.DB, error) {
15 if dataDir == "" {
25 if dataDir == "" {
internal/db/connect_modernc.go+4−7
@@ -14,18 +14,15 @@ func openDB(dbPath string) (*sql.DB, error) {
14 // Set pragmas for better performance via _pragma query params.
14 // Set pragmas for better performance via _pragma query params.
15 // Format: _pragma=name(value)
15 // Format: _pragma=name(value)
16 params := url.Values{}
16 params := url.Values{}
17− params.Add("_pragma", "foreign_keys(on)")
17+ for name, value := range pragmas {
18− params.Add("_pragma", "journal_mode(WAL)")
19− params.Add("_pragma", "page_size(4096)")
18+ params.Add("_pragma", fmt.Sprintf("%s(%s)", name, value))
20− params.Add("_pragma", "cache_size(-8000)")
19+ }
21− params.Add("_pragma", "synchronous(NORMAL)")
22− params.Add("_pragma", "secure_delete(on)")
23− params.Add("_pragma", "busy_timeout(5000)")
24
20
25 dsn := fmt.Sprintf("file:%s?%s", dbPath, params.Encode())
21 dsn := fmt.Sprintf("file:%s?%s", dbPath, params.Encode())
26 db, err := sql.Open("sqlite", dsn)
22 db, err := sql.Open("sqlite", dsn)
27 if err != nil {
23 if err != nil {
28 return nil, fmt.Errorf("failed to open database: %w", err)
24 return nil, fmt.Errorf("failed to open database: %w", err)
29 }
25 }
26+
30 return db, nil
27 return db, nil
31}
28}
internal/db/connect_ncruces.go+6−14
@@ -12,21 +12,12 @@ import (
12)
12)
13
13
14func openDB(dbPath string) (*sql.DB, error) {
14func openDB(dbPath string) (*sql.DB, error) {
15− // Set pragmas for better performance.
16− pragmas := []string{
17− "PRAGMA foreign_keys = ON;",
18− "PRAGMA journal_mode = WAL;",
19− "PRAGMA page_size = 4096;",
20− "PRAGMA cache_size = -8000;",
21− "PRAGMA synchronous = NORMAL;",
22− "PRAGMA secure_delete = ON;",
23− "PRAGMA busy_timeout = 5000;",
24− }
25−
26 db, err := driver.Open(dbPath, func(c *sqlite3.Conn) error {
15 db, err := driver.Open(dbPath, func(c *sqlite3.Conn) error {
16+ // Set pragmas for better performance via _pragma query params.
17+ // Format: PRAGMA name = value;
27− for _, pragma := range pragmas {
18+ for name, value := range pragmas {
28− if err := c.Exec(pragma); err != nil {
19+ if err := c.Exec(fmt.Sprintf("PRAGMA %s = %s;", name, value)); err != nil {
29− return fmt.Errorf("failed to set pragma %q: %w", pragma, err)
20+ return fmt.Errorf("failed to set pragma %q: %w", name, err)
30 }
21 }
31 }
22 }
32 return nil
23 return nil
@@ -34,5 +25,6 @@ func openDB(dbPath string) (*sql.DB, error) {
34 if err != nil {
25 if err != nil {
35 return nil, fmt.Errorf("failed to open database: %w", err)
26 return nil, fmt.Errorf("failed to open database: %w", err)
36 }
27 }
28+
37 return db, nil
29 return db, nil
38}
30}