File
Blob: kv/sqlite3/sqlite.go
| 1 | package sqlite3 |
| 2 | |
| 3 | import ( |
| 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 | |
| 15 | const sqliteMaxMemory = 64 * 1024 * 1024 |
| 16 | |
| 17 | type memoryLimitConnector struct { |
| 18 | sqldriver.Connector |
| 19 | max int64 |
| 20 | } |
| 21 | |
| 22 | func (c memoryLimitConnector) Connect(ctx context.Context) (sqldriver.Conn, error) { |
| 23 | return c.Connector.Connect(ncrsqlite3.WithMaxMemory(ctx, c.max)) |
| 24 | } |
| 25 | |
| 26 | func Initialize(cacheDir string) error { |
| 27 | _ = cacheDir |
| 28 | return nil |
| 29 | } |
| 30 | |
| 31 | func 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 | } |