diff options
| author | Daniel Theophanes <kardianos@gmail.com> | 2016-10-03 09:49:25 -0700 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2016-10-17 07:56:35 +0000 |
| commit | 707a83341b8c7973f4e0fce731fa279c618f233b (patch) | |
| tree | 3436b372be1d863a3e5f2f2e837fbabe577252c8 /src/database/sql/convert.go | |
| parent | 99df54f19696e26bea8d6a052d8d91ddb1e4ea65 (diff) | |
| download | go-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.go | 27 |
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. |
