Skip to content

Commit db0964a

Browse files
author
Philio
committed
Statement.FreeResult now removes any waiting result packets and doesn't need preceeding FreeResult
1 parent 8f79672 commit db0964a

File tree

1 file changed

+55
-11
lines changed

1 file changed

+55
-11
lines changed

statement.go

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -515,16 +515,8 @@ func (s *Statement) FreeResult() (err os.Error) {
515515
if !s.checkResult() {
516516
return &ClientError{CR_NO_RESULT_SET, CR_NO_RESULT_SET_STR}
517517
}
518-
// Check for unread rows
519-
if !s.result.allRead {
520-
// Read all rows
521-
err = s.getAllRows()
522-
if err != nil {
523-
return
524-
}
525-
}
526-
// Unset the result
527-
s.result = nil
518+
// Free the current result set
519+
s.freeAll(false)
528520
return
529521
}
530522

@@ -557,6 +549,9 @@ func (s *Statement) NextResult() (more bool, err os.Error) {
557549
// Read result from server
558550
s.c.sequence++
559551
_, err = s.getResult(PACKET_OK | PACKET_ERROR | PACKET_RESULT)
552+
if err != nil || s.result == nil {
553+
return
554+
}
560555
// Store fields
561556
err = s.getFields()
562557
return
@@ -575,9 +570,13 @@ func (s *Statement) Reset() (err os.Error) {
575570
return &ClientError{CR_NO_PREPARE_STMT, CR_NO_PREPARE_STMT_STR}
576571
}
577572
// Pre-run checks
578-
if !s.c.checkConn() || s.checkResult() {
573+
if !s.c.checkConn() {
579574
return &ClientError{CR_COMMANDS_OUT_OF_SYNC, CR_COMMANDS_OUT_OF_SYNC_STR}
580575
}
576+
// Free any results
577+
if s.checkResult() {
578+
err = s.freeAll(true)
579+
}
581580
// Reset client
582581
s.reset()
583582
// Send command
@@ -724,3 +723,48 @@ func (s *Statement) getResult(types packetType) (eof bool, err os.Error) {
724723
}
725724
return
726725
}
726+
727+
// Free any result sets waiting to be read
728+
func (s *Statement) freeAll(next bool) (err os.Error) {
729+
// Check for unread rows
730+
if !s.result.allRead {
731+
// Read all rows
732+
err = s.getAllRows()
733+
if err != nil {
734+
return
735+
}
736+
}
737+
// Unset the result
738+
s.result = nil
739+
// Check for next result
740+
if next {
741+
for {
742+
// Check if more results exist
743+
if !s.c.MoreResults() {
744+
break
745+
}
746+
// Get next result
747+
s.c.sequence++
748+
_, err = s.getResult(PACKET_OK | PACKET_ERROR | PACKET_RESULT)
749+
if err != nil {
750+
return
751+
}
752+
if s.result == nil {
753+
continue
754+
}
755+
// Set result mode to RESULT_FREE
756+
s.result.mode = RESULT_FREE
757+
// Read fields
758+
err = s.getFields()
759+
if err != nil {
760+
return
761+
}
762+
// Read rows
763+
err = s.getAllRows()
764+
if err != nil {
765+
return
766+
}
767+
}
768+
}
769+
return
770+
}

0 commit comments

Comments
 (0)