diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/golite.go | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/golite.go b/src/golite.go index 7c280a0..00cbbc7 100644 --- a/src/golite.go +++ b/src/golite.go @@ -453,6 +453,32 @@ func (b *SQLiteBackup) Close() error { return nil } +//export commitHookTrampoline +func commitHookTrampoline(handle unsafe.Pointer) C.int { + return C.int(lookupHandle(handle).(func() int)()) +} + +//export rollbackHookTrampoline +func rollbackHookTrampoline(handle unsafe.Pointer) { + lookupHandle(handle).(func())() +} + +//export updateHookTrampoline +func updateHookTrampoline( + handle unsafe.Pointer, + op C.int, + db *C.char, + table *C.char, + rowid int64, +) { + lookupHandle(handle).(func(int, string, string, int64))( + int(op), + C.GoString(db), + C.GoString(table), + int64(rowid), + ) +} + // Use handles to avoid passing Go pointers to C. type handleVal struct { db *SQLiteConn @@ -463,14 +489,16 @@ var handleLock sync.Mutex var handleVals = make(map[unsafe.Pointer]handleVal) func newHandle(db *SQLiteConn, v any) unsafe.Pointer { - handleLock.Lock() - defer handleLock.Unlock() val := handleVal{db: db, val: v} - var p unsafe.Pointer = C.malloc(C.size_t(1)) + p := C.malloc(C.size_t(1)) if p == nil { panic("can't allocate 'cgo-pointer hack index pointer': ptr == nil") } - handleVals[p] = val + { + handleLock.Lock() + defer handleLock.Unlock() + handleVals[p] = val + } return p } |