connect_modernc.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	"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}