a geicko-2 based round robin ranking system designed to test c++ battleship submissions battleship.dunkirk.sh
at main 1.9 kB view raw
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 9package 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*/ 19import "C" 20import ( 21 "errors" 22 "unsafe" 23) 24 25func (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. 47func (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 66func (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}