github.com/CanonicalLtd/go-sqlite3@v1.6.0/sqlite3_load_extension.go (about) 1 // Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>. 2 // 3 // Use of this source code is governed by an MIT-style 4 // license that can be found in the LICENSE file. 5 // +build !sqlite_omit_load_extension 6 7 package sqlite3 8 9 /* 10 #ifndef USE_LIBSQLITE3 11 #include <sqlite3-binding.h> 12 #else 13 #include <sqlite3.h> 14 #endif 15 #include <stdlib.h> 16 */ 17 import "C" 18 import ( 19 "errors" 20 "unsafe" 21 ) 22 23 func (c *SQLiteConn) loadExtensions(extensions []string) error { 24 rv := C.sqlite3_enable_load_extension(c.db, 1) 25 if rv != C.SQLITE_OK { 26 return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) 27 } 28 29 for _, extension := range extensions { 30 cext := C.CString(extension) 31 defer C.free(unsafe.Pointer(cext)) 32 rv = C.sqlite3_load_extension(c.db, cext, nil, nil) 33 if rv != C.SQLITE_OK { 34 C.sqlite3_enable_load_extension(c.db, 0) 35 return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) 36 } 37 } 38 39 rv = C.sqlite3_enable_load_extension(c.db, 0) 40 if rv != C.SQLITE_OK { 41 return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) 42 } 43 return nil 44 } 45 46 // LoadExtension load the sqlite3 extension. 47 func (c *SQLiteConn) LoadExtension(lib string, entry string) error { 48 rv := C.sqlite3_enable_load_extension(c.db, 1) 49 if rv != C.SQLITE_OK { 50 return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) 51 } 52 53 clib := C.CString(lib) 54 defer C.free(unsafe.Pointer(clib)) 55 centry := C.CString(entry) 56 defer C.free(unsafe.Pointer(centry)) 57 58 rv = C.sqlite3_load_extension(c.db, clib, centry, nil) 59 if rv != C.SQLITE_OK { 60 return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) 61 } 62 63 rv = C.sqlite3_enable_load_extension(c.db, 0) 64 if rv != C.SQLITE_OK { 65 return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) 66 } 67 68 return nil 69 }