-
Notifications
You must be signed in to change notification settings - Fork 0
/
response.go
87 lines (79 loc) · 1.87 KB
/
response.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 mconn
import "github.com/juju/errors"
// readResponse parses the response data, all response data is start with the flag
// the query response can be one of <ERR PACKET> <OK PACKET> <LOCAL_INFILE REQUEST> <ResultSet>
// https://dev.mysql.com/doc/internals/en/com-query-response.html
func (c *Conn) readResponse(options *responseOptions) (*PacketOK, error) {
rspData, err := c.ReadPacket()
if nil != err {
return nil, errors.Trace(err)
}
switch rspData[0] {
case PacketHeaderOK:
{
pok, err := c.readPacketOK(rspData)
if nil != err {
return nil, errors.Trace(err)
}
return pok, nil
}
case PacketHeaderERR:
{
perr, err := c.readPacketERR(rspData)
if nil != err {
return nil, errors.Trace(err)
}
return nil, errors.New(perr.ErrorMessage)
}
case PacketHeaderLocalInFile:
{
return nil, ErrMalformPacket
}
}
// Read the following result set
return c.readResultSet(rspData, options)
}
func (c *Conn) readPacketOK(data []byte) (*PacketOK, error) {
var pok PacketOK
pok.capabilityFlags = c.capability
if err := pok.Decode(data); nil != err {
return nil, errors.Trace(err)
}
return &pok, nil
}
func (c *Conn) readPacketERR(data []byte) (*PacketErr, error) {
var perr PacketErr
perr.capabilityFlags = c.capability
if err := perr.Decode(data); nil != err {
return nil, errors.Trace(err)
}
return &perr, nil
}
func (c *Conn) readOK() (*PacketOK, error) {
rspData, err := c.ReadPacket()
if nil != err {
return nil, errors.Trace(err)
}
switch rspData[0] {
case PacketHeaderOK:
{
pok, err := c.readPacketOK(rspData)
if nil != err {
return nil, errors.Trace(err)
}
return pok, nil
}
case PacketHeaderERR:
{
perr, err := c.readPacketERR(rspData)
if nil != err {
return nil, errors.Trace(err)
}
return nil, errors.New(perr.ErrorMessage)
}
default:
{
return nil, ErrMalformPacket
}
}
}