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  }