Skip to content

Commit

Permalink
new vector.go file
Browse files Browse the repository at this point in the history
  • Loading branch information
taniabogatsch committed Mar 29, 2024
1 parent 8d916c1 commit 143da09
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 8 deletions.
13 changes: 6 additions & 7 deletions appender.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import "C"

import (
"database/sql/driver"
"reflect"
"unsafe"
)

Expand Down Expand Up @@ -84,7 +85,7 @@ func NewAppenderFromConn(driverConn driver.Conn, schema, table string) (*Appende
if err != nil {
a.destroyColumnTypes()
C.duckdb_appender_destroy(&duckdbAppender)
return nil, err
return nil, getError(errAppenderCreation, err)
}

return a, nil
Expand Down Expand Up @@ -194,12 +195,10 @@ func (a *Appender) appendRowSlice(args []driver.Value) error {
}

// Ensure that the types match before attempting to append anything.

// TODO.
//if err := info.typeMatch(reflect.TypeOf(v)); err != nil {
// // Use 1-based indexing for readability, as we're talking about columns.
// return columnError(err, i+1)
//}
if err := vec.typeMatch(reflect.TypeOf(v)); err != nil {
// Use 1-based indexing for readability, as we're talking about columns.
return columnError(err, i+1)
}
vec.fn(&vec, a.currSize, v)
}

Expand Down
20 changes: 20 additions & 0 deletions types.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,26 @@ var unsupportedAppenderTypeMap = map[C.duckdb_type]string{
C.DUCKDB_TYPE_TIMESTAMP_TZ: "TIMESTAMP_TZ",
}

var appenderTypeIdMap = map[C.duckdb_type]string{
C.DUCKDB_TYPE_BOOLEAN: "bool",
C.DUCKDB_TYPE_TINYINT: "int8",
C.DUCKDB_TYPE_SMALLINT: "int16",
C.DUCKDB_TYPE_INTEGER: "int32",
C.DUCKDB_TYPE_BIGINT: "int64",
C.DUCKDB_TYPE_UTINYINT: "uint8",
C.DUCKDB_TYPE_USMALLINT: "uint16",
C.DUCKDB_TYPE_UINTEGER: "uint32",
C.DUCKDB_TYPE_UBIGINT: "uint64",
C.DUCKDB_TYPE_FLOAT: "float32",
C.DUCKDB_TYPE_DOUBLE: "float64",
C.DUCKDB_TYPE_VARCHAR: "string",
C.DUCKDB_TYPE_BLOB: "[]uint8",
C.DUCKDB_TYPE_TIMESTAMP: "time.Time",
C.DUCKDB_TYPE_UUID: "duckdb.UUID",
C.DUCKDB_TYPE_LIST: "slice",
C.DUCKDB_TYPE_STRUCT: "struct",
}

type UUID [16]byte

func (u *UUID) Scan(v any) error {
Expand Down
62 changes: 61 additions & 1 deletion vector.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,6 @@ func (vec *vector) setTime(rowIdx C.idx_t, value time.Time) {
}

func (vec *vector) setList(rowIdx C.idx_t, value driver.Value) {

refVal := reflect.ValueOf(value)
childVector := vec.childVectors[0]

Expand Down Expand Up @@ -263,3 +262,64 @@ func (vec *vector) initStruct(logicalType C.duckdb_logical_type) error {

return nil
}

func (vec *vector) duckDBTypeToString() string {
if vec.duckdbType == C.DUCKDB_TYPE_LIST {
s := vec.childVectors[0].duckDBTypeToString()
return "[]" + s
}

if vec.duckdbType == C.DUCKDB_TYPE_STRUCT {
s := "{"
for i := 0; i < len(vec.childVectors); i++ {
if i > 0 {
s += ", "
}
tmp := vec.childVectors[i].duckDBTypeToString()
s += tmp
}
s += "}"
return s
}

return appenderTypeIdMap[vec.duckdbType]
}

func goTypeToString(v reflect.Type) string {
switch v.String() {
case "int":
return "int64"
case "uint":
return "uint64"
case "time.Time":
return "time.Time"
}

if v.Kind() == reflect.Slice {
return "[]" + goTypeToString(v.Elem())
}

if v.Kind() == reflect.Struct {
s := "{"
for i := 0; i < v.NumField(); i++ {
if i > 0 {
s += ", "
}
s += goTypeToString(v.Field(i).Type)
}
s += "}"
return s
}

return v.String()
}

func (vec *vector) typeMatch(v reflect.Type) error {
actual := goTypeToString(v)
expected := vec.duckDBTypeToString()

if actual != expected {
return castError(actual, expected)
}
return nil
}

0 comments on commit 143da09

Please sign in to comment.