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  }