connect_ncruces.go

 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}