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  }