github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/xsql/stmt.go (about) 1 package xsql 2 3 import ( 4 "context" 5 "database/sql/driver" 6 "fmt" 7 8 "github.com/ydb-platform/ydb-go-sdk/v3/internal/stack" 9 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" 10 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/badconn" 11 "github.com/ydb-platform/ydb-go-sdk/v3/trace" 12 ) 13 14 type stmt struct { 15 conn *conn 16 processor interface { 17 driver.ExecerContext 18 driver.QueryerContext 19 } 20 query string 21 ctx context.Context //nolint:containedctx 22 23 trace *trace.DatabaseSQL 24 } 25 26 var ( 27 _ driver.Stmt = &stmt{} 28 _ driver.StmtQueryContext = &stmt{} 29 _ driver.StmtExecContext = &stmt{} 30 ) 31 32 func (stmt *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (_ driver.Rows, finalErr error) { 33 onDone := trace.DatabaseSQLOnStmtQuery(stmt.trace, &ctx, 34 stack.FunctionID("github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql.(*stmt).QueryContext"), 35 stmt.ctx, stmt.query, 36 ) 37 defer func() { 38 onDone(finalErr) 39 }() 40 if !stmt.conn.isReady() { 41 return nil, badconn.Map(xerrors.WithStackTrace(errNotReadyConn)) 42 } 43 switch m := queryModeFromContext(ctx, stmt.conn.defaultQueryMode); m { 44 case DataQueryMode: 45 return stmt.processor.QueryContext(stmt.conn.withKeepInCache(ctx), stmt.query, args) 46 default: 47 return nil, fmt.Errorf("unsupported query mode '%s' for execute query on prepared statement", m) 48 } 49 } 50 51 func (stmt *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (_ driver.Result, finalErr error) { 52 onDone := trace.DatabaseSQLOnStmtExec(stmt.trace, &ctx, 53 stack.FunctionID("github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql.(*stmt).ExecContext"), 54 stmt.ctx, stmt.query, 55 ) 56 defer func() { 57 onDone(finalErr) 58 }() 59 if !stmt.conn.isReady() { 60 return nil, badconn.Map(xerrors.WithStackTrace(errNotReadyConn)) 61 } 62 switch m := queryModeFromContext(ctx, stmt.conn.defaultQueryMode); m { 63 case DataQueryMode: 64 return stmt.processor.ExecContext(stmt.conn.withKeepInCache(ctx), stmt.query, args) 65 default: 66 return nil, fmt.Errorf("unsupported query mode '%s' for execute query on prepared statement", m) 67 } 68 } 69 70 func (stmt *stmt) NumInput() int { 71 return -1 72 } 73 74 func (stmt *stmt) Close() (finalErr error) { 75 var ( 76 ctx = stmt.ctx 77 onDone = trace.DatabaseSQLOnStmtClose(stmt.trace, &ctx, 78 stack.FunctionID("github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql.(*stmt).Close"), 79 ) 80 ) 81 defer func() { 82 onDone(finalErr) 83 }() 84 85 return nil 86 } 87 88 func (stmt *stmt) Exec([]driver.Value) (driver.Result, error) { 89 return nil, errDeprecated 90 } 91 92 func (stmt *stmt) Query([]driver.Value) (driver.Rows, error) { 93 return nil, errDeprecated 94 }