package sql
import (
"context"
"database/sql/driver"
"errors"
)
func ctxDriverPrepare (ctx context .Context , ci driver .Conn , query string ) (driver .Stmt , error ) {
if ciCtx , is := ci .(driver .ConnPrepareContext ); is {
return ciCtx .PrepareContext (ctx , query )
}
si , err := ci .Prepare (query )
if err == nil {
select {
default :
case <- ctx .Done ():
si .Close ()
return nil , ctx .Err ()
}
}
return si , err
}
func ctxDriverExec (ctx context .Context , execerCtx driver .ExecerContext , execer driver .Execer , query string , nvdargs []driver .NamedValue ) (driver .Result , error ) {
if execerCtx != nil {
return execerCtx .ExecContext (ctx , query , nvdargs )
}
dargs , err := namedValueToValue (nvdargs )
if err != nil {
return nil , err
}
select {
default :
case <- ctx .Done ():
return nil , ctx .Err ()
}
return execer .Exec (query , dargs )
}
func ctxDriverQuery (ctx context .Context , queryerCtx driver .QueryerContext , queryer driver .Queryer , query string , nvdargs []driver .NamedValue ) (driver .Rows , error ) {
if queryerCtx != nil {
return queryerCtx .QueryContext (ctx , query , nvdargs )
}
dargs , err := namedValueToValue (nvdargs )
if err != nil {
return nil , err
}
select {
default :
case <- ctx .Done ():
return nil , ctx .Err ()
}
return queryer .Query (query , dargs )
}
func ctxDriverStmtExec (ctx context .Context , si driver .Stmt , nvdargs []driver .NamedValue ) (driver .Result , error ) {
if siCtx , is := si .(driver .StmtExecContext ); is {
return siCtx .ExecContext (ctx , nvdargs )
}
dargs , err := namedValueToValue (nvdargs )
if err != nil {
return nil , err
}
select {
default :
case <- ctx .Done ():
return nil , ctx .Err ()
}
return si .Exec (dargs )
}
func ctxDriverStmtQuery (ctx context .Context , si driver .Stmt , nvdargs []driver .NamedValue ) (driver .Rows , error ) {
if siCtx , is := si .(driver .StmtQueryContext ); is {
return siCtx .QueryContext (ctx , nvdargs )
}
dargs , err := namedValueToValue (nvdargs )
if err != nil {
return nil , err
}
select {
default :
case <- ctx .Done ():
return nil , ctx .Err ()
}
return si .Query (dargs )
}
func ctxDriverBegin (ctx context .Context , opts *TxOptions , ci driver .Conn ) (driver .Tx , error ) {
if ciCtx , is := ci .(driver .ConnBeginTx ); is {
dopts := driver .TxOptions {}
if opts != nil {
dopts .Isolation = driver .IsolationLevel (opts .Isolation )
dopts .ReadOnly = opts .ReadOnly
}
return ciCtx .BeginTx (ctx , dopts )
}