Skip to content

Commit 446c234

Browse files
author
Philio
committed
merge result handing back into client, refactor get fields
1 parent f78c24c commit 446c234

File tree

2 files changed

+40
-59
lines changed

2 files changed

+40
-59
lines changed

mysql.go

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ func (c *Client) ChangeDb(dbname string) (err os.Error) {
200200
}
201201
// Read result from server
202202
c.sequence++
203-
_, err = c.getResult(PACKET_OK | PACKET_ERROR)
203+
_, err = c.getResult(PACKET_OK | PACKET_ERROR, nil)
204204
return
205205
}
206206

@@ -232,7 +232,12 @@ func (c *Client) Query(sql string) (err os.Error) {
232232
}
233233
// Read result from server
234234
c.sequence++
235-
_, err = c.getResult(PACKET_OK | PACKET_ERROR | PACKET_RESULT)
235+
_, err = c.getResult(PACKET_OK | PACKET_ERROR | PACKET_RESULT, nil)
236+
if err != nil || c.result == nil {
237+
return
238+
}
239+
// Store fields
240+
err = c.getFields()
236241
return
237242
}
238243

@@ -248,14 +253,8 @@ func (c *Client) StoreResult() (result *Result, err os.Error) {
248253
if c.result.mode != RESULT_UNUSED {
249254
return nil, &ClientError{CR_COMMANDS_OUT_OF_SYNC, CR_COMMANDS_OUT_OF_SYNC_STR}
250255
}
251-
// Set client and storage mode
252-
c.result.c = c
256+
// Set storage mode
253257
c.result.mode = RESULT_STORED
254-
// Store fields
255-
err = c.getFields()
256-
if err != nil {
257-
return
258-
}
259258
// Store all rows
260259
err = c.getAllRows()
261260
if err != nil {
@@ -277,14 +276,8 @@ func (c *Client) UseResult() (result *Result, err os.Error) {
277276
if c.result.mode != RESULT_UNUSED {
278277
return nil, &ClientError{CR_COMMANDS_OUT_OF_SYNC, CR_COMMANDS_OUT_OF_SYNC_STR}
279278
}
280-
// Set client and storage mode
281-
c.result.c = c
279+
// Set storage mode
282280
c.result.mode = RESULT_USED
283-
// Store fields
284-
err = c.getFields()
285-
if err != nil {
286-
return
287-
}
288281
return c.result, nil
289282
}
290283

@@ -296,14 +289,6 @@ func (c *Client) FreeResult() (err os.Error) {
296289
if !c.checkResult() {
297290
return &ClientError{CR_NO_RESULT_SET, CR_NO_RESULT_SET_STR}
298291
}
299-
// Check that result was used/stored
300-
if c.result.mode == RESULT_UNUSED {
301-
// Read fields
302-
err = c.getFields()
303-
if err != nil {
304-
return
305-
}
306-
}
307292
// Check for unread rows
308293
if !c.result.allRead {
309294
// Read all rows
@@ -346,7 +331,7 @@ func (c *Client) NextResult() (more bool, err os.Error) {
346331
}
347332
// Read result from server
348333
c.sequence++
349-
_, err = c.getResult(PACKET_OK | PACKET_ERROR | PACKET_RESULT)
334+
_, err = c.getResult(PACKET_OK | PACKET_ERROR | PACKET_RESULT, nil)
350335
return
351336
}
352337

@@ -556,7 +541,7 @@ func (c *Client) connect() (err os.Error) {
556541
}
557542
// Read result from server
558543
c.sequence++
559-
eof, err := c.getResult(PACKET_OK | PACKET_ERROR | PACKET_EOF)
544+
eof, err := c.getResult(PACKET_OK | PACKET_ERROR | PACKET_EOF, nil)
560545
// If eof need to authenticate with a 3.23 password
561546
if eof {
562547
c.sequence++
@@ -573,7 +558,7 @@ func (c *Client) connect() (err os.Error) {
573558
c.log(1, "[%d] Sent old password packet", p.sequence)
574559
// Read result
575560
c.sequence++
576-
_, err = c.getResult(PACKET_OK | PACKET_ERROR)
561+
_, err = c.getResult(PACKET_OK | PACKET_ERROR, nil)
577562
}
578563
return
579564
}
@@ -778,7 +763,7 @@ func (c *Client) getFields() (err os.Error) {
778763
// Read fields till EOF is returned
779764
for {
780765
c.sequence++
781-
eof, err := c.getResult(PACKET_FIELD | PACKET_EOF)
766+
eof, err := c.getResult(PACKET_FIELD | PACKET_EOF, nil)
782767
if err != nil {
783768
return
784769
}
@@ -798,7 +783,7 @@ func (c *Client) getRow() (eof bool, err os.Error) {
798783
}
799784
// Read next row packet or EOF
800785
c.sequence++
801-
eof, err = c.getResult(PACKET_ROW | PACKET_EOF)
786+
eof, err = c.getResult(PACKET_ROW | PACKET_EOF, nil)
802787
return
803788
}
804789

@@ -817,7 +802,7 @@ func (c *Client) getAllRows() (err os.Error) {
817802
}
818803

819804
// Get result
820-
func (c *Client) getResult(types packetType) (eof bool, err os.Error) {
805+
func (c *Client) getResult(types packetType, s *Statement) (eof bool, err os.Error) {
821806
// Log read result
822807
c.log(1, "Reading result packet from server")
823808
// Get result packet
@@ -842,6 +827,10 @@ func (c *Client) getResult(types packetType) (eof bool, err os.Error) {
842827
err = c.processFieldResult(p.(*packetField))
843828
case *packetRowData:
844829
err = c.processRowResult(p.(*packetRowData))
830+
case *packetPrepareOK:
831+
err = s.processPrepareOKResult(p.(*packetPrepareOK))
832+
case *packetParameter:
833+
err = s.processParamResult(p.(*packetParameter))
845834
}
846835
return
847836
}
@@ -925,6 +914,7 @@ func (c *Client) processResultSetResult(p *packetResultSet) (err os.Error) {
925914
}
926915
// Create new result
927916
c.result = &Result{
917+
c: c,
928918
fieldCount: p.fieldCount,
929919
}
930920
return

statement.go

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type Statement struct {
2121
paramCount uint16
2222

2323
// Fields
24-
fieldCount uint16
24+
fieldCount uint64
2525
}
2626

2727
// Prepare new statement
@@ -41,15 +41,15 @@ func (s *Statement) Prepare(sql string) (err os.Error) {
4141
}
4242
// Read result from server
4343
s.c.sequence++
44-
_, err = s.getResult(PACKET_PREPARE_OK | PACKET_ERROR)
44+
_, err = s.c.getResult(PACKET_PREPARE_OK | PACKET_ERROR, s)
4545
if err != nil {
4646
return
4747
}
4848
// Read param packets
4949
if s.paramCount > 0 {
5050
for {
5151
s.c.sequence++
52-
eof, err := s.getResult(PACKET_PARAM | PACKET_EOF)
52+
eof, err := s.c.getResult(PACKET_PARAM | PACKET_EOF, s)
5353
if err != nil {
5454
return
5555
}
@@ -58,31 +58,22 @@ func (s *Statement) Prepare(sql string) (err os.Error) {
5858
}
5959
}
6060
}
61-
return
62-
}
63-
64-
// Get result
65-
func (s *Statement) getResult(types packetType) (eof bool, err os.Error) {
66-
// Log read result
67-
s.c.log(1, "Reading result packet from server")
68-
// Get result packet
69-
p, err := s.c.r.readPacket(types)
70-
if err != nil {
71-
return
72-
}
73-
// Process result packet
74-
switch i := p.(type) {
75-
default:
76-
err = &ClientError{CR_UNKNOWN_ERROR, CR_UNKNOWN_ERROR_STR}
77-
case *packetPrepareOK:
78-
err = s.processPrepareOKResult(p.(*packetPrepareOK))
79-
case *packetError:
80-
err = s.c.processErrorResult(p.(*packetError))
81-
case *packetParameter:
82-
err = s.processParamResult(p.(*packetParameter))
83-
case *packetEOF:
84-
eof = true
85-
err = s.c.processEOF(p.(*packetEOF))
61+
// Read field packets
62+
if s.fieldCount > 0 {
63+
// Create a new result
64+
s.c.result = &Result{
65+
fieldCount: s.fieldCount,
66+
}
67+
for {
68+
s.c.sequence++
69+
eof, err := s.c.getResult(PACKET_FIELD | PACKET_EOF, s)
70+
if err != nil {
71+
return
72+
}
73+
if eof {
74+
break
75+
}
76+
}
8677
}
8778
return
8879
}
@@ -99,7 +90,7 @@ func (s *Statement) processPrepareOKResult(p *packetPrepareOK) (err os.Error) {
9990
// Store packet data
10091
s.statementId = p.statementId
10192
s.paramCount = p.paramCount
102-
s.fieldCount = p.columnCount
93+
s.fieldCount = uint64(p.columnCount)
10394
s.c.Warnings = p.warningCount
10495
return
10596
}

0 commit comments

Comments
 (0)