Skip to content

Commit b335ed3

Browse files
authored
use binary.LittleEndian (#1651)
Recent Go does inlinine functions well. Using `LittleEndian.Put*` would better for readability and minimize bound check. Additionally, Go 1.19 introduced `LittleEndian.Append*`. It reduce more code.
1 parent 3348e57 commit b335ed3

File tree

2 files changed

+17
-84
lines changed

2 files changed

+17
-84
lines changed

packets.go

+10-62
Original file line numberDiff line numberDiff line change
@@ -329,16 +329,10 @@ func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, plugin string
329329
}
330330

331331
// ClientFlags [32 bit]
332-
data[4] = byte(clientFlags)
333-
data[5] = byte(clientFlags >> 8)
334-
data[6] = byte(clientFlags >> 16)
335-
data[7] = byte(clientFlags >> 24)
332+
binary.LittleEndian.PutUint32(data[4:], uint32(clientFlags))
336333

337334
// MaxPacketSize [32 bit] (none)
338-
data[8] = 0x00
339-
data[9] = 0x00
340-
data[10] = 0x00
341-
data[11] = 0x00
335+
binary.LittleEndian.PutUint32(data[8:], 0)
342336

343337
// Collation ID [1 byte]
344338
data[12] = defaultCollationID
@@ -478,10 +472,7 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error {
478472
data[4] = command
479473

480474
// Add arg [32 bit]
481-
data[5] = byte(arg)
482-
data[6] = byte(arg >> 8)
483-
data[7] = byte(arg >> 16)
484-
data[8] = byte(arg >> 24)
475+
binary.LittleEndian.PutUint32(data[5:], arg)
485476

486477
// Send CMD packet
487478
return mc.writePacket(data)
@@ -955,14 +946,10 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
955946
data[4] = comStmtSendLongData
956947

957948
// Add stmtID [32 bit]
958-
data[5] = byte(stmt.id)
959-
data[6] = byte(stmt.id >> 8)
960-
data[7] = byte(stmt.id >> 16)
961-
data[8] = byte(stmt.id >> 24)
949+
binary.LittleEndian.PutUint32(data[5:], stmt.id)
962950

963951
// Add paramID [16 bit]
964-
data[9] = byte(paramID)
965-
data[10] = byte(paramID >> 8)
952+
binary.LittleEndian.PutUint16(data[9:], uint16(paramID))
966953

967954
// Send CMD packet
968955
err := stmt.mc.writePacket(data[:4+pktLen])
@@ -1018,19 +1005,13 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
10181005
data[4] = comStmtExecute
10191006

10201007
// statement_id [4 bytes]
1021-
data[5] = byte(stmt.id)
1022-
data[6] = byte(stmt.id >> 8)
1023-
data[7] = byte(stmt.id >> 16)
1024-
data[8] = byte(stmt.id >> 24)
1008+
binary.LittleEndian.PutUint32(data[5:], stmt.id)
10251009

10261010
// flags (0: CURSOR_TYPE_NO_CURSOR) [1 byte]
10271011
data[9] = 0x00
10281012

10291013
// iteration_count (uint32(1)) [4 bytes]
1030-
data[10] = 0x01
1031-
data[11] = 0x00
1032-
data[12] = 0x00
1033-
data[13] = 0x00
1014+
binary.LittleEndian.PutUint32(data[10:], 1)
10341015

10351016
if len(args) > 0 {
10361017
pos := minPktLen
@@ -1084,50 +1065,17 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
10841065
case int64:
10851066
paramTypes[i+i] = byte(fieldTypeLongLong)
10861067
paramTypes[i+i+1] = 0x00
1087-
1088-
if cap(paramValues)-len(paramValues)-8 >= 0 {
1089-
paramValues = paramValues[:len(paramValues)+8]
1090-
binary.LittleEndian.PutUint64(
1091-
paramValues[len(paramValues)-8:],
1092-
uint64(v),
1093-
)
1094-
} else {
1095-
paramValues = append(paramValues,
1096-
uint64ToBytes(uint64(v))...,
1097-
)
1098-
}
1068+
paramValues = binary.LittleEndian.AppendUint64(paramValues, uint64(v))
10991069

11001070
case uint64:
11011071
paramTypes[i+i] = byte(fieldTypeLongLong)
11021072
paramTypes[i+i+1] = 0x80 // type is unsigned
1103-
1104-
if cap(paramValues)-len(paramValues)-8 >= 0 {
1105-
paramValues = paramValues[:len(paramValues)+8]
1106-
binary.LittleEndian.PutUint64(
1107-
paramValues[len(paramValues)-8:],
1108-
uint64(v),
1109-
)
1110-
} else {
1111-
paramValues = append(paramValues,
1112-
uint64ToBytes(uint64(v))...,
1113-
)
1114-
}
1073+
paramValues = binary.LittleEndian.AppendUint64(paramValues, uint64(v))
11151074

11161075
case float64:
11171076
paramTypes[i+i] = byte(fieldTypeDouble)
11181077
paramTypes[i+i+1] = 0x00
1119-
1120-
if cap(paramValues)-len(paramValues)-8 >= 0 {
1121-
paramValues = paramValues[:len(paramValues)+8]
1122-
binary.LittleEndian.PutUint64(
1123-
paramValues[len(paramValues)-8:],
1124-
math.Float64bits(v),
1125-
)
1126-
} else {
1127-
paramValues = append(paramValues,
1128-
uint64ToBytes(math.Float64bits(v))...,
1129-
)
1130-
}
1078+
paramValues = binary.LittleEndian.AppendUint64(paramValues, math.Float64bits(v))
11311079

11321080
case bool:
11331081
paramTypes[i+i] = byte(fieldTypeTiny)

utils.go

+7-22
Original file line numberDiff line numberDiff line change
@@ -502,19 +502,6 @@ func getUint24(data []byte) int {
502502
return int(data[2])<<16 | int(data[1])<<8 | int(data[0])
503503
}
504504

505-
func uint64ToBytes(n uint64) []byte {
506-
return []byte{
507-
byte(n),
508-
byte(n >> 8),
509-
byte(n >> 16),
510-
byte(n >> 24),
511-
byte(n >> 32),
512-
byte(n >> 40),
513-
byte(n >> 48),
514-
byte(n >> 56),
515-
}
516-
}
517-
518505
func uint64ToString(n uint64) []byte {
519506
var a [20]byte
520507
i := 20
@@ -598,18 +585,15 @@ func readLengthEncodedInteger(b []byte) (uint64, bool, int) {
598585

599586
// 252: value of following 2
600587
case 0xfc:
601-
return uint64(b[1]) | uint64(b[2])<<8, false, 3
588+
return uint64(binary.LittleEndian.Uint16(b[1:])), false, 3
602589

603590
// 253: value of following 3
604591
case 0xfd:
605-
return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16, false, 4
592+
return uint64(getUint24(b[1:])), false, 4
606593

607594
// 254: value of following 8
608595
case 0xfe:
609-
return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 |
610-
uint64(b[4])<<24 | uint64(b[5])<<32 | uint64(b[6])<<40 |
611-
uint64(b[7])<<48 | uint64(b[8])<<56,
612-
false, 9
596+
return uint64(binary.LittleEndian.Uint64(b[1:])), false, 9
613597
}
614598

615599
// 0-250: value of first byte
@@ -623,13 +607,14 @@ func appendLengthEncodedInteger(b []byte, n uint64) []byte {
623607
return append(b, byte(n))
624608

625609
case n <= 0xffff:
626-
return append(b, 0xfc, byte(n), byte(n>>8))
610+
b = append(b, 0xfc)
611+
return binary.LittleEndian.AppendUint16(b, uint16(n))
627612

628613
case n <= 0xffffff:
629614
return append(b, 0xfd, byte(n), byte(n>>8), byte(n>>16))
630615
}
631-
return append(b, 0xfe, byte(n), byte(n>>8), byte(n>>16), byte(n>>24),
632-
byte(n>>32), byte(n>>40), byte(n>>48), byte(n>>56))
616+
b = append(b, 0xfe)
617+
return binary.LittleEndian.AppendUint64(b, n)
633618
}
634619

635620
func appendLengthEncodedString(b []byte, s string) []byte {

0 commit comments

Comments
 (0)