Use go-pointer instead of uintptr hacks. (#814)
* Use go-pointer instead of uintptr hacks. Fixes #791 * Do same of go-pointer * Drop older verion of Go * Fix build * Fix build
This commit is contained in:
50
callback.go
50
callback.go
@@ -35,56 +35,55 @@ import (
|
|||||||
//export callbackTrampoline
|
//export callbackTrampoline
|
||||||
func callbackTrampoline(ctx *C.sqlite3_context, argc int, argv **C.sqlite3_value) {
|
func callbackTrampoline(ctx *C.sqlite3_context, argc int, argv **C.sqlite3_value) {
|
||||||
args := (*[(math.MaxInt32 - 1) / unsafe.Sizeof((*C.sqlite3_value)(nil))]*C.sqlite3_value)(unsafe.Pointer(argv))[:argc:argc]
|
args := (*[(math.MaxInt32 - 1) / unsafe.Sizeof((*C.sqlite3_value)(nil))]*C.sqlite3_value)(unsafe.Pointer(argv))[:argc:argc]
|
||||||
fi := lookupHandle(uintptr(C.sqlite3_user_data(ctx))).(*functionInfo)
|
fi := lookupHandle(C.sqlite3_user_data(ctx)).(*functionInfo)
|
||||||
fi.Call(ctx, args)
|
fi.Call(ctx, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export stepTrampoline
|
//export stepTrampoline
|
||||||
func stepTrampoline(ctx *C.sqlite3_context, argc C.int, argv **C.sqlite3_value) {
|
func stepTrampoline(ctx *C.sqlite3_context, argc C.int, argv **C.sqlite3_value) {
|
||||||
args := (*[(math.MaxInt32 - 1) / unsafe.Sizeof((*C.sqlite3_value)(nil))]*C.sqlite3_value)(unsafe.Pointer(argv))[:int(argc):int(argc)]
|
args := (*[(math.MaxInt32 - 1) / unsafe.Sizeof((*C.sqlite3_value)(nil))]*C.sqlite3_value)(unsafe.Pointer(argv))[:int(argc):int(argc)]
|
||||||
ai := lookupHandle(uintptr(C.sqlite3_user_data(ctx))).(*aggInfo)
|
ai := lookupHandle(C.sqlite3_user_data(ctx)).(*aggInfo)
|
||||||
ai.Step(ctx, args)
|
ai.Step(ctx, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export doneTrampoline
|
//export doneTrampoline
|
||||||
func doneTrampoline(ctx *C.sqlite3_context) {
|
func doneTrampoline(ctx *C.sqlite3_context) {
|
||||||
handle := uintptr(C.sqlite3_user_data(ctx))
|
ai := lookupHandle(C.sqlite3_user_data(ctx)).(*aggInfo)
|
||||||
ai := lookupHandle(handle).(*aggInfo)
|
|
||||||
ai.Done(ctx)
|
ai.Done(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export compareTrampoline
|
//export compareTrampoline
|
||||||
func compareTrampoline(handlePtr uintptr, la C.int, a *C.char, lb C.int, b *C.char) C.int {
|
func compareTrampoline(handlePtr unsafe.Pointer, la C.int, a *C.char, lb C.int, b *C.char) C.int {
|
||||||
cmp := lookupHandle(handlePtr).(func(string, string) int)
|
cmp := lookupHandle(handlePtr).(func(string, string) int)
|
||||||
return C.int(cmp(C.GoStringN(a, la), C.GoStringN(b, lb)))
|
return C.int(cmp(C.GoStringN(a, la), C.GoStringN(b, lb)))
|
||||||
}
|
}
|
||||||
|
|
||||||
//export commitHookTrampoline
|
//export commitHookTrampoline
|
||||||
func commitHookTrampoline(handle uintptr) int {
|
func commitHookTrampoline(handle unsafe.Pointer) int {
|
||||||
callback := lookupHandle(handle).(func() int)
|
callback := lookupHandle(handle).(func() int)
|
||||||
return callback()
|
return callback()
|
||||||
}
|
}
|
||||||
|
|
||||||
//export rollbackHookTrampoline
|
//export rollbackHookTrampoline
|
||||||
func rollbackHookTrampoline(handle uintptr) {
|
func rollbackHookTrampoline(handle unsafe.Pointer) {
|
||||||
callback := lookupHandle(handle).(func())
|
callback := lookupHandle(handle).(func())
|
||||||
callback()
|
callback()
|
||||||
}
|
}
|
||||||
|
|
||||||
//export updateHookTrampoline
|
//export updateHookTrampoline
|
||||||
func updateHookTrampoline(handle uintptr, op int, db *C.char, table *C.char, rowid int64) {
|
func updateHookTrampoline(handle unsafe.Pointer, op int, db *C.char, table *C.char, rowid int64) {
|
||||||
callback := lookupHandle(handle).(func(int, string, string, int64))
|
callback := lookupHandle(handle).(func(int, string, string, int64))
|
||||||
callback(op, C.GoString(db), C.GoString(table), rowid)
|
callback(op, C.GoString(db), C.GoString(table), rowid)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export authorizerTrampoline
|
//export authorizerTrampoline
|
||||||
func authorizerTrampoline(handle uintptr, op int, arg1 *C.char, arg2 *C.char, arg3 *C.char) int {
|
func authorizerTrampoline(handle unsafe.Pointer, op int, arg1 *C.char, arg2 *C.char, arg3 *C.char) int {
|
||||||
callback := lookupHandle(handle).(func(int, string, string, string) int)
|
callback := lookupHandle(handle).(func(int, string, string, string) int)
|
||||||
return callback(op, C.GoString(arg1), C.GoString(arg2), C.GoString(arg3))
|
return callback(op, C.GoString(arg1), C.GoString(arg2), C.GoString(arg3))
|
||||||
}
|
}
|
||||||
|
|
||||||
//export preUpdateHookTrampoline
|
//export preUpdateHookTrampoline
|
||||||
func preUpdateHookTrampoline(handle uintptr, dbHandle uintptr, op int, db *C.char, table *C.char, oldrowid int64, newrowid int64) {
|
func preUpdateHookTrampoline(handle unsafe.Pointer, dbHandle uintptr, op int, db *C.char, table *C.char, oldrowid int64, newrowid int64) {
|
||||||
hval := lookupHandleVal(handle)
|
hval := lookupHandleVal(handle)
|
||||||
data := SQLitePreUpdateData{
|
data := SQLitePreUpdateData{
|
||||||
Conn: hval.db,
|
Conn: hval.db,
|
||||||
@@ -105,33 +104,27 @@ type handleVal struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var handleLock sync.Mutex
|
var handleLock sync.Mutex
|
||||||
var handleVals = make(map[uintptr]handleVal)
|
var handleVals = make(map[unsafe.Pointer]handleVal)
|
||||||
var handleIndex uintptr = 100
|
|
||||||
|
|
||||||
func newHandle(db *SQLiteConn, v interface{}) uintptr {
|
func newHandle(db *SQLiteConn, v interface{}) unsafe.Pointer {
|
||||||
handleLock.Lock()
|
handleLock.Lock()
|
||||||
defer handleLock.Unlock()
|
defer handleLock.Unlock()
|
||||||
i := handleIndex
|
val := handleVal{db: db, val: v}
|
||||||
handleIndex++
|
var p unsafe.Pointer = C.malloc(C.size_t(1))
|
||||||
handleVals[i] = handleVal{db, v}
|
if p == nil {
|
||||||
return i
|
panic("can't allocate 'cgo-pointer hack index pointer': ptr == nil")
|
||||||
|
}
|
||||||
|
handleVals[p] = val
|
||||||
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
func lookupHandleVal(handle uintptr) handleVal {
|
func lookupHandleVal(handle unsafe.Pointer) handleVal {
|
||||||
handleLock.Lock()
|
handleLock.Lock()
|
||||||
defer handleLock.Unlock()
|
defer handleLock.Unlock()
|
||||||
r, ok := handleVals[handle]
|
return handleVals[handle]
|
||||||
if !ok {
|
|
||||||
if handle >= 100 && handle < handleIndex {
|
|
||||||
panic("deleted handle")
|
|
||||||
} else {
|
|
||||||
panic("invalid handle")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func lookupHandle(handle uintptr) interface{} {
|
func lookupHandle(handle unsafe.Pointer) interface{} {
|
||||||
return lookupHandleVal(handle).val
|
return lookupHandleVal(handle).val
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,6 +134,7 @@ func deleteHandles(db *SQLiteConn) {
|
|||||||
for handle, val := range handleVals {
|
for handle, val := range handleVals {
|
||||||
if val.db == db {
|
if val.db == db {
|
||||||
delete(handleVals, handle)
|
delete(handleVals, handle)
|
||||||
|
C.free(handle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
sqlite3.go
14
sqlite3.go
@@ -473,7 +473,7 @@ func (c *SQLiteConn) RegisterCollation(name string, cmp func(string, string) int
|
|||||||
handle := newHandle(c, cmp)
|
handle := newHandle(c, cmp)
|
||||||
cname := C.CString(name)
|
cname := C.CString(name)
|
||||||
defer C.free(unsafe.Pointer(cname))
|
defer C.free(unsafe.Pointer(cname))
|
||||||
rv := C.sqlite3_create_collation(c.db, cname, C.SQLITE_UTF8, unsafe.Pointer(handle), (*[0]byte)(unsafe.Pointer(C.compareTrampoline)))
|
rv := C.sqlite3_create_collation(c.db, cname, C.SQLITE_UTF8, handle, (*[0]byte)(unsafe.Pointer(C.compareTrampoline)))
|
||||||
if rv != C.SQLITE_OK {
|
if rv != C.SQLITE_OK {
|
||||||
return c.lastError()
|
return c.lastError()
|
||||||
}
|
}
|
||||||
@@ -491,7 +491,7 @@ func (c *SQLiteConn) RegisterCommitHook(callback func() int) {
|
|||||||
if callback == nil {
|
if callback == nil {
|
||||||
C.sqlite3_commit_hook(c.db, nil, nil)
|
C.sqlite3_commit_hook(c.db, nil, nil)
|
||||||
} else {
|
} else {
|
||||||
C.sqlite3_commit_hook(c.db, (*[0]byte)(C.commitHookTrampoline), unsafe.Pointer(newHandle(c, callback)))
|
C.sqlite3_commit_hook(c.db, (*[0]byte)(C.commitHookTrampoline), newHandle(c, callback))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -504,7 +504,7 @@ func (c *SQLiteConn) RegisterRollbackHook(callback func()) {
|
|||||||
if callback == nil {
|
if callback == nil {
|
||||||
C.sqlite3_rollback_hook(c.db, nil, nil)
|
C.sqlite3_rollback_hook(c.db, nil, nil)
|
||||||
} else {
|
} else {
|
||||||
C.sqlite3_rollback_hook(c.db, (*[0]byte)(C.rollbackHookTrampoline), unsafe.Pointer(newHandle(c, callback)))
|
C.sqlite3_rollback_hook(c.db, (*[0]byte)(C.rollbackHookTrampoline), newHandle(c, callback))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,7 +521,7 @@ func (c *SQLiteConn) RegisterUpdateHook(callback func(int, string, string, int64
|
|||||||
if callback == nil {
|
if callback == nil {
|
||||||
C.sqlite3_update_hook(c.db, nil, nil)
|
C.sqlite3_update_hook(c.db, nil, nil)
|
||||||
} else {
|
} else {
|
||||||
C.sqlite3_update_hook(c.db, (*[0]byte)(C.updateHookTrampoline), unsafe.Pointer(newHandle(c, callback)))
|
C.sqlite3_update_hook(c.db, (*[0]byte)(C.updateHookTrampoline), newHandle(c, callback))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,7 +535,7 @@ func (c *SQLiteConn) RegisterAuthorizer(callback func(int, string, string, strin
|
|||||||
if callback == nil {
|
if callback == nil {
|
||||||
C.sqlite3_set_authorizer(c.db, nil, nil)
|
C.sqlite3_set_authorizer(c.db, nil, nil)
|
||||||
} else {
|
} else {
|
||||||
C.sqlite3_set_authorizer(c.db, (*[0]byte)(C.authorizerTrampoline), unsafe.Pointer(newHandle(c, callback)))
|
C.sqlite3_set_authorizer(c.db, (*[0]byte)(C.authorizerTrampoline), newHandle(c, callback))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -616,8 +616,8 @@ func (c *SQLiteConn) RegisterFunc(name string, impl interface{}, pure bool) erro
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func sqlite3CreateFunction(db *C.sqlite3, zFunctionName *C.char, nArg C.int, eTextRep C.int, pApp uintptr, xFunc unsafe.Pointer, xStep unsafe.Pointer, xFinal unsafe.Pointer) C.int {
|
func sqlite3CreateFunction(db *C.sqlite3, zFunctionName *C.char, nArg C.int, eTextRep C.int, pApp unsafe.Pointer, xFunc unsafe.Pointer, xStep unsafe.Pointer, xFinal unsafe.Pointer) C.int {
|
||||||
return C._sqlite3_create_function(db, zFunctionName, nArg, eTextRep, C.uintptr_t(pApp), (*[0]byte)(xFunc), (*[0]byte)(xStep), (*[0]byte)(xFinal))
|
return C._sqlite3_create_function(db, zFunctionName, nArg, eTextRep, C.uintptr_t(uintptr(pApp)), (*[0]byte)(xFunc), (*[0]byte)(xStep), (*[0]byte)(xFinal))
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterAggregator makes a Go type available as a SQLite aggregation function.
|
// RegisterAggregator makes a Go type available as a SQLite aggregation function.
|
||||||
|
|||||||
@@ -353,7 +353,7 @@ func mPrintf(format, arg string) *C.char {
|
|||||||
|
|
||||||
//export goMInit
|
//export goMInit
|
||||||
func goMInit(db, pClientData unsafe.Pointer, argc C.int, argv **C.char, pzErr **C.char, isCreate C.int) C.uintptr_t {
|
func goMInit(db, pClientData unsafe.Pointer, argc C.int, argv **C.char, pzErr **C.char, isCreate C.int) C.uintptr_t {
|
||||||
m := lookupHandle(uintptr(pClientData)).(*sqliteModule)
|
m := lookupHandle(pClientData).(*sqliteModule)
|
||||||
if m.c.db != (*C.sqlite3)(db) {
|
if m.c.db != (*C.sqlite3)(db) {
|
||||||
*pzErr = mPrintf("%s", "Inconsistent db handles")
|
*pzErr = mPrintf("%s", "Inconsistent db handles")
|
||||||
return 0
|
return 0
|
||||||
@@ -379,12 +379,12 @@ func goMInit(db, pClientData unsafe.Pointer, argc C.int, argv **C.char, pzErr **
|
|||||||
}
|
}
|
||||||
vt := sqliteVTab{m, vTab}
|
vt := sqliteVTab{m, vTab}
|
||||||
*pzErr = nil
|
*pzErr = nil
|
||||||
return C.uintptr_t(newHandle(m.c, &vt))
|
return C.uintptr_t(uintptr(newHandle(m.c, &vt)))
|
||||||
}
|
}
|
||||||
|
|
||||||
//export goVRelease
|
//export goVRelease
|
||||||
func goVRelease(pVTab unsafe.Pointer, isDestroy C.int) *C.char {
|
func goVRelease(pVTab unsafe.Pointer, isDestroy C.int) *C.char {
|
||||||
vt := lookupHandle(uintptr(pVTab)).(*sqliteVTab)
|
vt := lookupHandle(pVTab).(*sqliteVTab)
|
||||||
var err error
|
var err error
|
||||||
if isDestroy == 1 {
|
if isDestroy == 1 {
|
||||||
err = vt.vTab.Destroy()
|
err = vt.vTab.Destroy()
|
||||||
@@ -399,7 +399,7 @@ func goVRelease(pVTab unsafe.Pointer, isDestroy C.int) *C.char {
|
|||||||
|
|
||||||
//export goVOpen
|
//export goVOpen
|
||||||
func goVOpen(pVTab unsafe.Pointer, pzErr **C.char) C.uintptr_t {
|
func goVOpen(pVTab unsafe.Pointer, pzErr **C.char) C.uintptr_t {
|
||||||
vt := lookupHandle(uintptr(pVTab)).(*sqliteVTab)
|
vt := lookupHandle(pVTab).(*sqliteVTab)
|
||||||
vTabCursor, err := vt.vTab.Open()
|
vTabCursor, err := vt.vTab.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
*pzErr = mPrintf("%s", err.Error())
|
*pzErr = mPrintf("%s", err.Error())
|
||||||
@@ -407,12 +407,12 @@ func goVOpen(pVTab unsafe.Pointer, pzErr **C.char) C.uintptr_t {
|
|||||||
}
|
}
|
||||||
vtc := sqliteVTabCursor{vt, vTabCursor}
|
vtc := sqliteVTabCursor{vt, vTabCursor}
|
||||||
*pzErr = nil
|
*pzErr = nil
|
||||||
return C.uintptr_t(newHandle(vt.module.c, &vtc))
|
return C.uintptr_t(uintptr(newHandle(vt.module.c, &vtc)))
|
||||||
}
|
}
|
||||||
|
|
||||||
//export goVBestIndex
|
//export goVBestIndex
|
||||||
func goVBestIndex(pVTab unsafe.Pointer, icp unsafe.Pointer) *C.char {
|
func goVBestIndex(pVTab unsafe.Pointer, icp unsafe.Pointer) *C.char {
|
||||||
vt := lookupHandle(uintptr(pVTab)).(*sqliteVTab)
|
vt := lookupHandle(pVTab).(*sqliteVTab)
|
||||||
info := (*C.sqlite3_index_info)(icp)
|
info := (*C.sqlite3_index_info)(icp)
|
||||||
csts := constraints(info)
|
csts := constraints(info)
|
||||||
res, err := vt.vTab.BestIndex(csts, orderBys(info))
|
res, err := vt.vTab.BestIndex(csts, orderBys(info))
|
||||||
@@ -455,7 +455,7 @@ func goVBestIndex(pVTab unsafe.Pointer, icp unsafe.Pointer) *C.char {
|
|||||||
|
|
||||||
//export goVClose
|
//export goVClose
|
||||||
func goVClose(pCursor unsafe.Pointer) *C.char {
|
func goVClose(pCursor unsafe.Pointer) *C.char {
|
||||||
vtc := lookupHandle(uintptr(pCursor)).(*sqliteVTabCursor)
|
vtc := lookupHandle(pCursor).(*sqliteVTabCursor)
|
||||||
err := vtc.vTabCursor.Close()
|
err := vtc.vTabCursor.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mPrintf("%s", err.Error())
|
return mPrintf("%s", err.Error())
|
||||||
@@ -465,13 +465,13 @@ func goVClose(pCursor unsafe.Pointer) *C.char {
|
|||||||
|
|
||||||
//export goMDestroy
|
//export goMDestroy
|
||||||
func goMDestroy(pClientData unsafe.Pointer) {
|
func goMDestroy(pClientData unsafe.Pointer) {
|
||||||
m := lookupHandle(uintptr(pClientData)).(*sqliteModule)
|
m := lookupHandle(pClientData).(*sqliteModule)
|
||||||
m.module.DestroyModule()
|
m.module.DestroyModule()
|
||||||
}
|
}
|
||||||
|
|
||||||
//export goVFilter
|
//export goVFilter
|
||||||
func goVFilter(pCursor unsafe.Pointer, idxNum C.int, idxName *C.char, argc C.int, argv **C.sqlite3_value) *C.char {
|
func goVFilter(pCursor unsafe.Pointer, idxNum C.int, idxName *C.char, argc C.int, argv **C.sqlite3_value) *C.char {
|
||||||
vtc := lookupHandle(uintptr(pCursor)).(*sqliteVTabCursor)
|
vtc := lookupHandle(pCursor).(*sqliteVTabCursor)
|
||||||
args := (*[(math.MaxInt32 - 1) / unsafe.Sizeof((*C.sqlite3_value)(nil))]*C.sqlite3_value)(unsafe.Pointer(argv))[:argc:argc]
|
args := (*[(math.MaxInt32 - 1) / unsafe.Sizeof((*C.sqlite3_value)(nil))]*C.sqlite3_value)(unsafe.Pointer(argv))[:argc:argc]
|
||||||
vals := make([]interface{}, 0, argc)
|
vals := make([]interface{}, 0, argc)
|
||||||
for _, v := range args {
|
for _, v := range args {
|
||||||
@@ -490,7 +490,7 @@ func goVFilter(pCursor unsafe.Pointer, idxNum C.int, idxName *C.char, argc C.int
|
|||||||
|
|
||||||
//export goVNext
|
//export goVNext
|
||||||
func goVNext(pCursor unsafe.Pointer) *C.char {
|
func goVNext(pCursor unsafe.Pointer) *C.char {
|
||||||
vtc := lookupHandle(uintptr(pCursor)).(*sqliteVTabCursor)
|
vtc := lookupHandle(pCursor).(*sqliteVTabCursor)
|
||||||
err := vtc.vTabCursor.Next()
|
err := vtc.vTabCursor.Next()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mPrintf("%s", err.Error())
|
return mPrintf("%s", err.Error())
|
||||||
@@ -500,7 +500,7 @@ func goVNext(pCursor unsafe.Pointer) *C.char {
|
|||||||
|
|
||||||
//export goVEof
|
//export goVEof
|
||||||
func goVEof(pCursor unsafe.Pointer) C.int {
|
func goVEof(pCursor unsafe.Pointer) C.int {
|
||||||
vtc := lookupHandle(uintptr(pCursor)).(*sqliteVTabCursor)
|
vtc := lookupHandle(pCursor).(*sqliteVTabCursor)
|
||||||
err := vtc.vTabCursor.EOF()
|
err := vtc.vTabCursor.EOF()
|
||||||
if err {
|
if err {
|
||||||
return 1
|
return 1
|
||||||
@@ -510,7 +510,7 @@ func goVEof(pCursor unsafe.Pointer) C.int {
|
|||||||
|
|
||||||
//export goVColumn
|
//export goVColumn
|
||||||
func goVColumn(pCursor, cp unsafe.Pointer, col C.int) *C.char {
|
func goVColumn(pCursor, cp unsafe.Pointer, col C.int) *C.char {
|
||||||
vtc := lookupHandle(uintptr(pCursor)).(*sqliteVTabCursor)
|
vtc := lookupHandle(pCursor).(*sqliteVTabCursor)
|
||||||
c := (*SQLiteContext)(cp)
|
c := (*SQLiteContext)(cp)
|
||||||
err := vtc.vTabCursor.Column(c, int(col))
|
err := vtc.vTabCursor.Column(c, int(col))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -521,7 +521,7 @@ func goVColumn(pCursor, cp unsafe.Pointer, col C.int) *C.char {
|
|||||||
|
|
||||||
//export goVRowid
|
//export goVRowid
|
||||||
func goVRowid(pCursor unsafe.Pointer, pRowid *C.sqlite3_int64) *C.char {
|
func goVRowid(pCursor unsafe.Pointer, pRowid *C.sqlite3_int64) *C.char {
|
||||||
vtc := lookupHandle(uintptr(pCursor)).(*sqliteVTabCursor)
|
vtc := lookupHandle(pCursor).(*sqliteVTabCursor)
|
||||||
rowid, err := vtc.vTabCursor.Rowid()
|
rowid, err := vtc.vTabCursor.Rowid()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mPrintf("%s", err.Error())
|
return mPrintf("%s", err.Error())
|
||||||
@@ -532,7 +532,7 @@ func goVRowid(pCursor unsafe.Pointer, pRowid *C.sqlite3_int64) *C.char {
|
|||||||
|
|
||||||
//export goVUpdate
|
//export goVUpdate
|
||||||
func goVUpdate(pVTab unsafe.Pointer, argc C.int, argv **C.sqlite3_value, pRowid *C.sqlite3_int64) *C.char {
|
func goVUpdate(pVTab unsafe.Pointer, argc C.int, argv **C.sqlite3_value, pRowid *C.sqlite3_int64) *C.char {
|
||||||
vt := lookupHandle(uintptr(pVTab)).(*sqliteVTab)
|
vt := lookupHandle(pVTab).(*sqliteVTab)
|
||||||
|
|
||||||
var tname string
|
var tname string
|
||||||
if n, ok := vt.vTab.(interface {
|
if n, ok := vt.vTab.(interface {
|
||||||
@@ -652,7 +652,7 @@ func (c *SQLiteConn) CreateModule(moduleName string, module Module) error {
|
|||||||
mname := C.CString(moduleName)
|
mname := C.CString(moduleName)
|
||||||
defer C.free(unsafe.Pointer(mname))
|
defer C.free(unsafe.Pointer(mname))
|
||||||
udm := sqliteModule{c, moduleName, module}
|
udm := sqliteModule{c, moduleName, module}
|
||||||
rv := C._sqlite3_create_module(c.db, mname, C.uintptr_t(newHandle(c, &udm)))
|
rv := C._sqlite3_create_module(c.db, mname, C.uintptr_t(uintptr(newHandle(c, &udm))))
|
||||||
if rv != C.SQLITE_OK {
|
if rv != C.SQLITE_OK {
|
||||||
return c.lastError()
|
return c.lastError()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user