Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Commit 6dafc35

Browse files
committed
Enable map convert
Added test for map
1 parent 9c23a8b commit 6dafc35

File tree

3 files changed

+113
-1
lines changed

3 files changed

+113
-1
lines changed

cqlSql_test.go

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cql
33
import (
44
"context"
55
"database/sql"
6+
"reflect"
67
"testing"
78
// "time"
89
)
@@ -77,7 +78,7 @@ func TestSqlCreate(t *testing.T) {
7778
// create table
7879
ctx, cancel = context.WithTimeout(context.Background(), TimeoutValid)
7980
// removed duration_data duration
80-
result, err = db.ExecContext(ctx, "create table "+KeyspaceName+"."+TableName+" (text_data text PRIMARY KEY, int_data int, timestamp_data timestamp)")
81+
result, err = db.ExecContext(ctx, "create table "+KeyspaceName+"."+TableName+" (text_data text PRIMARY KEY, int_data int, timestamp_data timestamp, map_data map<text, text> )")
8182
cancel()
8283
if err != nil {
8384
t.Fatal("ExecContext error: ", err)
@@ -422,6 +423,94 @@ func TestSqlInsertUpdateSelectDelete(t *testing.T) {
422423
}
423424
*/
424425

426+
// insert five map
427+
aMap := map[string]string{"a": "a"}
428+
var ok bool
429+
var text string
430+
ctx, cancel = context.WithTimeout(context.Background(), TimeoutValid)
431+
result, err = db.ExecContext(ctx, "insert into "+KeyspaceName+"."+TableName+" (text_data, map_data) values (?, ?)", "five", aMap)
432+
cancel()
433+
if err != nil {
434+
t.Fatal("ExecContext error: ", err)
435+
}
436+
if result == nil {
437+
t.Fatal("result is nil")
438+
}
439+
440+
// select five map
441+
ctx, cancel = context.WithTimeout(context.Background(), TimeoutValid)
442+
rows, err = db.QueryContext(ctx, "select text_data, map_data from "+KeyspaceName+"."+TableName+" where text_data = ?", "five")
443+
if err != nil {
444+
t.Fatal("QueryContext error: ", err)
445+
}
446+
if rows == nil {
447+
t.Fatal("rows is nil")
448+
}
449+
if !rows.Next() {
450+
t.Fatal("no Next rows")
451+
}
452+
err = rows.Scan(destPointer...)
453+
if err != nil {
454+
t.Fatal("Scan error: ", err)
455+
}
456+
if dest[0] != "five" {
457+
t.Fatalf("text_data - received: %v - expected: %v", dest[0], "five")
458+
}
459+
aMap, ok = dest[1].(map[string]string)
460+
if !ok {
461+
t.Fatalf("map_data not time, type: %T", dest[1])
462+
}
463+
if !reflect.DeepEqual(aMap, map[string]string{"a": "a"}) {
464+
t.Fatalf("map_data - received: %v - expected: %v", aMap, map[string]string{"a": "a"})
465+
}
466+
if rows.Next() {
467+
t.Fatal("has Next rows")
468+
}
469+
err = rows.Close()
470+
if err != nil {
471+
t.Fatal("Close error: ", err)
472+
}
473+
cancel()
474+
err = rows.Err()
475+
if err != nil {
476+
t.Fatal("Err error: ", err)
477+
}
478+
479+
// select five map
480+
ctx, cancel = context.WithTimeout(context.Background(), TimeoutValid)
481+
rows, err = db.QueryContext(ctx, "select text_data, map_data from "+KeyspaceName+"."+TableName+" where text_data = ?", "five")
482+
if err != nil {
483+
t.Fatal("QueryContext error: ", err)
484+
}
485+
if rows == nil {
486+
t.Fatal("rows is nil")
487+
}
488+
if !rows.Next() {
489+
t.Fatal("no Next rows")
490+
}
491+
err = rows.Scan(&text, &aMap)
492+
if err != nil {
493+
t.Fatal("Scan error: ", err)
494+
}
495+
if text != "five" {
496+
t.Fatalf("text_data - received: %v - expected: %v", text, "five")
497+
}
498+
if !reflect.DeepEqual(aMap, map[string]string{"a": "a"}) {
499+
t.Fatalf("map_data - received: %v - expected: %v", aMap, map[string]string{"a": "a"})
500+
}
501+
if rows.Next() {
502+
t.Fatal("has Next rows")
503+
}
504+
err = rows.Close()
505+
if err != nil {
506+
t.Fatal("Close error: ", err)
507+
}
508+
cancel()
509+
err = rows.Err()
510+
if err != nil {
511+
t.Fatal("Err error: ", err)
512+
}
513+
425514
// select errors
426515
ctx, cancel = context.WithTimeout(context.Background(), TimeoutValid)
427516
rows, err = db.QueryContext(ctx, "select int_data from "+KeyspaceName+"."+TableName+" group by int_data")

globals.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ type (
4949
iter *gocql.Iter
5050
columns []string
5151
}
52+
53+
converter struct{}
5254
)
5355

5456
var (

statement.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cql
33
import (
44
"context"
55
"database/sql/driver"
6+
"reflect"
67
)
78

89
// Close a statement
@@ -84,3 +85,23 @@ func (cqlStmt *CqlStmt) queryContext(ctx context.Context, values []interface{})
8485
columns: columnInfoToString(iter.Columns()),
8586
}, nil
8687
}
88+
89+
// ColumnConverter provides driver ValueConverter for statment
90+
func (cqlStmt *CqlStmt) ColumnConverter(index int) driver.ValueConverter {
91+
return converter{}
92+
}
93+
94+
// ConvertValue coverts interface value to driver Value
95+
func (c converter) ConvertValue(valueInterface interface{}) (driver.Value, error) {
96+
valueDriver, err := driver.DefaultParameterConverter.ConvertValue(valueInterface)
97+
if err == nil {
98+
return valueDriver, nil
99+
}
100+
101+
rv := reflect.ValueOf(valueInterface)
102+
if rv.Kind() == reflect.Uint64 {
103+
return rv.Uint(), nil
104+
}
105+
106+
return valueDriver, err
107+
}

0 commit comments

Comments
 (0)