mirror of
https://github.com/hanzoai/sqlite.git
synced 2026-10-30 18:22:26 +00:00
Adds the surface Hanzo Base needs to import ONLY github.com/hanzoai/sqlite and
never register modernc.org/sqlite directly — so a CGO consumer that needs
SQLCipher (commerce's per-tenant money DBs) no longer hits `panic: sql: Register
called twice for driver sqlite` from base's modernc registration colliding with
hanzoai/sqlite's mattn one. Complements the v0.1.5 sqlite_purego opt-out, which
serves the other case (a pure-Go cgo consumer wanting neither SQLCipher nor to
drop modernc); commerce needs SQLCipher, so it takes THIS path.
- hooks.go + hooks_{cgo,nocgo}.go: CommitHookRegisterer bridges the backends'
divergent native commit-hook signatures (mattn func() int / modernc func()
int32) to one CommitHookFn. Same cgo&&!sqlite_purego / !cgo||sqlite_purego
split as the drivers, so all four tag/cgo combos stay exclusive + exhaustive.
- pragma.go + pragma_{cgo,nocgo}.go: PragmaDSN + DefaultPragmas encode one pragma
set in the ACTIVE backend's DSN syntax (mattn _name=value / modernc
_pragma=name(value)); a single-form DSN is silently ignored by the other
backend, so busy_timeout/WAL would otherwise not apply when the binary is built
for the other backend.
- hooks_test.go + pragma_test.go: prove (all pure-Go combos) the hook
fires/aborts/clears and the pragmas take effect (journal_mode=WAL,
busy_timeout=10000, FK=ON).
Exactly one "sqlite" registration per build preserved (drivers unchanged);
encrypted-at-rest path untouched.
Co-authored-by: Hanzo Dev <[email protected]>
30 lines
929 B
Go
30 lines
929 B
Go
//go:build !cgo || sqlite_purego
|
|
|
|
package sqlite
|
|
|
|
import modernc "modernc.org/sqlite"
|
|
|
|
// CommitHookRegisterer adapts a raw modernc driver connection (obtained from
|
|
// (*sql.Conn).Raw) to HookRegisterer. modernc's *conn satisfies
|
|
// modernc.HookRegisterer; its native commit-hook type modernc.CommitHookFn is
|
|
// `func() int32` — identical underlying shape to our CommitHookFn — so the
|
|
// bridge is a direct type conversion. Returns (nil, false) if driverConn is not
|
|
// a modernc connection (wrong driver, or a wrapped conn).
|
|
func CommitHookRegisterer(driverConn any) (HookRegisterer, bool) {
|
|
c, ok := driverConn.(modernc.HookRegisterer)
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
return moderncHook{c}, true
|
|
}
|
|
|
|
type moderncHook struct{ c modernc.HookRegisterer }
|
|
|
|
func (m moderncHook) RegisterCommitHook(cb CommitHookFn) {
|
|
if cb == nil {
|
|
m.c.RegisterCommitHook(nil)
|
|
return
|
|
}
|
|
m.c.RegisterCommitHook(modernc.CommitHookFn(cb))
|
|
}
|