File tree Expand file tree Collapse file tree 2 files changed +30
-22
lines changed Expand file tree Collapse file tree 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) {
5151 return
5252}
5353
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
5763
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
5969 if b .length > 0 {
6070 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
6473 b .idx = 0
6574 b .length = 0
6675 }
6776
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 {
6986 var n int
70- has := 0
71- for err == nil && need > has {
87+ for err == nil && need > 0 {
7288 n , err = b .rd .Read (p [has :])
7389 has += n
90+ need -= n
7491 }
75- return
7692 }
77-
78- err = b .fill (need ) // err deferred
7993 }
80-
81- copy (p , b .buf [b .idx :])
82- b .idx += need
83- b .length -= need
8494 return
8595}
Original file line number Diff line number Diff line change @@ -26,15 +26,14 @@ import (
2626// Read packet to buffer 'data'
2727func (mc * mysqlConn ) readPacket () (data []byte , err error ) {
2828 // Read packet header
29- data = make ([]byte , 4 )
30- err = mc .buf .read (data )
29+ data , err = mc .buf .readNext (4 )
3130 if err != nil {
3231 errLog .Print (err .Error ())
3332 return nil , driver .ErrBadConn
3433 }
3534
3635 // 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 )
3837
3938 if pktLen < 1 {
4039 errLog .Print (errMalformPkt .Error ())
@@ -52,8 +51,7 @@ func (mc *mysqlConn) readPacket() (data []byte, err error) {
5251 mc .sequence ++
5352
5453 // Read packet body [pktLen bytes]
55- data = make ([]byte , pktLen )
56- err = mc .buf .read (data )
54+ data , err = mc .buf .readNext (pktLen )
5755 if err == nil {
5856 if pktLen < maxPacketSize {
5957 return data , nil
You can’t perform that action at this time.
0 commit comments