forked from dataux/dataux
/
conn_stmt.go
87 lines (67 loc) · 1.51 KB
/
conn_stmt.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
package proxy
import (
"github.com/dataux/dataux/vendored/mixer/mysql"
"github.com/dataux/dataux/vendored/mixer/sqlparser"
)
var paramFieldData []byte
var columnFieldData []byte
func init() {
var p = &mysql.Field{Name: []byte("?")}
var c = &mysql.Field{}
paramFieldData = p.Dump()
columnFieldData = c.Dump()
}
type Stmt struct {
id uint32
params int
columns int
args []interface{}
s sqlparser.Statement
sql string
}
func (s *Stmt) ResetParams() {
s.args = make([]interface{}, s.params)
}
func (c *Conn) writePrepare(s *Stmt) error {
data := make([]byte, 4, 128)
//status ok
data = append(data, 0)
//stmt id
data = append(data, mysql.Uint32ToBytes(s.id)...)
//number columns
data = append(data, mysql.Uint16ToBytes(uint16(s.columns))...)
//number params
data = append(data, mysql.Uint16ToBytes(uint16(s.params))...)
//filter [00]
data = append(data, 0)
//warning count
data = append(data, 0, 0)
if err := c.WritePacket(data); err != nil {
return err
}
if s.params > 0 {
for i := 0; i < s.params; i++ {
data = data[0:4]
data = append(data, []byte(paramFieldData)...)
if err := c.WritePacket(data); err != nil {
return err
}
}
if err := c.WriteEOF(c.Status); err != nil {
return err
}
}
if s.columns > 0 {
for i := 0; i < s.columns; i++ {
data = data[0:4]
data = append(data, []byte(columnFieldData)...)
if err := c.WritePacket(data); err != nil {
return err
}
}
if err := c.WriteEOF(c.Status); err != nil {
return err
}
}
return nil
}