gemini-search

A simple search engine for Geminispace
git clone git://git.laack.co/gemini-search.git
Log | Files | Refs | README

sqlite3_load_extension.go (1887B)


      1 // Copyright (C) 2019 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 
      6 //go:build !sqlite_omit_load_extension
      7 // +build !sqlite_omit_load_extension
      8 
      9 package sqlite3
     10 
     11 /*
     12 #ifndef USE_LIBSQLITE3
     13 #include "sqlite3-binding.h"
     14 #else
     15 #include <sqlite3.h>
     16 #endif
     17 #include <stdlib.h>
     18 */
     19 import "C"
     20 import (
     21 	"errors"
     22 	"unsafe"
     23 )
     24 
     25 func (c *SQLiteConn) loadExtensions(extensions []string) error {
     26 	rv := C.sqlite3_enable_load_extension(c.db, 1)
     27 	if rv != C.SQLITE_OK {
     28 		return errors.New(C.GoString(C.sqlite3_errmsg(c.db)))
     29 	}
     30 
     31 	for _, extension := range extensions {
     32 		if err := c.loadExtension(extension, nil); err != nil {
     33 			C.sqlite3_enable_load_extension(c.db, 0)
     34 			return err
     35 		}
     36 	}
     37 
     38 	rv = C.sqlite3_enable_load_extension(c.db, 0)
     39 	if rv != C.SQLITE_OK {
     40 		return errors.New(C.GoString(C.sqlite3_errmsg(c.db)))
     41 	}
     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 	if err := c.loadExtension(lib, &entry); err != nil {
     54 		C.sqlite3_enable_load_extension(c.db, 0)
     55 		return err
     56 	}
     57 
     58 	rv = C.sqlite3_enable_load_extension(c.db, 0)
     59 	if rv != C.SQLITE_OK {
     60 		return errors.New(C.GoString(C.sqlite3_errmsg(c.db)))
     61 	}
     62 
     63 	return nil
     64 }
     65 
     66 func (c *SQLiteConn) loadExtension(lib string, entry *string) error {
     67 	clib := C.CString(lib)
     68 	defer C.free(unsafe.Pointer(clib))
     69 
     70 	var centry *C.char
     71 	if entry != nil {
     72 		centry = C.CString(*entry)
     73 		defer C.free(unsafe.Pointer(centry))
     74 	}
     75 
     76 	var errMsg *C.char
     77 	defer C.sqlite3_free(unsafe.Pointer(errMsg))
     78 
     79 	rv := C.sqlite3_load_extension(c.db, clib, centry, &errMsg)
     80 	if rv != C.SQLITE_OK {
     81 		return errors.New(C.GoString(errMsg))
     82 	}
     83 
     84 	return nil
     85 }