|
@@ -10,6 +10,8 @@ package mysql
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"database/sql/driver"
|
|
"database/sql/driver"
|
|
|
|
|
+ "fmt"
|
|
|
|
|
+ "reflect"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
type mysqlStmt struct {
|
|
type mysqlStmt struct {
|
|
@@ -34,6 +36,10 @@ func (stmt *mysqlStmt) NumInput() int {
|
|
|
return stmt.paramCount
|
|
return stmt.paramCount
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func (stmt *mysqlStmt) ColumnConverter(idx int) driver.ValueConverter {
|
|
|
|
|
+ return converter{}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
|
|
func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
|
|
|
if stmt.mc.netConn == nil {
|
|
if stmt.mc.netConn == nil {
|
|
|
errLog.Print(ErrInvalidConn)
|
|
errLog.Print(ErrInvalidConn)
|
|
@@ -110,3 +116,34 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
|
|
|
|
|
|
|
|
return rows, err
|
|
return rows, err
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+type converter struct{}
|
|
|
|
|
+
|
|
|
|
|
+func (converter) ConvertValue(v interface{}) (driver.Value, error) {
|
|
|
|
|
+ if driver.IsValue(v) {
|
|
|
|
|
+ return v, nil
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ rv := reflect.ValueOf(v)
|
|
|
|
|
+ switch rv.Kind() {
|
|
|
|
|
+ case reflect.Ptr:
|
|
|
|
|
+ // indirect pointers
|
|
|
|
|
+ if rv.IsNil() {
|
|
|
|
|
+ return nil, nil
|
|
|
|
|
+ }
|
|
|
|
|
+ return driver.DefaultParameterConverter.ConvertValue(rv.Elem().Interface())
|
|
|
|
|
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
|
|
|
+ return rv.Int(), nil
|
|
|
|
|
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32:
|
|
|
|
|
+ return int64(rv.Uint()), nil
|
|
|
|
|
+ case reflect.Uint64:
|
|
|
|
|
+ u64 := rv.Uint()
|
|
|
|
|
+ if u64 >= 1<<63 {
|
|
|
|
|
+ return fmt.Sprintf("%d", u64), nil
|
|
|
|
|
+ }
|
|
|
|
|
+ return int64(u64), nil
|
|
|
|
|
+ case reflect.Float32, reflect.Float64:
|
|
|
|
|
+ return rv.Float(), nil
|
|
|
|
|
+ }
|
|
|
|
|
+ return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind())
|
|
|
|
|
+}
|