forked from mirror/go-sqlite3
Merge pull request #282 from zmedico/decltypes
Add SQLiteRows.DeclTypes() method
This commit is contained in:
commit
10876d7dac
18
sqlite3.go
18
sqlite3.go
|
@ -893,6 +893,17 @@ func (rc *SQLiteRows) Columns() []string {
|
||||||
return rc.cols
|
return rc.cols
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return column types.
|
||||||
|
func (rc *SQLiteRows) DeclTypes() []string {
|
||||||
|
if rc.decltype == nil {
|
||||||
|
rc.decltype = make([]string, rc.nc)
|
||||||
|
for i := 0; i < rc.nc; i++ {
|
||||||
|
rc.decltype[i] = strings.ToLower(C.GoString(C.sqlite3_column_decltype(rc.s.s, C.int(i))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rc.decltype
|
||||||
|
}
|
||||||
|
|
||||||
// Move cursor to next.
|
// Move cursor to next.
|
||||||
func (rc *SQLiteRows) Next(dest []driver.Value) error {
|
func (rc *SQLiteRows) Next(dest []driver.Value) error {
|
||||||
rv := C.sqlite3_step(rc.s.s)
|
rv := C.sqlite3_step(rc.s.s)
|
||||||
|
@ -907,12 +918,7 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if rc.decltype == nil {
|
rc.DeclTypes()
|
||||||
rc.decltype = make([]string, rc.nc)
|
|
||||||
for i := 0; i < rc.nc; i++ {
|
|
||||||
rc.decltype[i] = strings.ToLower(C.GoString(C.sqlite3_column_decltype(rc.s.s, C.int(i))))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range dest {
|
for i := range dest {
|
||||||
switch C.sqlite3_column_type(rc.s.s, C.int(i)) {
|
switch C.sqlite3_column_type(rc.s.s, C.int(i)) {
|
||||||
|
|
|
@ -1279,6 +1279,41 @@ func TestAggregatorRegistration(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDeclTypes(t *testing.T) {
|
||||||
|
|
||||||
|
d := SQLiteDriver{}
|
||||||
|
|
||||||
|
conn, err := d.Open(":memory:")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Failed to begin transaction:", err)
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
sqlite3conn := conn.(*SQLiteConn)
|
||||||
|
|
||||||
|
_, err = sqlite3conn.Exec("create table foo (id integer not null primary key, name text)", nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Failed to create table:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = sqlite3conn.Exec("insert into foo(name) values(\"bar\")", nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Failed to insert:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rs, err := sqlite3conn.Query("select * from foo", nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Failed to select:", err)
|
||||||
|
}
|
||||||
|
defer rs.Close()
|
||||||
|
|
||||||
|
declTypes := rs.(*SQLiteRows).DeclTypes()
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(declTypes, []string{"integer", "text"}) {
|
||||||
|
t.Fatal("Unexpected declTypes:", declTypes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var customFunctionOnce sync.Once
|
var customFunctionOnce sync.Once
|
||||||
|
|
||||||
func BenchmarkCustomFunctions(b *testing.B) {
|
func BenchmarkCustomFunctions(b *testing.B) {
|
||||||
|
|
Loading…
Reference in New Issue