diff --git a/buffer.go b/buffer.go deleted file mode 100644 index 191c14855..000000000 --- a/buffer.go +++ /dev/null @@ -1,85 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 Julien Schmidt. All rights reserved. -// http://www.julienschmidt.com -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "io" -) - -const ( - defaultBufSize = 4096 -) - -type buffer struct { - buf []byte - rd io.Reader - idx int - length int -} - -func newBuffer(rd io.Reader) *buffer { - return &buffer{ - buf: make([]byte, defaultBufSize), - rd: rd, - } -} - -// fill reads at least _need_ bytes in the buffer -// existing data in the buffer gets lost -func (b *buffer) fill(need int) (err error) { - b.idx = 0 - b.length = 0 - - var n int - for b.length < need { - n, err = b.rd.Read(b.buf[b.length:]) - b.length += n - - if err == nil { - continue - } - return // err - } - - return -} - -// read len(p) bytes -func (b *buffer) read(p []byte) (err error) { - need := len(p) - - if b.length < need { - if b.length > 0 { - copy(p[0:b.length], b.buf[b.idx:]) - need -= b.length - p = p[b.length:] - - b.idx = 0 - b.length = 0 - } - - if need >= len(b.buf) { - var n int - has := 0 - for err == nil && need > has { - n, err = b.rd.Read(p[has:]) - has += n - } - return - } - - err = b.fill(need) // err deferred - } - - copy(p, b.buf[b.idx:]) - b.idx += need - b.length -= need - return -} diff --git a/connection.go b/connection.go index 3531595fc..3ec060d96 100644 --- a/connection.go +++ b/connection.go @@ -10,6 +10,7 @@ package mysql import ( + "bufio" "database/sql/driver" "errors" "net" @@ -22,7 +23,7 @@ type mysqlConn struct { charset byte cipher []byte netConn net.Conn - buf *buffer + buf *bufio.Reader protocol uint8 sequence uint8 affectedRows uint64 diff --git a/driver.go b/driver.go index 4b699b1f0..f6f42660e 100644 --- a/driver.go +++ b/driver.go @@ -9,6 +9,7 @@ package mysql import ( + "bufio" "database/sql" "database/sql/driver" "net" @@ -43,7 +44,7 @@ func (d *mysqlDriver) Open(dsn string) (driver.Conn, error) { if err != nil { return nil, err } - mc.buf = newBuffer(mc.netConn) + mc.buf = bufio.NewReader(mc.netConn) // Reading Handshake Initialization Packet err = mc.readInitPacket() diff --git a/packets.go b/packets.go index 7c56245de..20324b963 100644 --- a/packets.go +++ b/packets.go @@ -27,7 +27,7 @@ import ( func (mc *mysqlConn) readPacket() (data []byte, err error) { // Read packet header data = make([]byte, 4) - err = mc.buf.read(data) + _, err = io.ReadAtLeast(mc.buf, data, len(data)) if err != nil { errLog.Print(err.Error()) return nil, driver.ErrBadConn @@ -53,7 +53,7 @@ func (mc *mysqlConn) readPacket() (data []byte, err error) { // Read packet body [pktLen bytes] data = make([]byte, pktLen) - err = mc.buf.read(data) + _, err = io.ReadAtLeast(mc.buf, data, len(data)) if err == nil { if pktLen < maxPacketSize { return data, nil