MCPcopy
hub / github.com/go-sql-driver/mysql / readRow

Method readRow

packets.go:1266–1451  ·  view source on GitHub ↗

https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_binary_resultset.html#sect_protocol_binary_resultset_row

(dest []driver.Value)

Source from the content-addressed store, hash-verified

1264
1265// https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_binary_resultset.html#sect_protocol_binary_resultset_row
1266func (rows *binaryRows) readRow(dest []driver.Value) error {
1267 data, err := rows.mc.readPacket()
1268 if err != nil {
1269 return err
1270 }
1271
1272 // packet indicator [1 byte]
1273 if data[0] != iOK {
1274 // EOF/OK Packet
1275 if data[0] == iEOF {
1276 if rows.mc.capabilities&clientDeprecateEOF == 0 {
1277 // EOF packet
1278 rows.mc.status = readStatus(data[3:])
1279 } else {
1280 // OK Packet with an 0xFE header
1281 _, _, n := readLengthEncodedInteger(data[1:])
1282 _, _, m := readLengthEncodedInteger(data[1+n:])
1283 rows.mc.status = readStatus(data[1+n+m:])
1284 }
1285 rows.rs.done = true
1286 if !rows.HasNextResultSet() {
1287 rows.mc = nil
1288 }
1289 return io.EOF
1290 }
1291 mc := rows.mc
1292 rows.mc = nil
1293
1294 // Error otherwise
1295 return mc.handleErrorPacket(data)
1296 }
1297
1298 // NULL-bitmap, [(column-count + 7 + 2) / 8 bytes]
1299 pos := 1 + (len(dest)+7+2)>>3
1300 nullMask := data[1:pos]
1301
1302 for i := range dest {
1303 // Field is NULL
1304 // (byte >> bit-pos) % 2 == 1
1305 if ((nullMask[(i+2)>>3] >> uint((i+2)&7)) & 1) == 1 {
1306 dest[i] = nil
1307 continue
1308 }
1309
1310 // Convert to byte-coded string
1311 switch rows.rs.columns[i].fieldType {
1312 case fieldTypeNULL:
1313 dest[i] = nil
1314 continue
1315
1316 // Numeric Types
1317 case fieldTypeTiny:
1318 if rows.rs.columns[i].flags&flagUnsigned != 0 {
1319 dest[i] = int64(data[pos])
1320 } else {
1321 dest[i] = int64(int8(data[pos]))
1322 }
1323 pos++

Callers 1

NextMethod · 0.95

Calls 10

readStatusFunction · 0.85
readLengthEncodedIntegerFunction · 0.85
uint64ToStringFunction · 0.85
readLengthEncodedStringFunction · 0.85
formatBinaryTimeFunction · 0.85
parseBinaryDateTimeFunction · 0.85
formatBinaryDateTimeFunction · 0.85
readPacketMethod · 0.80
HasNextResultSetMethod · 0.80
handleErrorPacketMethod · 0.80

Tested by

no test coverage detected