package sqlrite
import "C"
import (
"context"
"database/sql/driver"
"errors"
)
type stmt struct {
conn *conn
sql string
}
var _ driver.Stmt = (*stmt)(nil)
var _ driver.StmtExecContext = (*stmt)(nil)
var _ driver.StmtQueryContext = (*stmt)(nil)
func (s *stmt) Close() error {
s.conn = nil
return nil
}
func (s *stmt) NumInput() int { return -1 }
func (s *stmt) Exec(args []driver.Value) (driver.Result, error) {
if err := rejectParamsForNow(args); err != nil {
return nil, err
}
return s.ExecContext(context.Background(), valuesToNamed(args))
}
func (s *stmt) ExecContext(_ context.Context, args []driver.NamedValue) (driver.Result, error) {
if err := rejectNamedParamsForNow(args); err != nil {
return nil, err
}
if s.conn == nil {
return nil, errors.New("sqlrite: stmt is closed")
}
if err := s.conn.exec(s.sql); err != nil {
return nil, err
}
return execResult{}, nil
}
func (s *stmt) Query(args []driver.Value) (driver.Rows, error) {
if err := rejectParamsForNow(args); err != nil {
return nil, err
}
return s.QueryContext(context.Background(), valuesToNamed(args))
}
func valuesToNamed(args []driver.Value) []driver.NamedValue {
out := make([]driver.NamedValue, len(args))
for i, v := range args {
out[i] = driver.NamedValue{Ordinal: i + 1, Value: v}
}
return out
}
func (s *stmt) QueryContext(_ context.Context, args []driver.NamedValue) (driver.Rows, error) {
if err := rejectNamedParamsForNow(args); err != nil {
return nil, err
}
if s.conn == nil {
return nil, errors.New("sqlrite: stmt is closed")
}
if !isSelect(s.sql) {
return nil, errors.New("sqlrite: Query called on a non-SELECT statement — use Exec")
}
return s.conn.query(s.sql)
}