Skip to content

Commit 74b890f

Browse files
committed
reset and recommit to fix muddled merge
1 parent 96b3f4c commit 74b890f

File tree

5 files changed

+59
-22
lines changed

5 files changed

+59
-22
lines changed

Diff for: connection.go

+25-9
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ func (mc *mysqlConn) Begin() (driver.Tx, error) {
111111
if err == nil {
112112
return &mysqlTx{mc}, err
113113
}
114-
114+
if err == errNoWrite {
115+
return nil, driver.ErrBadConn
116+
}
115117
return nil, err
116118
}
117119

@@ -141,6 +143,9 @@ func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) {
141143
// Send command
142144
err := mc.writeCommandPacketStr(comStmtPrepare, query)
143145
if err != nil {
146+
if err == errNoWrite {
147+
return nil, driver.ErrBadConn
148+
}
144149
return nil, err
145150
}
146151

@@ -324,13 +329,15 @@ func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, err
324329
}
325330
mc.affectedRows = 0
326331
mc.insertId = 0
327-
328332
err := mc.exec(query)
329333
if err == nil {
330334
return &mysqlResult{
331335
affectedRows: int64(mc.affectedRows),
332336
insertId: int64(mc.insertId),
333-
}, err
337+
}, nil
338+
}
339+
if err == errNoWrite {
340+
return nil, driver.ErrBadConn
334341
}
335342
return nil, err
336343
}
@@ -380,17 +387,23 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro
380387
var resLen int
381388
resLen, err = mc.readResultSetHeaderPacket()
382389
if err == nil {
383-
rows := new(textRows)
384-
rows.mc = mc
385-
386390
if resLen == 0 {
387391
// no columns, no more data
388392
return emptyRows{}, nil
389393
}
390-
// Columns
391-
rows.columns, err = mc.readColumns(resLen)
392-
return rows, err
394+
cols, err := mc.readColumns(resLen)
395+
if err != nil {
396+
return nil, err
397+
}
398+
return &textRows{mysqlRows{
399+
mc: mc,
400+
columns: cols,
401+
}}, nil
393402
}
403+
return nil, err
404+
}
405+
if err == errNoWrite {
406+
return nil, driver.ErrBadConn
394407
}
395408
return nil, err
396409
}
@@ -400,6 +413,9 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro
400413
func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) {
401414
// Send command
402415
if err := mc.writeCommandPacketStr(comQuery, "SELECT @@"+name); err != nil {
416+
if err == errNoWrite {
417+
return nil, driver.ErrBadConn
418+
}
403419
return nil, err
404420
}
405421

Diff for: driver.go

+3
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {
118118
maxap, err := mc.getSystemVar("max_allowed_packet")
119119
if err != nil {
120120
mc.Close()
121+
if err == driver.ErrBadConn {
122+
err = ErrInvalidConn
123+
}
121124
return nil, err
122125
}
123126
mc.maxPacketAllowed = stringToInt(maxap) - 1

Diff for: errors.go

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var (
2828
ErrPktSyncMul = errors.New("Commands out of sync. Did you run multiple statements at once?")
2929
ErrPktTooLarge = errors.New("Packet for query is too large. You can change this value on the server by adjusting the 'max_allowed_packet' variable.")
3030
ErrBusyBuffer = errors.New("Busy buffer")
31+
errNoWrite = errors.New("No data written")
3132
)
3233

3334
var errLog Logger = log.New(os.Stderr, "[MySQL] ", log.Ldate|log.Ltime|log.Lshortfile)

Diff for: packets.go

+20-12
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
3131
if err != nil {
3232
errLog.Print(err)
3333
mc.Close()
34-
return nil, driver.ErrBadConn
34+
return nil, ErrInvalidConn
3535
}
3636

3737
// Packet Length [24 bit]
@@ -40,7 +40,7 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
4040
if pktLen < 1 {
4141
errLog.Print(ErrMalformPkt)
4242
mc.Close()
43-
return nil, driver.ErrBadConn
43+
return nil, ErrInvalidConn
4444
}
4545

4646
// Check Packet Sync [8 bit]
@@ -58,7 +58,7 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
5858
if err != nil {
5959
errLog.Print(err)
6060
mc.Close()
61-
return nil, driver.ErrBadConn
61+
return nil, ErrInvalidConn
6262
}
6363

6464
isLastPacket := (pktLen < maxPacketSize)
@@ -114,10 +114,14 @@ func (mc *mysqlConn) writePacket(data []byte) error {
114114
// Handle error
115115
if err == nil { // n != len(data)
116116
errLog.Print(ErrMalformPkt)
117-
} else {
118-
errLog.Print(err)
117+
return ErrMalformPkt
119118
}
120-
return driver.ErrBadConn
119+
errLog.Print(err)
120+
if n == 0 && pktLen == len(data)-4 {
121+
// first loop iteration, nothing was written
122+
return errNoWrite
123+
}
124+
return ErrInvalidConn
121125
}
122126
}
123127

@@ -241,7 +245,7 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
241245
if data == nil {
242246
// can not take the buffer. Something must be wrong with the connection
243247
errLog.Print(ErrBusyBuffer)
244-
return driver.ErrBadConn
248+
return ErrInvalidConn
245249
}
246250

247251
// ClientFlags [32 bit]
@@ -312,7 +316,7 @@ func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error {
312316
if data == nil {
313317
// can not take the buffer. Something must be wrong with the connection
314318
errLog.Print(ErrBusyBuffer)
315-
return driver.ErrBadConn
319+
return ErrInvalidConn
316320
}
317321

318322
// Add the scrambled password [null terminated string]
@@ -334,7 +338,7 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error {
334338
if data == nil {
335339
// can not take the buffer. Something must be wrong with the connection
336340
errLog.Print(ErrBusyBuffer)
337-
return driver.ErrBadConn
341+
return ErrInvalidConn
338342
}
339343

340344
// Add command byte
@@ -353,7 +357,7 @@ func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error {
353357
if data == nil {
354358
// can not take the buffer. Something must be wrong with the connection
355359
errLog.Print(ErrBusyBuffer)
356-
return driver.ErrBadConn
360+
return ErrInvalidConn
357361
}
358362

359363
// Add command byte
@@ -374,7 +378,7 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error {
374378
if data == nil {
375379
// can not take the buffer. Something must be wrong with the connection
376380
errLog.Print(ErrBusyBuffer)
377-
return driver.ErrBadConn
381+
return ErrInvalidConn
378382
}
379383

380384
// Add command byte
@@ -741,6 +745,10 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
741745
data = data[pktLen-dataOffset:]
742746
continue
743747
}
748+
if err == errNoWrite && argLen != len(arg) {
749+
// must not relay errNoWrite after first loop iteration
750+
return ErrInvalidConn
751+
}
744752
return err
745753

746754
}
@@ -777,7 +785,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
777785
if data == nil {
778786
// can not take the buffer. Something must be wrong with the connection
779787
errLog.Print(ErrBusyBuffer)
780-
return driver.ErrBadConn
788+
return ErrInvalidConn
781789
}
782790

783791
// command [1 byte]

Diff for: statement.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@ type mysqlStmt struct {
2222
func (stmt *mysqlStmt) Close() error {
2323
if stmt.mc == nil || stmt.mc.netConn == nil {
2424
errLog.Print(ErrInvalidConn)
25-
return driver.ErrBadConn
25+
return ErrInvalidConn
2626
}
2727

2828
err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id)
29+
if err == errNoWrite {
30+
err = ErrInvalidConn
31+
}
2932
stmt.mc = nil
3033
return err
3134
}
@@ -42,6 +45,9 @@ func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
4245
// Send command
4346
err := stmt.writeExecutePacket(args)
4447
if err != nil {
48+
if err == errNoWrite {
49+
return nil, driver.ErrBadConn
50+
}
4551
return nil, err
4652
}
4753

@@ -82,6 +88,9 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
8288
// Send command
8389
err := stmt.writeExecutePacket(args)
8490
if err != nil {
91+
if err == errNoWrite {
92+
return nil, driver.ErrBadConn
93+
}
8594
return nil, err
8695
}
8796

0 commit comments

Comments
 (0)