WritePacket: data already has 4 bytes header will modify data inplace
(data []byte)
| 177 | // WritePacket: data already has 4 bytes header |
| 178 | // will modify data inplace |
| 179 | func (c *Conn) WritePacket(data []byte) error { |
| 180 | length := len(data) - 4 |
| 181 | |
| 182 | for length >= MaxPayloadLen { |
| 183 | data[0] = 0xff |
| 184 | data[1] = 0xff |
| 185 | data[2] = 0xff |
| 186 | |
| 187 | data[3] = c.Sequence |
| 188 | |
| 189 | if n, err := c.Write(data[:4+MaxPayloadLen]); err != nil { |
| 190 | // return errors.Wrapf(ErrBadConn, "Write(payload portion) failed. err %v", err) |
| 191 | c.pkgErr = ErrBadConn |
| 192 | return ErrBadConn |
| 193 | } else if n != (4 + MaxPayloadLen) { |
| 194 | // return errors.Wrapf(ErrBadConn, "Write(payload portion) failed. only %v bytes written, while %v expected", n, 4+MaxPayloadLen) |
| 195 | c.pkgErr = ErrBadConn |
| 196 | return ErrBadConn |
| 197 | } else { |
| 198 | c.Sequence++ |
| 199 | length -= MaxPayloadLen |
| 200 | data = data[MaxPayloadLen:] |
| 201 | } |
| 202 | } |
| 203 | |
| 204 | data[0] = byte(length) |
| 205 | data[1] = byte(length >> 8) |
| 206 | data[2] = byte(length >> 16) |
| 207 | data[3] = c.Sequence |
| 208 | |
| 209 | if n, err := c.Write(data); err != nil { |
| 210 | // return errors.Wrapf(ErrBadConn, "Write failed. err %v", err) |
| 211 | c.pkgErr = ErrBadConn |
| 212 | return ErrBadConn |
| 213 | } else if n != len(data) { |
| 214 | // return errors.Wrapf(ErrBadConn, "Write failed. only %v bytes written, while %v expected", n, len(data)) |
| 215 | c.pkgErr = ErrBadConn |
| 216 | return ErrBadConn |
| 217 | } else { |
| 218 | c.Sequence++ |
| 219 | return nil |
| 220 | } |
| 221 | } |
| 222 | |
| 223 | // WriteClearAuthPacket: Client clear text authentication packet |
| 224 | // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse |
no outgoing calls
no test coverage detected