This commit is contained in:
Micah Stetson 2012-12-29 14:20:27 -08:00
parent f86c8f208d
commit 58c4612c1e
2 changed files with 24 additions and 24 deletions

View File

@ -299,7 +299,7 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
case C.SQLITE_INTEGER: case C.SQLITE_INTEGER:
val := int64(C.sqlite3_column_int64(rc.s.s, C.int(i))) val := int64(C.sqlite3_column_int64(rc.s.s, C.int(i)))
switch rc.decltype[i] { switch rc.decltype[i] {
case "timestamp": case "timestamp", "datetime":
dest[i] = time.Unix(val, 0) dest[i] = time.Unix(val, 0)
case "boolean": case "boolean":
dest[i] = val > 0 dest[i] = val > 0
@ -325,21 +325,21 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
var err error var err error
s := C.GoString((*C.char)(unsafe.Pointer(C.sqlite3_column_text(rc.s.s, C.int(i))))) s := C.GoString((*C.char)(unsafe.Pointer(C.sqlite3_column_text(rc.s.s, C.int(i)))))
switch dest[i].(type) { switch rc.decltype[i] {
case *time.Time: case "timestamp", "datetime":
if rc.decltype[i] == "timestamp" || rc.decltype[i] == "datetime" { for {
dest[i], err = time.Parse(SQLiteTimestampFormat, s) if dest[i], err = time.Parse(SQLiteTimestampFormat, s); err == nil {
if err != nil { break
dest[i], err = time.Parse(SQLiteDateFormat, s)
if err != nil {
dest[i], err = time.Parse(SQLiteDatetimeFormat, s)
if err != nil {
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
} }
} else { // The column is a time value, so return the zero time on parse failure.
dest[i] = s dest[i] = time.Time{}
break
} }
default: default:
dest[i] = s dest[i] = s

View File

@ -3,7 +3,6 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"os" "os"
"strings"
"testing" "testing"
"time" "time"
) )
@ -297,16 +296,17 @@ func TestTimestamp(t *testing.T) {
t.Errorf("Value for id 2 should be %v, not %v", timestamp2, ts) 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 { if seen != 3 {
t.Error("Expected to see two valid timestamps") t.Error("Expected to see three 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")
} }
} }