@@ -35,6 +35,8 @@ type Conn struct {
3535 salt []byte
3636
3737 lastPing int64
38+
39+ pkgErr error
3840}
3941
4042func (c * Conn ) Connect (addr string , user string , password string , db string ) error {
@@ -109,11 +111,15 @@ func (c *Conn) Close() error {
109111}
110112
111113func (c * Conn ) readPacket () ([]byte , error ) {
112- return c .pkg .ReadPacket ()
114+ d , err := c .pkg .ReadPacket ()
115+ c .pkgErr = err
116+ return d , err
113117}
114118
115119func (c * Conn ) writePacket (data []byte ) error {
116- return c .pkg .WritePacket (data )
120+ err := c .pkg .WritePacket (data )
121+ c .pkgErr = err
122+ return err
117123}
118124
119125func (c * Conn ) readInitialHandshake () error {
@@ -400,6 +406,40 @@ func (c *Conn) SetCharset(charset string) error {
400406 }
401407}
402408
409+ func (c * Conn ) FieldList (table string , wildcard string ) ([]* Field , error ) {
410+ if err := c .writeCommandStrStr (COM_FIELD_LIST , table , wildcard ); err != nil {
411+ return nil , err
412+ }
413+
414+ data , err := c .readPacket ()
415+ if err != nil {
416+ return nil , err
417+ }
418+
419+ fs := make ([]* Field , 0 , 4 )
420+ var f * Field
421+ if data [0 ] == ERR_HEADER {
422+ return nil , c .handleErrorPacket (data )
423+ } else {
424+ for {
425+ if data , err = c .readPacket (); err != nil {
426+ return nil , err
427+ }
428+
429+ // EOF Packet
430+ if c .isEOFPacket (data ) {
431+ return fs , nil
432+ }
433+
434+ if f , err = FieldData (data ).Parse (); err != nil {
435+ return nil , err
436+ }
437+ fs = append (fs , f )
438+ }
439+ }
440+ return nil , fmt .Errorf ("field list error" )
441+ }
442+
403443func (c * Conn ) exec (query string ) (* Result , error ) {
404444 if err := c .writeCommandStr (COM_QUERY , query ); err != nil {
405445 return nil , err
0 commit comments