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	for name, value := range pragmas {
18		params.Add("_pragma", fmt.Sprintf("%s(%s)", name, value))
19	}
20	// Use BEGIN IMMEDIATE so writers acquire the reserved lock up front,
21	// preventing deferred-to-writer upgrade deadlocks.
22	params.Set("_txlock", "immediate")
23
24	dsn := fmt.Sprintf("file:%s?%s", dbPath, params.Encode())
25	db, err := sql.Open("sqlite", dsn)
26	if err != nil {
27		return nil, fmt.Errorf("failed to open database: %w", err)
28	}
29
30	return db, nil
31}