a geicko-2 based round robin ranking system designed to test c++ battleship submissions
battleship.dunkirk.sh
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}