aboutsummaryrefslogtreecommitdiff
path: root/src/database/sql/convert.go
diff options
context:
space:
mode:
authorDaniel Theophanes <kardianos@gmail.com>2016-10-03 09:49:25 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2016-10-17 07:56:35 +0000
commit707a83341b8c7973f4e0fce731fa279c618f233b (patch)
tree3436b372be1d863a3e5f2f2e837fbabe577252c8 /src/database/sql/convert.go
parent99df54f19696e26bea8d6a052d8d91ddb1e4ea65 (diff)
downloadgo-707a83341b8c7973f4e0fce731fa279c618f233b.tar.xz
database/sql: add option to use named parameter in query arguments
Modify the new Context methods to take a name-value driver struct. This will require more modifications to drivers to use, but will reduce the overall number of structures that need to be maintained over time. Fixes #12381 Change-Id: I30747533ce418a1be5991a0c8767a26e8451adbd Reviewed-on: https://go-review.googlesource.com/30166 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/database/sql/convert.go')
-rw-r--r--src/database/sql/convert.go27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/database/sql/convert.go b/src/database/sql/convert.go
index 99aed2398e..cee96319da 100644
--- a/src/database/sql/convert.go
+++ b/src/database/sql/convert.go
@@ -21,8 +21,8 @@ var errNilPtr = errors.New("destination pointer is nil") // embedded in descript
// Stmt.Query into driver Values.
//
// The statement ds may be nil, if no statement is available.
-func driverArgs(ds *driverStmt, args []interface{}) ([]driver.Value, error) {
- dargs := make([]driver.Value, len(args))
+func driverArgs(ds *driverStmt, args []interface{}) ([]driver.NamedValue, error) {
+ nvargs := make([]driver.NamedValue, len(args))
var si driver.Stmt
if ds != nil {
si = ds.si
@@ -33,16 +33,27 @@ func driverArgs(ds *driverStmt, args []interface{}) ([]driver.Value, error) {
if !ok {
for n, arg := range args {
var err error
- dargs[n], err = driver.DefaultParameterConverter.ConvertValue(arg)
+ nvargs[n].Ordinal = n + 1
+ if np, ok := arg.(NamedParam); ok {
+ arg = np.Value
+ nvargs[n].Name = np.Name
+ }
+ nvargs[n].Value, err = driver.DefaultParameterConverter.ConvertValue(arg)
+
if err != nil {
return nil, fmt.Errorf("sql: converting Exec argument #%d's type: %v", n, err)
}
}
- return dargs, nil
+ return nvargs, nil
}
// Let the Stmt convert its own arguments.
for n, arg := range args {
+ nvargs[n].Ordinal = n + 1
+ if np, ok := arg.(NamedParam); ok {
+ arg = np.Value
+ nvargs[n].Name = np.Name
+ }
// First, see if the value itself knows how to convert
// itself to a driver type. For example, a NullString
// struct changing into a string or nil.
@@ -66,18 +77,18 @@ func driverArgs(ds *driverStmt, args []interface{}) ([]driver.Value, error) {
// same error.
var err error
ds.Lock()
- dargs[n], err = cc.ColumnConverter(n).ConvertValue(arg)
+ nvargs[n].Value, err = cc.ColumnConverter(n).ConvertValue(arg)
ds.Unlock()
if err != nil {
return nil, fmt.Errorf("sql: converting argument #%d's type: %v", n, err)
}
- if !driver.IsValue(dargs[n]) {
+ if !driver.IsValue(nvargs[n].Value) {
return nil, fmt.Errorf("sql: driver ColumnConverter error converted %T to unsupported type %T",
- arg, dargs[n])
+ arg, nvargs[n].Value)
}
}
- return dargs, nil
+ return nvargs, nil
}
// convertAssign copies to dest the value in src, converting it if possible.