1//go:build !((darwin && (amd64 || arm64)) || (freebsd && (amd64 || arm64)) || (linux && (386 || amd64 || arm || arm64 || loong64 || ppc64le || riscv64 || s390x)) || (windows && (386 || amd64 || arm64)))
2
3package db
4
5import (
6 "database/sql"
7 "fmt"
8
9 "github.com/ncruces/go-sqlite3"
10 "github.com/ncruces/go-sqlite3/driver"
11 _ "github.com/ncruces/go-sqlite3/embed"
12)
13
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 {
27 for _, pragma := range pragmas {
28 if err := c.Exec(pragma); err != nil {
29 return fmt.Errorf("failed to set pragma %q: %w", pragma, err)
30 }
31 }
32 return nil
33 })
34 if err != nil {
35 return nil, fmt.Errorf("failed to open database: %w", err)
36 }
37 return db, nil
38}