@@ -29,7 +29,7 @@ func (mc *mysqlConn) readPacket() (data []byte, err error) {
2929 data = make ([]byte , 4 )
3030 err = mc .buf .read (data )
3131 if err != nil {
32- errLog .Print (err )
32+ errLog .Print (err . Error () )
3333 return nil , driver .ErrBadConn
3434 }
3535
@@ -40,7 +40,8 @@ func (mc *mysqlConn) readPacket() (data []byte, err error) {
4040 pktLen |= uint32 (data [2 ]) << 16
4141
4242 if pktLen == 0 {
43- return nil , err
43+ errLog .Print (errMalformPkt .Error ())
44+ return nil , driver .ErrBadConn
4445 }
4546
4647 // Check Packet Sync
@@ -59,7 +60,7 @@ func (mc *mysqlConn) readPacket() (data []byte, err error) {
5960 if err == nil {
6061 return data , nil
6162 }
62- errLog .Print (err )
63+ errLog .Print (err . Error () )
6364 return nil , driver .ErrBadConn
6465}
6566
@@ -74,9 +75,9 @@ func (mc *mysqlConn) writePacket(data []byte) error {
7475 }
7576
7677 if err == nil { // n != len(data)
77- errLog .Print (errMalformPkt )
78+ errLog .Print (errMalformPkt . Error () )
7879 } else {
79- errLog .Print (err )
80+ errLog .Print (err . Error () )
8081 }
8182 return driver .ErrBadConn
8283}
@@ -103,7 +104,7 @@ func (mc *mysqlConn) readInitPacket() (err error) {
103104
104105 // server version [null terminated string]
105106 // connection id [4 bytes]
106- pos := 1 + ( bytes .IndexByte (data [1 :], 0x00 ) + 1 ) + 4
107+ pos := 1 + bytes .IndexByte (data [1 :], 0x00 ) + 1 + 4
107108
108109 // first part of scramble buffer [8 bytes]
109110 mc .scrambleBuff = data [pos : pos + 8 ]
@@ -287,45 +288,43 @@ func (mc *mysqlConn) writeCommandPacketUint32(command commandType, arg uint32) e
287288// Returns error if Packet is not an 'Result OK'-Packet
288289func (mc * mysqlConn ) readResultOK () error {
289290 data , err := mc .readPacket ()
290- if err ! = nil {
291- return err
292- }
293-
294- switch data [ 0 ] {
295- // OK
296- case 0 :
297- mc . handleOkPacket ( data )
298- return nil
299- // EOF, someone is using old_passwords
300- case 254 :
301- return errOldPassword
291+ if err = = nil {
292+ switch data [ 0 ] {
293+ // OK
294+ case 0 :
295+ mc . handleOkPacket ( data )
296+ return nil
297+ // EOF, someone is using old_passwords
298+ case 254 :
299+ return errOldPassword
300+ }
301+ // ERROR
302+ return mc . handleErrorPacket ( data )
302303 }
303- // ERROR
304- return mc .handleErrorPacket (data )
304+ return err
305305}
306306
307307// Result Set Header Packet
308308// http://dev.mysql.com/doc/internals/en/text-protocol.html#packet-ProtocolText::Resultset
309309func (mc * mysqlConn ) readResultSetHeaderPacket () (int , error ) {
310310 data , err := mc .readPacket ()
311- if err != nil {
312- return 0 , err
313- }
311+ if err == nil {
312+ if data [0 ] == 0 {
313+ mc .handleOkPacket (data )
314+ return 0 , nil
315+ } else if data [0 ] == 255 {
316+ return 0 , mc .handleErrorPacket (data )
317+ }
314318
315- if data [0 ] == 0 {
316- mc .handleOkPacket (data )
317- return 0 , nil
318- } else if data [0 ] == 255 {
319- return 0 , mc .handleErrorPacket (data )
320- }
319+ // column count
320+ num , _ , n := readLengthEncodedInteger (data )
321+ if n - len (data ) == 0 {
322+ return int (num ), nil
323+ }
321324
322- // column count
323- num , _ , n := readLengthEncodedInteger (data )
324- if n - len (data ) == 0 {
325- return int (num ), nil
325+ return 0 , errMalformPkt
326326 }
327-
328- return 0 , errMalformPkt
327+ return 0 , err
329328}
330329
331330// Error Packet
@@ -487,18 +486,17 @@ func (rows *mysqlRows) readRow(dest []driver.Value) (err error) {
487486}
488487
489488// Reads Packets until EOF-Packet or an Error appears. Returns count of Packets read
490- func (mc * mysqlConn ) readUntilEOF () (count uint64 , err error ) {
489+ func (mc * mysqlConn ) readUntilEOF () (err error ) {
491490 var data []byte
492491
493492 for {
494493 data , err = mc .readPacket ()
495494
496- // Err or EOF Packet
497- if err != nil || (data [0 ] == 254 && len (data ) = = 5 ) {
498- return
495+ // No Err and no EOF Packet
496+ if err == nil && (data [0 ] != 254 || len (data ) ! = 5 ) {
497+ continue
499498 }
500-
501- count ++
499+ return
502500 }
503501 return
504502}
@@ -511,35 +509,32 @@ func (mc *mysqlConn) readUntilEOF() (count uint64, err error) {
511509// http://dev.mysql.com/doc/internals/en/prepared-statements.html#com-stmt-prepare-response
512510func (stmt * mysqlStmt ) readPrepareResultPacket () (columnCount uint16 , err error ) {
513511 data , err := stmt .mc .readPacket ()
514- if err != nil {
515- return
516- }
517-
518- // Position
519- pos := 0
520-
521- // packet marker [1 byte]
522- if data [pos ] != 0 { // not OK (0) ?
523- err = stmt .mc .handleErrorPacket (data )
524- return
525- }
526- pos ++
512+ if err == nil {
513+ // Position
514+ pos := 0
527515
528- // statement id [4 bytes]
529- stmt .id = binary .LittleEndian .Uint32 (data [pos : pos + 4 ])
530- pos += 4
516+ // packet marker [1 byte]
517+ if data [pos ] != 0 { // not OK (0) ?
518+ err = stmt .mc .handleErrorPacket (data )
519+ return
520+ }
521+ pos ++
531522
532- // Column count [16 bit uint ]
533- columnCount = binary .LittleEndian .Uint16 (data [pos : pos + 2 ])
534- pos += 2
523+ // statement id [4 bytes ]
524+ stmt . id = binary .LittleEndian .Uint32 (data [pos : pos + 4 ])
525+ pos += 4
535526
536- // Param count [16 bit uint]
537- stmt . paramCount = int ( binary .LittleEndian .Uint16 (data [pos : pos + 2 ]) )
538- pos += 2
527+ // Column count [16 bit uint]
528+ columnCount = binary .LittleEndian .Uint16 (data [pos : pos + 2 ])
529+ pos += 2
539530
540- // Warning count [16 bit uint]
541- // bytesToUint16(data[pos : pos+2])
531+ // Param count [16 bit uint]
532+ stmt .paramCount = int (binary .LittleEndian .Uint16 (data [pos : pos + 2 ]))
533+ pos += 2
542534
535+ // Warning count [16 bit uint]
536+ // bytesToUint16(data[pos : pos+2])
537+ }
543538 return
544539}
545540
0 commit comments