Skip to content

Commit 96a4f13

Browse files
committedApr 21, 2013
return byte slice directly from buffer
Updates go-sql-driver#52
1 parent 0e8690a commit 96a4f13

File tree

2 files changed

+30
-22
lines changed

2 files changed

+30
-22
lines changed
 

‎buffer.go

+27-17
Original file line numberDiff line numberDiff 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
}

‎packets.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,14 @@ import (
2626
// Read packet to buffer 'data'
2727
func (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

0 commit comments

Comments
 (0)
Please sign in to comment.