File tree 2 files changed +30
-22
lines changed
2 files changed +30
-22
lines changed Original file line number Diff line number Diff line change @@ -51,35 +51,45 @@ func (b *buffer) fill(need int) (err error) {
51
51
return
52
52
}
53
53
54
- // read len(p) bytes
55
- func (b * buffer ) read (p []byte ) (err error ) {
56
- need := len (p )
54
+ // returns next N bytes from buffer.
55
+ // The returned slice is only guaranteed to be valid until the next read
56
+ func (b * buffer ) readNext (need int ) (p []byte , err error ) {
57
+ // return slice from buffer if possible
58
+ if b .length >= need {
59
+ p = b .buf [b .idx : b .idx + need ]
60
+ b .idx += need
61
+ b .length -= need
62
+ return
57
63
58
- if b .length < need {
64
+ } else {
65
+ p = make ([]byte , need )
66
+ has := 0
67
+
68
+ // copy data that is already in the buffer
59
69
if b .length > 0 {
60
70
copy (p [0 :b .length ], b .buf [b .idx :])
61
- need -= b .length
62
- p = p [b .length :]
63
-
71
+ has = b .length
72
+ need -= has
64
73
b .idx = 0
65
74
b .length = 0
66
75
}
67
76
68
- if need >= len (b .buf ) {
77
+ // does the data fit into the buffer?
78
+ if need < len (b .buf ) {
79
+ err = b .fill (need ) // err deferred
80
+ copy (p [has :has + need ], b .buf [b .idx :])
81
+ b .idx += need
82
+ b .length -= need
83
+ return
84
+
85
+ } else {
69
86
var n int
70
- has := 0
71
- for err == nil && need > has {
87
+ for err == nil && need > 0 {
72
88
n , err = b .rd .Read (p [has :])
73
89
has += n
90
+ need -= n
74
91
}
75
- return
76
92
}
77
-
78
- err = b .fill (need ) // err deferred
79
93
}
80
-
81
- copy (p , b .buf [b .idx :])
82
- b .idx += need
83
- b .length -= need
84
94
return
85
95
}
Original file line number Diff line number Diff line change @@ -26,15 +26,14 @@ import (
26
26
// Read packet to buffer 'data'
27
27
func (mc * mysqlConn ) readPacket () (data []byte , err error ) {
28
28
// Read packet header
29
- data = make ([]byte , 4 )
30
- err = mc .buf .read (data )
29
+ data , err = mc .buf .readNext (4 )
31
30
if err != nil {
32
31
errLog .Print (err .Error ())
33
32
return nil , driver .ErrBadConn
34
33
}
35
34
36
35
// Packet Length [24 bit]
37
- pktLen := uint32 (data [0 ]) | uint32 (data [1 ])<< 8 | uint32 (data [2 ])<< 16
36
+ pktLen := int ( uint32 (data [0 ]) | uint32 (data [1 ])<< 8 | uint32 (data [2 ])<< 16 )
38
37
39
38
if pktLen < 1 {
40
39
errLog .Print (errMalformPkt .Error ())
@@ -52,8 +51,7 @@ func (mc *mysqlConn) readPacket() (data []byte, err error) {
52
51
mc .sequence ++
53
52
54
53
// Read packet body [pktLen bytes]
55
- data = make ([]byte , pktLen )
56
- err = mc .buf .read (data )
54
+ data , err = mc .buf .readNext (pktLen )
57
55
if err == nil {
58
56
if pktLen < maxPacketSize {
59
57
return data , nil
You can’t perform that action at this time.
0 commit comments