github.com/CanonicalLtd/go-sqlite3@v1.6.0/sqlite3_type.go (about)

     1  package sqlite3
     2  
     3  /*
     4  #ifndef USE_LIBSQLITE3
     5  #include <sqlite3-binding.h>
     6  #else
     7  #include <sqlite3.h>
     8  #endif
     9  */
    10  import "C"
    11  import (
    12  	"reflect"
    13  	"time"
    14  )
    15  
    16  // ColumnTypeDatabaseTypeName implement RowsColumnTypeDatabaseTypeName.
    17  func (rc *SQLiteRows) ColumnTypeDatabaseTypeName(i int) string {
    18  	return C.GoString(C.sqlite3_column_decltype(rc.s.s, C.int(i)))
    19  }
    20  
    21  /*
    22  func (rc *SQLiteRows) ColumnTypeLength(index int) (length int64, ok bool) {
    23  	return 0, false
    24  }
    25  
    26  func (rc *SQLiteRows) ColumnTypePrecisionScale(index int) (precision, scale int64, ok bool) {
    27  	return 0, 0, false
    28  }
    29  */
    30  
    31  // ColumnTypeNullable implement RowsColumnTypeNullable.
    32  func (rc *SQLiteRows) ColumnTypeNullable(i int) (nullable, ok bool) {
    33  	return true, true
    34  }
    35  
    36  // ColumnTypeScanType implement RowsColumnTypeScanType.
    37  func (rc *SQLiteRows) ColumnTypeScanType(i int) reflect.Type {
    38  	switch C.sqlite3_column_type(rc.s.s, C.int(i)) {
    39  	case C.SQLITE_INTEGER:
    40  		switch C.GoString(C.sqlite3_column_decltype(rc.s.s, C.int(i))) {
    41  		case "timestamp", "datetime", "date":
    42  			return reflect.TypeOf(time.Time{})
    43  		case "boolean":
    44  			return reflect.TypeOf(false)
    45  		}
    46  		return reflect.TypeOf(int64(0))
    47  	case C.SQLITE_FLOAT:
    48  		return reflect.TypeOf(float64(0))
    49  	case C.SQLITE_BLOB:
    50  		return reflect.SliceOf(reflect.TypeOf(byte(0)))
    51  	case C.SQLITE_NULL:
    52  		return reflect.TypeOf(nil)
    53  	case C.SQLITE_TEXT:
    54  		return reflect.TypeOf("")
    55  	}
    56  	return reflect.SliceOf(reflect.TypeOf(byte(0)))
    57  }