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 b374fd3..cfc1484 100644 --- a/src/golite.go +++ b/src/golite.go @@ -33,10 +33,8 @@ Premises: #include <stdlib.h> #include <sqlite3.h> -void callbackTrampoline(sqlite3_context*, int, sqlite3_value**); -void stepTrampoline(sqlite3_context*, int, sqlite3_value**); -void doneTrampoline(sqlite3_context*); - +void stepTrampoline(sqlite3_context*, int, sqlite3_value**); +void doneTrampoline(sqlite3_context*); int compareTrampoline(void*, int, char*, int, char*); int commitHookTrampoline(void*); void rollbackHookTrampoline(void*); @@ -111,6 +109,36 @@ func (b *SQLiteBackup) Close() error { return nil } +//export stepTrampoline +func stepTrampoline( + ctx *C.sqlite3_context, + argc C.int, + argv **C.sqlite3_value, +) { + const size = (math.MaxInt32 - 1) / + unsafe.Sizeof((*C.sqlite3_value)(nil)) + args := (*[size]*C.sqlite3_value)(unsafe.Pointer(argv)) + slice := args[:int(argc):int(argc)] + lookupHandle(C.sqlite3_user_data(ctx)).(*aggInfo).Step(ctx, slice) +} + +//export doneTrampoline +func doneTrampoline(ctx *C.sqlite3_context) { + lookupHandle(C.sqlite3_user_data(ctx)).(*aggInfo).Done(ctx) +} + +//export compareTrampoline +func compareTrampoline( + handlePtr unsafe.Pointer, + la C.int, + a *C.char, + lb C.int, + b *C.char, +) C.int { + cmpFn := lookupHandle(handlePtr).(func(string, string) int) + return C.int(cmpFn(C.GoStringN(a, la), C.GoStringN(b, lb))) +} + //export commitHookTrampoline func commitHookTrampoline(handle unsafe.Pointer) C.int { return C.int(lookupHandle(handle).(func() int)()) |