From 39c267d0732b31f8da53c614d27f41b23dde5740 Mon Sep 17 00:00:00 2001 From: Auler Date: Sun, 3 Jan 2021 20:57:11 +0800 Subject: [PATCH 1/5] sqlite3_type update The main reason for this change is that the original reflected values are nil. I found that there was no good mapping when dealing with the code here --- sqlite3_type.go | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/sqlite3_type.go b/sqlite3_type.go index b4128db4..39e812bb 100644 --- a/sqlite3_type.go +++ b/sqlite3_type.go @@ -37,26 +37,20 @@ func (rc *SQLiteRows) ColumnTypeNullable(i int) (nullable, ok bool) { return false, false } */ - // ColumnTypeScanType implement RowsColumnTypeScanType. func (rc *SQLiteRows) ColumnTypeScanType(i int) reflect.Type { - switch C.sqlite3_column_type(rc.s.s, C.int(i)) { - case C.SQLITE_INTEGER: - switch C.GoString(C.sqlite3_column_decltype(rc.s.s, C.int(i))) { - case "timestamp", "datetime", "date": - return reflect.TypeOf(time.Time{}) - case "boolean": - return reflect.TypeOf(false) - } + switch C.GoString(C.sqlite3_column_decltype(rc.s.s, C.int(i))) { + case "int", "integer", "tinyint", "smallint", "mediumint", "bigint": return reflect.TypeOf(int64(0)) - case C.SQLITE_FLOAT: + case "timestamp", "datetime", "date": + return reflect.TypeOf(time.Time{}) + case "boolean": + return reflect.TypeOf(false) + case "double", "float": return reflect.TypeOf(float64(0)) - case C.SQLITE_BLOB: - return reflect.SliceOf(reflect.TypeOf(byte(0))) - case C.SQLITE_NULL: - return reflect.TypeOf(nil) - case C.SQLITE_TEXT: + case "varchar", "character", "nchar": return reflect.TypeOf("") } return reflect.SliceOf(reflect.TypeOf(byte(0))) } + From cadffb56f6d316543b7100ab6ed312a5bf341fb6 Mon Sep 17 00:00:00 2001 From: Auler Date: Fri, 22 Jan 2021 15:04:33 +0800 Subject: [PATCH 2/5] Update sqlite3_type.go Update 'ColumnTypeScanType' method, Different types of mapping values --- sqlite3_type.go | 90 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 21 deletions(-) diff --git a/sqlite3_type.go b/sqlite3_type.go index 39e812bb..1e1963df 100644 --- a/sqlite3_type.go +++ b/sqlite3_type.go @@ -1,8 +1,3 @@ -// Copyright (C) 2019 Yasuhiro Matsumoto . -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file. - package sqlite3 /* @@ -14,8 +9,9 @@ package sqlite3 */ import "C" import ( + "database/sql" "reflect" - "time" + "strings" ) // ColumnTypeDatabaseTypeName implement RowsColumnTypeDatabaseTypeName. @@ -31,26 +27,78 @@ func (rc *SQLiteRows) ColumnTypeLength(index int) (length int64, ok bool) { func (rc *SQLiteRows) ColumnTypePrecisionScale(index int) (precision, scale int64, ok bool) { return 0, 0, false } +*/ // ColumnTypeNullable implement RowsColumnTypeNullable. func (rc *SQLiteRows) ColumnTypeNullable(i int) (nullable, ok bool) { - return false, false + return true, true } -*/ + // ColumnTypeScanType implement RowsColumnTypeScanType. func (rc *SQLiteRows) ColumnTypeScanType(i int) reflect.Type { - switch C.GoString(C.sqlite3_column_decltype(rc.s.s, C.int(i))) { - case "int", "integer", "tinyint", "smallint", "mediumint", "bigint": - return reflect.TypeOf(int64(0)) - case "timestamp", "datetime", "date": - return reflect.TypeOf(time.Time{}) - case "boolean": - return reflect.TypeOf(false) - case "double", "float": - return reflect.TypeOf(float64(0)) - case "varchar", "character", "nchar": - return reflect.TypeOf("") - } - return reflect.SliceOf(reflect.TypeOf(byte(0))) + //ct := C.sqlite3_column_type(rc.s.s, C.int(i)) // Always returns 5 + return scanType(C.GoString(C.sqlite3_column_decltype(rc.s.s, C.int(i)))) +} + +const ( + SQLITE_INTEGER = iota + SQLITE_TEXT + SQLITE_BLOB + SQLITE_REAL + SQLITE_NUMERIC + SQLITE_TIME + SQLITE_BOOL + SQLITE_NULL +) + +func scanType(cdt string) reflect.Type { + t := strings.ToUpper(cdt) + i := databaseTypeConvSqlite(t) + switch i { + case SQLITE_INTEGER: + return reflect.TypeOf(sql.NullInt64{}) + case SQLITE_TEXT: + return reflect.TypeOf(sql.NullString{}) + case SQLITE_BLOB: + return reflect.TypeOf(sql.RawBytes{}) + case SQLITE_REAL: + return reflect.TypeOf(sql.NullFloat64{}) + case SQLITE_NUMERIC: + return reflect.TypeOf(sql.NullFloat64{}) + case SQLITE_BOOL: + return reflect.TypeOf(sql.NullBool{}) + case SQLITE_TIME: + return reflect.TypeOf(sql.NullTime{}) + } + return reflect.TypeOf(new(interface{})) } +func databaseTypeConvSqlite(t string) int { + if strings.Contains(t, "INT") { + return SQLITE_INTEGER + } + if t == "CLOB" || t == "TEXT" || + strings.Contains(t, "CHAR") { + return SQLITE_TEXT + } + if t == "BLOB" { + return SQLITE_BLOB + } + if t == "REAL" || t == "FLOAT" || + strings.Contains(t, "DOUBLE") { + return SQLITE_REAL + } + if t == "DATE" || t == "DATETIME" || + t == "TIMESTAMP" { + return SQLITE_TIME + } + if t == "NUMERIC" || + strings.Contains(t, "DECIMAL") { + return SQLITE_NUMERIC + } + if t == "BOOLEAN" { + return SQLITE_BOOL + } + + return SQLITE_NULL +} From d45492dea42283c74b5d763a5030ea348bf9fa5f Mon Sep 17 00:00:00 2001 From: Auler Date: Sat, 23 Jan 2021 17:27:13 +0800 Subject: [PATCH 3/5] Restore copyright --- sqlite3_type.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sqlite3_type.go b/sqlite3_type.go index 1e1963df..00d403c7 100644 --- a/sqlite3_type.go +++ b/sqlite3_type.go @@ -1,3 +1,7 @@ +// Copyright (C) 2019 Yasuhiro Matsumoto . +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + package sqlite3 /* From 181619f4ea70695008c09d2ea51f28f617c55bba Mon Sep 17 00:00:00 2001 From: Auler Date: Sat, 30 Jan 2021 15:25:36 +0800 Subject: [PATCH 4/5] Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 3d0854a0..cd68d896 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module github.com/mattn/go-sqlite3 +module github.com/Auler/go-sqlite3 go 1.12 From 5a005352f863a3007892b03eaf3976607df0a60e Mon Sep 17 00:00:00 2001 From: Auler Date: Sat, 30 Jan 2021 15:26:35 +0800 Subject: [PATCH 5/5] Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index cd68d896..3d0854a0 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module github.com/Auler/go-sqlite3 +module github.com/mattn/go-sqlite3 go 1.12