aboutsummaryrefslogtreecommitdiff
path: root/sqlite3_load_extension.go
diff options
context:
space:
mode:
authorrittneje <rittneje@gmail.com>2020-04-16 01:45:59 -0400
committerGitHub <noreply@github.com>2020-04-16 14:45:59 +0900
commit98a44bcf5949f178c8116fa30e62c9ac2ef65927 (patch)
treeaa8ef6d0d26d93f3ee2e2e2231dc795492efe21b /sqlite3_load_extension.go
parentAdd extension-functions.c info to README (#779) (diff)
downloadgolite-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.go38
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