@@ -73,7 +73,6 @@ func (trans *Transport) Run() {
73
73
golog .Warn ("Transport" , "Run" , "client error" , trans .Client .cid , err .Error ())
74
74
return
75
75
}
76
- isQuery := false
77
76
78
77
if len (data ) > 4 {
79
78
cmd := data [4 ]
@@ -85,16 +84,15 @@ func (trans *Transport) Run() {
85
84
trans .clientend .writeOK (nil )
86
85
golog .Warn ("Transport" , "Run" , "client ping" , uint32 (cmd ))
87
86
continue
88
- // case mysql.COM_INIT_DB:
89
- // if err := trans.clientend.useDB(hack.String(data)); err != nil {
90
- // return //err
91
- // } else {
92
- // trans.clientend.writeOK(nil)
93
- // }
94
- // golog.Warn("Transport", "Run", "client change DB", uint32(cmd), string(data[5:]))
95
- // continue
96
- case mysql .COM_QUERY :
97
- isQuery = true
87
+ // case mysql.COM_INIT_DB:
88
+ // if err := trans.clientend.useDB(hack.String(data)); err != nil {
89
+ // return //err
90
+ // } else {
91
+ // trans.clientend.writeOK(nil)
92
+ // }
93
+ // golog.Warn("Transport", "Run", "client change DB", uint32(cmd), string(data[5:]))
94
+ // continue
95
+ //case mysql.COM_QUERY:
98
96
}
99
97
golog .Debug ("Transport" , "Run" , "client command" , uint32 (cmd ), string (data [5 :]))
100
98
}
@@ -107,24 +105,14 @@ func (trans *Transport) Run() {
107
105
}
108
106
109
107
//read response from server
110
- data , err = trans .Server .ReadServerRaw (false )
108
+ data , err = trans .Server .ReadServerRaw ()
111
109
golog .Debug ("Transport" , "Run" , "server read " , trans .Server .cid , data )
112
110
113
111
if err != nil {
114
112
golog .Warn ("Transport" , "Run" , "server read error" , trans .Server .cid , err .Error ())
115
113
return
116
114
}
117
115
118
- if isQuery && data [4 ] != mysql .OK_HEADER {
119
- result , err := trans .Server .ReadServerRaw (true )
120
- if err != nil {
121
- golog .Warn ("Transport" , "Run" , "server read error" , trans .Server .cid , err .Error ())
122
- return
123
- }
124
- data = append (data , result ... )
125
- golog .Debug ("Transport" , "Run" , "nest server read " , trans .Server .cid , data )
126
- }
127
-
128
116
// send to client
129
117
err = trans .Client .Write (data )
130
118
if err != nil {
@@ -134,20 +122,12 @@ func (trans *Transport) Run() {
134
122
}
135
123
}
136
124
137
- func (trans * TransPipe ) ReadHeader () ([]byte , error ) {
125
+ func (trans * TransPipe ) ReadPacket () ([]byte , error ) {
138
126
header := []byte {0 , 0 , 0 , 0 }
139
127
140
128
if _ , err := io .ReadFull (trans .pipe , header ); err != nil {
141
129
return nil , mysql .ErrBadConn
142
130
}
143
- return header [:], nil
144
- }
145
-
146
- func (trans * TransPipe ) ReadClientRaw () ([]byte , error ) {
147
- header , err := trans .ReadHeader ()
148
- if err != nil {
149
- return nil , mysql .ErrBadConn
150
- }
151
131
length := int (uint32 (header [0 ]) | uint32 (header [1 ])<< 8 | uint32 (header [2 ])<< 16 )
152
132
if length < 1 {
153
133
return nil , fmt .Errorf ("invalid payload length %d" , length )
@@ -159,41 +139,83 @@ func (trans *TransPipe) ReadClientRaw() ([]byte, error) {
159
139
} else {
160
140
if length < mysql .MaxPayloadLen {
161
141
return append (header [:], data ... ), nil
142
+ }
143
+ var buf []byte
144
+ buf , err = trans .ReadPacket ()
145
+ if err != nil {
146
+ return nil , mysql .ErrBadConn
162
147
} else {
163
- return nil , fmt .Errorf ("invalid payload length %d" , length )
148
+ header = append (header [:], data ... )
149
+ return append (header , buf ... ), nil
164
150
}
165
151
}
166
152
}
167
153
168
- func (trans * TransPipe ) ReadServerRaw (isNested bool ) ([]byte , error ) {
169
- header , err := trans .ReadHeader ()
170
- if err != nil {
154
+ func (trans * TransPipe ) ReadHeader () ([]byte , error ) {
155
+ header := []byte {0 , 0 , 0 , 0 }
156
+
157
+ if _ , err := io .ReadFull (trans .pipe , header ); err != nil {
171
158
return nil , mysql .ErrBadConn
172
159
}
173
- length := int (uint32 (header [0 ]) | uint32 (header [1 ])<< 8 | uint32 (header [2 ])<< 16 )
174
- if length < 1 {
175
- return nil , fmt .Errorf ("invalid payload length %d" , length )
176
- }
177
- data := make ([]byte , length )
178
- if _ , err := io .ReadFull (trans .pipe , data ); err != nil {
179
- return nil , mysql .ErrBadConn
180
- } else {
181
- if data [0 ] == mysql .OK_HEADER && ! isNested {
182
- return append (header [:], data ... ), nil
183
- } else if data [0 ] == mysql .EOF_HEADER && len (data ) <= 5 {
184
- return append (header [:], data ... ), nil
185
- } else {
186
- //need continue read until EOF
187
- var buf []byte
188
- buf , err = trans .ReadServerRaw (true )
189
- if err != nil {
190
- return nil , mysql .ErrBadConn
191
- } else {
192
- header = append (header [:], data ... )
193
- return append (header , buf ... ), nil
194
- }
160
+ return header [:], nil
161
+ }
162
+
163
+ func (trans * TransPipe ) ReadClientRaw () ([]byte , error ) {
164
+ return trans .ReadPacket ()
165
+ }
166
+
167
+ func (trans * TransPipe ) ReadServerColumns () ([]byte , error ) {
168
+ //just read packet
169
+ var result []byte
170
+ for {
171
+ data , err := trans .ReadPacket ()
172
+ if err != nil {
173
+ return nil , err
174
+ }
175
+
176
+ // EOF Packet
177
+ if mysql .IsEOFPacket (data [4 :]) {
178
+ result = append (result , data ... )
179
+ return result , nil
195
180
}
181
+ result = append (result , data ... )
182
+ }
183
+ }
184
+
185
+ func (trans * TransPipe ) ReadServerRows () ([]byte , error ) {
186
+ //now just same to read columns
187
+ return trans .ReadServerColumns ()
188
+ }
189
+
190
+ func (trans * TransPipe ) ReadServerRaw () ([]byte , error ) {
191
+ data , err := trans .ReadPacket ()
192
+ if err != nil {
193
+ return nil , err
194
+ }
195
+
196
+ if data [4 ] == mysql .OK_HEADER {
197
+ return data , nil
198
+ }
199
+
200
+ // must be a result set
201
+ //get column count
202
+ _ , _ , n := mysql .LengthEncodedInt (data [4 :])
203
+ if n - len (data [4 :]) != 0 {
204
+ return nil , mysql .ErrMalformPacket
205
+ }
206
+ //read result columns
207
+ cols , err := trans .ReadServerColumns ()
208
+ if err != nil {
209
+ return nil , err
210
+ }
211
+
212
+ //read result rows
213
+ rows , err := trans .ReadServerRows ()
214
+ if err != nil {
215
+ return nil , err
196
216
}
217
+ data = append (data , cols ... )
218
+ return append (data , rows ... ), nil
197
219
}
198
220
199
221
func (trans * TransPipe ) Write (data []byte ) error {
0 commit comments