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 "net/url"
9
10 _ "modernc.org/sqlite"
11)
12
13func openDB(dbPath string) (*sql.DB, error) {
14 // Set pragmas for better performance via _pragma query params.
15 // Format: _pragma=name(value)
16 params := url.Values{}
17 params.Add("_pragma", "foreign_keys(on)")
18 params.Add("_pragma", "journal_mode(WAL)")
19 params.Add("_pragma", "page_size(4096)")
20 params.Add("_pragma", "cache_size(-8000)")
21 params.Add("_pragma", "synchronous(NORMAL)")
22 params.Add("_pragma", "secure_delete(on)")
23 params.Add("_pragma", "busy_timeout(5000)")
24
25 dsn := fmt.Sprintf("file:%s?%s", dbPath, params.Encode())
26 db, err := sql.Open("sqlite", dsn)
27 if err != nil {
28 return nil, fmt.Errorf("failed to open database: %w", err)
29 }
30 return db, nil
31}