1 // Copyright 2016 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
13 func ctxDriverPrepare(ctx context
.Context
, ci driver
.Conn
, query
string) (driver
.Stmt
, error
) {
14 if ciCtx
, is
:= ci
.(driver
.ConnPrepareContext
); is
{
15 return ciCtx
.PrepareContext(ctx
, query
)
17 si
, err
:= ci
.Prepare(query
)
29 func ctxDriverExec(ctx context
.Context
, execer driver
.Execer
, query
string, nvdargs
[]driver
.NamedValue
) (driver
.Result
, error
) {
30 if execerCtx
, is
:= execer
.(driver
.ExecerContext
); is
{
31 return execerCtx
.ExecContext(ctx
, query
, nvdargs
)
33 dargs
, err
:= namedValueToValue(nvdargs
)
43 return execer
.Exec(query
, dargs
)
46 func ctxDriverQuery(ctx context
.Context
, queryer driver
.Queryer
, query
string, nvdargs
[]driver
.NamedValue
) (driver
.Rows
, error
) {
47 if queryerCtx
, is
:= queryer
.(driver
.QueryerContext
); is
{
48 ret
, err
:= queryerCtx
.QueryContext(ctx
, query
, nvdargs
)
51 dargs
, err
:= namedValueToValue(nvdargs
)
61 return queryer
.Query(query
, dargs
)
64 func ctxDriverStmtExec(ctx context
.Context
, si driver
.Stmt
, nvdargs
[]driver
.NamedValue
) (driver
.Result
, error
) {
65 if siCtx
, is
:= si
.(driver
.StmtExecContext
); is
{
66 return siCtx
.ExecContext(ctx
, nvdargs
)
68 dargs
, err
:= namedValueToValue(nvdargs
)
81 func ctxDriverStmtQuery(ctx context
.Context
, si driver
.Stmt
, nvdargs
[]driver
.NamedValue
) (driver
.Rows
, error
) {
82 if siCtx
, is
:= si
.(driver
.StmtQueryContext
); is
{
83 return siCtx
.QueryContext(ctx
, nvdargs
)
85 dargs
, err
:= namedValueToValue(nvdargs
)
95 return si
.Query(dargs
)
98 var errLevelNotSupported
= errors
.New("sql: selected isolation level is not supported")
100 func ctxDriverBegin(ctx context
.Context
, opts
*TxOptions
, ci driver
.Conn
) (driver
.Tx
, error
) {
101 if ciCtx
, is
:= ci
.(driver
.ConnBeginTx
); is
{
102 dopts
:= driver
.TxOptions
{}
104 dopts
.Isolation
= driver
.IsolationLevel(opts
.Isolation
)
105 dopts
.ReadOnly
= opts
.ReadOnly
107 return ciCtx
.BeginTx(ctx
, dopts
)
110 if ctx
.Done() == context
.Background().Done() {
115 // Check the transaction level. If the transaction level is non-default
116 // then return an error here as the BeginTx driver value is not supported.
117 if opts
.Isolation
!= LevelDefault
{
118 return nil, errors
.New("sql: driver does not support non-default isolation level")
121 // If a read-only transaction is requested return an error as the
122 // BeginTx driver value is not supported.
124 return nil, errors
.New("sql: driver does not support read-only transactions")
128 txi
, err
:= ci
.Begin()
134 return nil, ctx
.Err()
140 func namedValueToValue(named
[]driver
.NamedValue
) ([]driver
.Value
, error
) {
141 dargs
:= make([]driver
.Value
, len(named
))
142 for n
, param
:= range named
{
143 if len(param
.Name
) > 0 {
144 return nil, errors
.New("sql: driver does not support the use of Named Parameters")
146 dargs
[n
] = param
.Value