Skip to content
File

Blob: kv/sqlite3/sqlite.go

go48 lines
1package sqlite3
2 
3import (
4 "context"
5 "database/sql"
6 sqldriver "database/sql/driver"
7 "fmt"
8 
9 ncrsqlite3 "github.com/ncruces/go-sqlite3"
10 ncrdriver "github.com/ncruces/go-sqlite3/driver"
11 "github.com/ncruces/go-sqlite3/vfs"
12 "go.uber.org/zap"
13)
14 
15const sqliteMaxMemory = 64 * 1024 * 1024
16 
17type memoryLimitConnector struct {
18 sqldriver.Connector
19 max int64
20}
21 
22func (c memoryLimitConnector) Connect(ctx context.Context) (sqldriver.Conn, error) {
23 return c.Connector.Connect(ncrsqlite3.WithMaxMemory(ctx, c.max))
24}
25 
26func Initialize(cacheDir string) error {
27 _ = cacheDir
28 return nil
29}
30 
31func openSQLite(logger *zap.Logger, dbPath string) (*sql.DB, error) {
32 logger.Info("SQLite via wasm2go",
33 zap.Int("maxMemory", sqliteMaxMemory),
34 zap.Bool("lock", vfs.SupportsFileLocking),
35 zap.Bool("shm", vfs.SupportsSharedMemory),
36 )
37 
38 dsn := fmt.Sprintf("file:%s?_pragma=journal_mode(WAL)&_pragma=foreign_keys(1)&_pragma=busy_timeout(5000)&_pragma=synchronous(1)&_txlock=immediate", dbPath)
39 connector, err := (&ncrdriver.SQLite{}).OpenConnector(dsn)
40 if err != nil {
41 return nil, err
42 }
43 return sql.OpenDB(memoryLimitConnector{
44 Connector: connector,
45 max: sqliteMaxMemory,
46 }), nil
47}