forked from mirror/go-sqlcipher
parent
f86c8f208d
commit
58c4612c1e
30
sqlite3.go
30
sqlite3.go
|
@ -299,7 +299,7 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
|
|||
case C.SQLITE_INTEGER:
|
||||
val := int64(C.sqlite3_column_int64(rc.s.s, C.int(i)))
|
||||
switch rc.decltype[i] {
|
||||
case "timestamp":
|
||||
case "timestamp", "datetime":
|
||||
dest[i] = time.Unix(val, 0)
|
||||
case "boolean":
|
||||
dest[i] = val > 0
|
||||
|
@ -325,21 +325,21 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
|
|||
var err error
|
||||
s := C.GoString((*C.char)(unsafe.Pointer(C.sqlite3_column_text(rc.s.s, C.int(i)))))
|
||||
|
||||
switch dest[i].(type) {
|
||||
case *time.Time:
|
||||
if rc.decltype[i] == "timestamp" || rc.decltype[i] == "datetime" {
|
||||
dest[i], err = time.Parse(SQLiteTimestampFormat, s)
|
||||
if err != nil {
|
||||
dest[i], err = time.Parse(SQLiteDateFormat, s)
|
||||
if err != nil {
|
||||
dest[i], err = time.Parse(SQLiteDatetimeFormat, s)
|
||||
if err != nil {
|
||||
dest[i] = s
|
||||
}
|
||||
}
|
||||
switch rc.decltype[i] {
|
||||
case "timestamp", "datetime":
|
||||
for {
|
||||
if dest[i], err = time.Parse(SQLiteTimestampFormat, s); err == nil {
|
||||
break
|
||||
}
|
||||
} else {
|
||||
dest[i] = s
|
||||
if dest[i], err = time.Parse(SQLiteDateFormat, s); err == nil {
|
||||
break
|
||||
}
|
||||
if dest[i], err = time.Parse(SQLiteDatetimeFormat, s); err == nil {
|
||||
break
|
||||
}
|
||||
// The column is a time value, so return the zero time on parse failure.
|
||||
dest[i] = time.Time{}
|
||||
break
|
||||
}
|
||||
default:
|
||||
dest[i] = s
|
||||
|
|
|
@ -3,7 +3,6 @@ package sqlite
|
|||
import (
|
||||
"database/sql"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
@ -297,16 +296,17 @@ func TestTimestamp(t *testing.T) {
|
|||
t.Errorf("Value for id 2 should be %v, not %v", timestamp2, ts)
|
||||
}
|
||||
}
|
||||
|
||||
if id == 3 {
|
||||
seen += 1
|
||||
if !ts.IsZero() {
|
||||
t.Errorf("Value for id 3 should be the zero time, not %v", ts)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if seen != 2 {
|
||||
t.Error("Expected to see two valid timestamps")
|
||||
}
|
||||
|
||||
// make sure "nonsense" triggered an error
|
||||
err = rows.Err()
|
||||
if err == nil || !strings.Contains(err.Error(), "cannot parse \"nonsense\"") {
|
||||
t.Error("Expected error from \"nonsense\" timestamp")
|
||||
if seen != 3 {
|
||||
t.Error("Expected to see three timestamps")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue