-
Notifications
You must be signed in to change notification settings - Fork 0
/
statement.go
113 lines (90 loc) · 2.39 KB
/
statement.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright (c) 2022, Geert JM Vanderkelen
package pxmysql
import (
"context"
"database/sql/driver"
"time"
"github.com/golistic/pxmysql/xmysql"
)
var closeTimeout = time.Second
type statement struct {
prepared *xmysql.Prepared
result *xmysql.Result
}
var (
_ driver.Stmt = &statement{}
_ driver.StmtQueryContext = &statement{}
_ driver.StmtExecContext = &statement{}
)
func (s *statement) Close() error {
ctx, cancel := context.WithTimeout(context.Background(), closeTimeout)
defer cancel()
if err := s.prepared.Deallocate(ctx); err != nil {
return err
} else {
s.prepared = nil
s.result = nil
}
return nil
}
// NumInput returns the number of placeholders.
func (s *statement) NumInput() int {
if s.prepared != nil {
return s.prepared.NumPlaceholders()
}
return 0
}
// Exec executes a query that doesn't return rows, such as an INSERT or UPDATE.
// Deprecated: use ExecContext instead.
func (s *statement) Exec(args []driver.Value) (driver.Result, error) {
named := make([]driver.NamedValue, len(args))
for i, arg := range args {
named[i].Name = ""
named[i].Ordinal = i + 1
named[i].Value = arg
}
return s.ExecContext(context.Background(), named)
}
func (s *statement) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) {
execArgs := make([]any, len(args))
for i, a := range args {
execArgs[i] = a.Value
}
execResult, err := s.prepared.Execute(ctx, execArgs...)
if err != nil {
return nil, handleError(err)
}
res := &result{
xpresult: execResult,
}
return res, nil
}
// Query executes a query that may return rows, such as a SELECT.
// Deprecated: use QueryContext instead.
func (s *statement) Query(args []driver.Value) (driver.Rows, error) {
named := make([]driver.NamedValue, len(args))
for i, arg := range args {
named[i].Name = ""
named[i].Ordinal = i + 1
named[i].Value = arg
}
return s.QueryContext(context.Background(), named)
}
// QueryContext executes a query that may return rows, such as a SELECT.
func (s *statement) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) {
execArgs := make([]any, len(args))
for i, a := range args {
execArgs[i] = a
}
execResult, err := s.prepared.Execute(ctx, execArgs...)
if err != nil {
return nil, handleError(err)
}
if len(execResult.Rows) == 0 {
return &rows{}, nil
}
r := &rows{
xpresult: execResult,
}
return r, nil
}