diff options
author | rittneje <rittneje@gmail.com> | 2020-04-16 01:45:59 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-16 14:45:59 +0900 |
commit | 98a44bcf5949f178c8116fa30e62c9ac2ef65927 (patch) | |
tree | aa8ef6d0d26d93f3ee2e2e2231dc795492efe21b /sqlite3_load_extension.go | |
parent | Add extension-functions.c info to README (#779) (diff) | |
download | golite-98a44bcf5949f178c8116fa30e62c9ac2ef65927.tar.gz golite-98a44bcf5949f178c8116fa30e62c9ac2ef65927.tar.xz |
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 <jrittner@lutron.com>
Diffstat (limited to 'sqlite3_load_extension.go')
-rw-r--r-- | sqlite3_load_extension.go | 38 |
1 files changed, 26 insertions, 12 deletions
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 |