github.com/CanonicalLtd/go-sqlite3@v1.6.0/sqlite3_context.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 6 package sqlite3 7 8 /* 9 10 #ifndef USE_LIBSQLITE3 11 #include <sqlite3-binding.h> 12 #else 13 #include <sqlite3.h> 14 #endif 15 #include <stdlib.h> 16 // These wrappers are necessary because SQLITE_TRANSIENT 17 // is a pointer constant, and cgo doesn't translate them correctly. 18 19 static inline void my_result_text(sqlite3_context *ctx, char *p, int np) { 20 sqlite3_result_text(ctx, p, np, SQLITE_TRANSIENT); 21 } 22 23 static inline void my_result_blob(sqlite3_context *ctx, void *p, int np) { 24 sqlite3_result_blob(ctx, p, np, SQLITE_TRANSIENT); 25 } 26 */ 27 import "C" 28 29 import ( 30 "math" 31 "reflect" 32 "unsafe" 33 ) 34 35 const i64 = unsafe.Sizeof(int(0)) > 4 36 37 // SQLiteContext behave sqlite3_context 38 type SQLiteContext C.sqlite3_context 39 40 // ResultBool sets the result of an SQL function. 41 func (c *SQLiteContext) ResultBool(b bool) { 42 if b { 43 c.ResultInt(1) 44 } else { 45 c.ResultInt(0) 46 } 47 } 48 49 // ResultBlob sets the result of an SQL function. 50 // See: sqlite3_result_blob, http://sqlite.org/c3ref/result_blob.html 51 func (c *SQLiteContext) ResultBlob(b []byte) { 52 if i64 && len(b) > math.MaxInt32 { 53 C.sqlite3_result_error_toobig((*C.sqlite3_context)(c)) 54 return 55 } 56 var p *byte 57 if len(b) > 0 { 58 p = &b[0] 59 } 60 C.my_result_blob((*C.sqlite3_context)(c), unsafe.Pointer(p), C.int(len(b))) 61 } 62 63 // ResultDouble sets the result of an SQL function. 64 // See: sqlite3_result_double, http://sqlite.org/c3ref/result_blob.html 65 func (c *SQLiteContext) ResultDouble(d float64) { 66 C.sqlite3_result_double((*C.sqlite3_context)(c), C.double(d)) 67 } 68 69 // ResultInt sets the result of an SQL function. 70 // See: sqlite3_result_int, http://sqlite.org/c3ref/result_blob.html 71 func (c *SQLiteContext) ResultInt(i int) { 72 if i64 && (i > math.MaxInt32 || i < math.MinInt32) { 73 C.sqlite3_result_int64((*C.sqlite3_context)(c), C.sqlite3_int64(i)) 74 } else { 75 C.sqlite3_result_int((*C.sqlite3_context)(c), C.int(i)) 76 } 77 } 78 79 // ResultInt64 sets the result of an SQL function. 80 // See: sqlite3_result_int64, http://sqlite.org/c3ref/result_blob.html 81 func (c *SQLiteContext) ResultInt64(i int64) { 82 C.sqlite3_result_int64((*C.sqlite3_context)(c), C.sqlite3_int64(i)) 83 } 84 85 // ResultNull sets the result of an SQL function. 86 // See: sqlite3_result_null, http://sqlite.org/c3ref/result_blob.html 87 func (c *SQLiteContext) ResultNull() { 88 C.sqlite3_result_null((*C.sqlite3_context)(c)) 89 } 90 91 // ResultText sets the result of an SQL function. 92 // See: sqlite3_result_text, http://sqlite.org/c3ref/result_blob.html 93 func (c *SQLiteContext) ResultText(s string) { 94 h := (*reflect.StringHeader)(unsafe.Pointer(&s)) 95 cs, l := (*C.char)(unsafe.Pointer(h.Data)), C.int(h.Len) 96 C.my_result_text((*C.sqlite3_context)(c), cs, l) 97 } 98 99 // ResultZeroblob sets the result of an SQL function. 100 // See: sqlite3_result_zeroblob, http://sqlite.org/c3ref/result_blob.html 101 func (c *SQLiteContext) ResultZeroblob(n int) { 102 C.sqlite3_result_zeroblob((*C.sqlite3_context)(c), C.int(n)) 103 }