From 98a44bcf5949f178c8116fa30e62c9ac2ef65927 Mon Sep 17 00:00:00 2001 From: rittneje Date: Thu, 16 Apr 2020 01:45:59 -0400 Subject: report actual error message if sqlite3_load_extension fails (#800) * report actual error message if sqlite3_load_extension fails * more fixes and test cases Co-authored-by: Jesse Rittner --- sqlite3_load_extension.go | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'sqlite3_load_extension.go') diff --git a/sqlite3_load_extension.go b/sqlite3_load_extension.go index 23c5d31..e6c50f2 100644 --- a/sqlite3_load_extension.go +++ b/sqlite3_load_extension.go @@ -28,12 +28,9 @@ func (c *SQLiteConn) loadExtensions(extensions []string) error { } for _, extension := range extensions { - cext := C.CString(extension) - defer C.free(unsafe.Pointer(cext)) - rv = C.sqlite3_load_extension(c.db, cext, nil, nil) - if rv != C.SQLITE_OK { + if err := c.loadExtension(extension, nil); err != nil { C.sqlite3_enable_load_extension(c.db, 0) - return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) + return err } } @@ -41,6 +38,7 @@ func (c *SQLiteConn) loadExtensions(extensions []string) error { if rv != C.SQLITE_OK { return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) } + return nil } @@ -51,19 +49,35 @@ func (c *SQLiteConn) LoadExtension(lib string, entry string) error { return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) } - clib := C.CString(lib) - defer C.free(unsafe.Pointer(clib)) - centry := C.CString(entry) - defer C.free(unsafe.Pointer(centry)) + if err := c.loadExtension(lib, &entry); err != nil { + C.sqlite3_enable_load_extension(c.db, 0) + return err + } - rv = C.sqlite3_load_extension(c.db, clib, centry, nil) + rv = C.sqlite3_enable_load_extension(c.db, 0) if rv != C.SQLITE_OK { return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) } - rv = C.sqlite3_enable_load_extension(c.db, 0) + return nil +} + +func (c *SQLiteConn) loadExtension(lib string, entry *string) error { + clib := C.CString(lib) + defer C.free(unsafe.Pointer(clib)) + + var centry *C.char + if entry != nil { + centry := C.CString(*entry) + defer C.free(unsafe.Pointer(centry)) + } + + var errMsg *C.char + defer C.sqlite3_free(unsafe.Pointer(errMsg)) + + rv := C.sqlite3_load_extension(c.db, clib, centry, &errMsg) if rv != C.SQLITE_OK { - return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) + return errors.New(C.GoString(errMsg)) } return nil -- cgit v1.2.3