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 )
}
if opts != nil {
if opts .Isolation != LevelDefault {
return nil , errors .New ("sql: driver does not support non-default isolation level" )
}
if opts .ReadOnly {
return nil , errors .New ("sql: driver does not support read-only transactions" )
}
}
if ctx .Done () == nil {
return ci .Begin ()
}
txi , err := ci .Begin ()
if err == nil {
select {
default :
case <- ctx .Done ():
txi .Rollback ()
return nil , ctx .Err ()
}
}
return txi , err
}
func namedValueToValue(named []driver .NamedValue ) ([]driver .Value , error ) {
dargs := make ([]driver .Value , len (named ))
for n , param := range named {
if len (param .Name ) > 0 {
return nil , errors .New ("sql: driver does not support the use of Named Parameters" )
}
dargs [n ] = param .Value
}
return dargs , nil
}
The pages are generated with Golds v0.7.0-preview . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .