Skip to content

Commit 07a2520

Browse files
author
Phil Bayfield
committed
add all remaining packet types, empty functions, some other small changes
1 parent 2e6c836 commit 07a2520

File tree

4 files changed

+149
-11
lines changed

4 files changed

+149
-11
lines changed

mysql.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ func (c *Client) getFields() (err os.Error) {
782782
return
783783
}
784784
if eof {
785+
c.result.fieldPos = 0
785786
break
786787
}
787788
}
@@ -970,15 +971,12 @@ func (c *Client) processRowResult(p *packetRowData) (err os.Error) {
970971
// Stored result
971972
if c.result.mode == RESULT_STORED {
972973
// Cast and append the row
973-
c.result.rows = append(c.result.rows, Row(p.values))
974+
c.result.rows = append(c.result.rows, Row(p.row))
974975
}
975976
// Used result
976977
if c.result.mode == RESULT_USED {
977978
// Only save 1 row, overwrite previous
978-
if len(c.result.rows) == 0 {
979-
c.result.rows = make([]Row, 1)
980-
}
981-
c.result.rows[0] = Row(p.values)
979+
c.result.rows = []Row{Row(p.row)}
982980
}
983981
return
984982
}

packet.go

Lines changed: 112 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const (
2424
PACKET_FIELD
2525
PACKET_ROW
2626
PACKET_EOF
27-
PACKET_OK_PREPARED
27+
PACKET_PREPARE_OK
2828
PACKET_PARAM
2929
PACKET_LONG_DATA
3030
PACKET_EXECUTE
@@ -635,7 +635,7 @@ func (p *packetField) read(data []byte) (err os.Error) {
635635
// Row data struct
636636
type packetRowData struct {
637637
packetBase
638-
values []interface{}
638+
row []interface{}
639639
}
640640

641641
// Row data packet reader
@@ -656,11 +656,10 @@ func (p *packetRowData) read(data []byte) (err os.Error) {
656656
return
657657
}
658658
// Add to slice
659-
if len(p.values) == 0 {
660-
p.values = make([]interface{}, 1)
661-
p.values[0] = str
659+
if len(p.row) == 0 {
660+
p.row = []interface{}{str}
662661
} else {
663-
p.values = append(p.values, str)
662+
p.row = append(p.row, str)
664663
}
665664
// Increment position and check for end of packet
666665
pos += n
@@ -670,3 +669,110 @@ func (p *packetRowData) read(data []byte) (err os.Error) {
670669
}
671670
return
672671
}
672+
673+
// Prepare ok struct
674+
type packetPrepareOK struct {
675+
packetBase
676+
statementId uint32
677+
columnCount uint16
678+
paramCount uint16
679+
warningCount uint16
680+
}
681+
682+
// Prepare ok packet reader
683+
func (p *packetPrepareOK) read(data []byte) (err os.Error) {
684+
// Recover errors
685+
defer func() {
686+
if e := recover(); e != nil {
687+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
688+
}
689+
}()
690+
691+
return
692+
}
693+
694+
// Parameter struct
695+
type packetParameter struct {
696+
packetBase
697+
paramType []byte
698+
flags uint16
699+
decimals uint8
700+
length uint32
701+
}
702+
703+
// Parameter packet reader
704+
func (p *packetParameter) read(data []byte) (err os.Error) {
705+
// Recover errors
706+
defer func() {
707+
if e := recover(); e != nil {
708+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
709+
}
710+
}()
711+
return
712+
}
713+
714+
// Long data struct
715+
type packetLongData struct {
716+
packetBase
717+
command byte
718+
statementId uint32
719+
paramNumber uint16
720+
data string
721+
}
722+
723+
// Lond data packet writer
724+
func (p *packetLongData) write() (data []byte, err os.Error) {
725+
// Recover errors
726+
defer func() {
727+
if e := recover(); e != nil {
728+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
729+
}
730+
}()
731+
// Add the packet header
732+
data = p.addHeader(data)
733+
return
734+
}
735+
736+
// Execute struct
737+
type packetExecute struct {
738+
packetBase
739+
command byte
740+
statementId uint32
741+
flags uint8
742+
iterationCount uint32
743+
nullBitMap []byte
744+
newParamBound uint8
745+
paramType [][]byte
746+
paramData [][]byte
747+
paramLength uint32
748+
}
749+
750+
// Execute packet writer
751+
func (p *packetExecute) write() (data []byte, err os.Error) {
752+
// Recover errors
753+
defer func() {
754+
if e := recover(); e != nil {
755+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
756+
}
757+
}()
758+
// Add the packet header
759+
data = p.addHeader(data)
760+
return
761+
}
762+
763+
// Binary row struct
764+
type packetRowBinary struct {
765+
packetBase
766+
row []interface{}
767+
}
768+
769+
// Row binary packet reader
770+
func (p *packetRowBinary) read(data []byte) (err os.Error) {
771+
// Recover errors
772+
defer func() {
773+
if e := recover(); e != nil {
774+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
775+
}
776+
}()
777+
return
778+
}

reader.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,21 @@ func (r *reader) readPacket(types packetType) (p packetReadable, err os.Error) {
107107
pk := new(packetRowData)
108108
pk.sequence = uint8(pktSeq)
109109
return pk, pk.read(pktData)
110+
// Prepare ok packet
111+
case types&PACKET_PREPARE_OK != 0 && pktData[0] == 0x0:
112+
pk := new(packetPrepareOK)
113+
pk.sequence = uint8(pktSeq)
114+
return pk, pk.read(pktData)
115+
// Param packet
116+
case types&PACKET_PARAM != 0 && pktData[0] < 0xfe:
117+
pk := new(packetParameter)
118+
pk.sequence = uint8(pktSeq)
119+
return pk, pk.read(pktData)
120+
// Binary row packet
121+
case types&PACKET_ROW_BINARY != 0 && pktData[0] < 0xfe:
122+
pk := new(packetRowBinary)
123+
pk.sequence = uint8(pktSeq)
124+
return pk, pk.read(pktData)
110125
}
111126
return
112127
}

result.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,17 @@ func (r *Result) FieldCount() uint64 {
4646
return r.fieldCount
4747
}
4848

49+
// Fetch the next field
50+
func (r *Result) FetchField() *Field {
51+
// Check if all fields have been fetched
52+
if r.fieldPos < uint64(len(r.fields)) {
53+
// Increment and return current field
54+
r.fieldPos ++
55+
return r.fields[r.fieldPos-1]
56+
}
57+
return nil
58+
}
59+
4960
// Fetch all fields
5061
func (r *Result) FetchFields() []*Field {
5162
return r.fields
@@ -102,6 +113,14 @@ func (r *Result) FetchMap() Map {
102113
return nil
103114
}
104115

116+
// Fetch all rows
117+
func (r *Result) FetchRows() []Row {
118+
if r.mode == RESULT_STORED {
119+
return r.rows
120+
}
121+
return nil
122+
}
123+
105124
// Free the result
106125
func (r *Result) Free() (err os.Error) {
107126
err = r.c.FreeResult()

0 commit comments

Comments
 (0)