(query string)
| 172 | } |
| 173 | |
| 174 | func (c *Conn) Prepare(query string) (*Stmt, error) { |
| 175 | if err := c.writeCommandStr(COM_STMT_PREPARE, query); err != nil { |
| 176 | return nil, errors.Trace(err) |
| 177 | } |
| 178 | |
| 179 | data, err := c.ReadPacket() |
| 180 | if err != nil { |
| 181 | return nil, errors.Trace(err) |
| 182 | } |
| 183 | |
| 184 | if data[0] == ERR_HEADER { |
| 185 | return nil, c.handleErrorPacket(data) |
| 186 | } else if data[0] != OK_HEADER { |
| 187 | return nil, ErrMalformPacket |
| 188 | } |
| 189 | |
| 190 | s := new(Stmt) |
| 191 | s.conn = c |
| 192 | |
| 193 | pos := 1 |
| 194 | |
| 195 | // for statement id |
| 196 | s.id = binary.LittleEndian.Uint32(data[pos:]) |
| 197 | pos += 4 |
| 198 | |
| 199 | // number columns |
| 200 | s.columns = int(binary.LittleEndian.Uint16(data[pos:])) |
| 201 | pos += 2 |
| 202 | |
| 203 | // number params |
| 204 | s.params = int(binary.LittleEndian.Uint16(data[pos:])) |
| 205 | pos += 2 |
| 206 | |
| 207 | // warnings |
| 208 | s.warnings = int(binary.LittleEndian.Uint16(data[pos:])) |
| 209 | pos += 2 |
| 210 | |
| 211 | if s.params > 0 { |
| 212 | if err := s.conn.readUntilEOF(); err != nil { |
| 213 | return nil, errors.Trace(err) |
| 214 | } |
| 215 | } |
| 216 | |
| 217 | if s.columns > 0 { |
| 218 | if err := s.conn.readUntilEOF(); err != nil { |
| 219 | return nil, errors.Trace(err) |
| 220 | } |
| 221 | } |
| 222 | |
| 223 | return s, nil |
| 224 | } |
no test coverage detected