Skip to content

Commit 941a463

Browse files
committed
introduce support for SQL_TYPE_TIME type
Fixes alexbrainman#92
1 parent 632bcac commit 941a463

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

api/api.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ type (
1919
Day SQLUSMALLINT
2020
}
2121

22+
SQL_TIME_STRUCT struct {
23+
Hour SQLUSMALLINT
24+
Minute SQLUSMALLINT
25+
Second SQLUSMALLINT
26+
}
27+
2228
SQL_TIMESTAMP_STRUCT struct {
2329
Year SQLSMALLINT
2430
Month SQLUSMALLINT

column.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ func NewColumn(h api.SQLHSTMT, idx int) (Column, error) {
8383
case api.SQL_TYPE_DATE:
8484
var v api.SQL_DATE_STRUCT
8585
return NewBindableColumn(b, api.SQL_C_DATE, int(unsafe.Sizeof(v))), nil
86+
case api.SQL_TYPE_TIME:
87+
var v api.SQL_TIME_STRUCT
88+
return NewBindableColumn(b, api.SQL_C_TIME, int(unsafe.Sizeof(v))), nil
8689
case api.SQL_GUID:
8790
var v api.SQLGUID
8891
return NewBindableColumn(b, api.SQL_C_GUID, int(unsafe.Sizeof(v))), nil
@@ -158,6 +161,11 @@ func (c *BaseColumn) Value(buf []byte) (driver.Value, error) {
158161
r := time.Date(int(t.Year), time.Month(t.Month), int(t.Day),
159162
0, 0, 0, 0, time.Local)
160163
return r, nil
164+
case api.SQL_C_TIME:
165+
t := (*api.SQL_TIME_STRUCT)(p)
166+
r := time.Date(1, time.January, 1,
167+
int(t.Hour), int(t.Minute), int(t.Second), 0, time.Local)
168+
return r, nil
161169
case api.SQL_C_BINARY:
162170
return buf, nil
163171
}

mysql_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright 2017 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package odbc
6+
7+
import (
8+
"database/sql"
9+
"flag"
10+
"fmt"
11+
"testing"
12+
"time"
13+
)
14+
15+
var (
16+
mysrv = flag.String("mysrv", "server", "mysql server name")
17+
mydb = flag.String("mydb", "dbname", "mysql database name")
18+
myuser = flag.String("myuser", "", "mysql user name")
19+
mypass = flag.String("mypass", "", "mysql password")
20+
)
21+
22+
func mysqlConnect() (db *sql.DB, stmtCount int, err error) {
23+
// from https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html
24+
conn := fmt.Sprintf("driver=mysql;server=%s;database=%s;user=%s;password=%s;",
25+
*mysrv, *mydb, *myuser, *mypass)
26+
db, err = sql.Open("odbc", conn)
27+
if err != nil {
28+
return nil, 0, err
29+
}
30+
stats := db.Driver().(*Driver).Stats
31+
return db, stats.StmtCount, nil
32+
}
33+
34+
func TestMYSQLTime(t *testing.T) {
35+
db, sc, err := mysqlConnect()
36+
if err != nil {
37+
t.Fatal(err)
38+
}
39+
defer closeDB(t, db, sc, sc)
40+
41+
db.Exec("drop table temp")
42+
exec(t, db, "create table temp(id int not null auto_increment primary key, time time)")
43+
now := time.Now()
44+
// SQL_TIME_STRUCT only supports hours, minutes and seconds
45+
now = time.Date(1, time.January, 1, now.Hour(), now.Minute(), now.Second(), 0, time.Local)
46+
_, err = db.Exec("insert into temp (time) values(?)", now)
47+
if err != nil {
48+
t.Fatal(err)
49+
}
50+
51+
var ret time.Time
52+
if err := db.QueryRow("select time from temp where id = ?", 1).Scan(&ret); err != nil {
53+
t.Fatal(err)
54+
}
55+
if ret != now {
56+
t.Fatalf("unexpected return value: want=%v, is=%v", now, ret)
57+
}
58+
59+
exec(t, db, "drop table temp")
60+
}

0 commit comments

Comments
 (0)