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]>
35 lines
1.6 KiB
Go
35 lines
1.6 KiB
Go
package sqlite
|
|
|
|
// Commit-hook surface — one API, two backends (selected by build tag).
|
|
//
|
|
// A SQLite commit hook fires inside the engine at COMMIT time; returning a
|
|
// non-zero value aborts the transaction (SQLite rolls it back and surfaces
|
|
// SQLITE_BUSY). Hanzo Base uses it to capture per-transaction WAL frames for
|
|
// cross-pod replication + point-in-time recovery.
|
|
//
|
|
// The two backends expose DIFFERENT native callback signatures:
|
|
//
|
|
// modernc (!cgo): RegisterCommitHook(func() int32)
|
|
// mattn (cgo): RegisterCommitHook(func() int)
|
|
//
|
|
// so a consumer cannot type-assert a raw driver connection against one shared
|
|
// interface (interface satisfaction needs identical method signatures, and each
|
|
// backend's method takes its OWN function type). CommitHookRegisterer bridges
|
|
// that: it type-asserts the concrete backend conn under the active build tag
|
|
// (hooks_cgo.go / hooks_nocgo.go) and returns an adapter speaking the single
|
|
// CommitHookFn shape below. Consumers import ONLY this package.
|
|
|
|
// CommitHookFn is a commit-hook callback. Returning a non-zero value ABORTS the
|
|
// commit (SQLite rolls back and reports SQLITE_BUSY); returning zero lets it
|
|
// proceed. This is the one callback type consumers use regardless of backend —
|
|
// the build-tagged adapter converts it to the backend's native signature.
|
|
type CommitHookFn func() int32
|
|
|
|
// HookRegisterer installs a commit hook on a driver connection. Values
|
|
// satisfying it are produced by CommitHookRegisterer, never by asserting a raw
|
|
// backend conn directly (see the note above). Passing a nil CommitHookFn clears
|
|
// any installed hook.
|
|
type HookRegisterer interface {
|
|
RegisterCommitHook(CommitHookFn)
|
|
}
|