@@ -15,11 +15,11 @@ import (
1515 "strings"
1616 "time"
1717
18- "github.com/xelabs/go-mysqlstack/common"
1918 "github.com/xelabs/go-mysqlstack/packet"
2019 "github.com/xelabs/go-mysqlstack/proto"
2120 "github.com/xelabs/go-mysqlstack/sqldb"
2221
22+ "github.com/xelabs/go-mysqlstack/sqlparser/depends/common"
2323 querypb "github.com/xelabs/go-mysqlstack/sqlparser/depends/query"
2424 "github.com/xelabs/go-mysqlstack/sqlparser/depends/sqltypes"
2525)
@@ -40,15 +40,11 @@ type Conn interface {
4040
4141 InitDB (db string ) error
4242 Command (command byte ) error
43- // Query get the row cursor.
4443 Query (sql string ) (Rows , error )
4544 Exec (sql string ) error
46-
47- // FetchAll fetchs all results.
4845 FetchAll (sql string , maxrows int ) (* sqltypes.Result , error )
49-
50- // FetchAllWithFunc fetchs all results but the row cursor can be interrupted by the fn.
5146 FetchAllWithFunc (sql string , maxrows int , fn Func ) (* sqltypes.Result , error )
47+ ComStatementPrepare (sql string ) (* Statement , error )
5248}
5349
5450type conn struct {
@@ -166,7 +162,12 @@ func NewConn(username, password, address, database, charset string) (Conn, error
166162 return c , nil
167163}
168164
169- func (c * conn ) query (command byte , sql string ) (Rows , error ) {
165+ // NextPacket used to get the next packet
166+ func (c * conn ) NextPacket () ([]byte , error ) {
167+ return c .packets .Next ()
168+ }
169+
170+ func (c * conn ) baseQuery (mode RowMode , command byte , datas []byte ) (Rows , error ) {
170171 var ok * proto.OK
171172 var myerr , err error
172173 var columns []* querypb.Field
@@ -180,7 +181,7 @@ func (c *conn) query(command byte, sql string) (Rows, error) {
180181 }()
181182
182183 // Query.
183- if err = c .packets .WriteCommand (command , common . StringToBytes ( sql ) ); err != nil {
184+ if err = c .packets .WriteCommand (command , datas ); err != nil {
184185 return nil , err
185186 }
186187
@@ -205,33 +206,54 @@ func (c *conn) query(command byte, sql string) (Rows, error) {
205206 }
206207 }
207208 }
208- rows := NewTextRows (c )
209- rows .rowsAffected = ok .AffectedRows
210- rows .insertID = ok .LastInsertID
211- rows .fields = columns
209+ var rows Rows
210+ switch mode {
211+ case TextRowMode :
212+ textRows := NewTextRows (c )
213+ textRows .rowsAffected = ok .AffectedRows
214+ textRows .insertID = ok .LastInsertID
215+ textRows .fields = columns
216+ rows = textRows
217+ case BinaryRowMode :
218+ binRows := NewBinaryRows (c )
219+ binRows .rowsAffected = ok .AffectedRows
220+ binRows .insertID = ok .LastInsertID
221+ binRows .fields = columns
222+ rows = binRows
223+ }
212224 return rows , nil
213225}
214226
227+ func (c * conn ) comQuery (command byte , datas []byte ) (Rows , error ) {
228+ return c .baseQuery (TextRowMode , command , datas )
229+ }
230+
231+ func (c * conn ) stmtQuery (command byte , datas []byte ) (Rows , error ) {
232+ return c .baseQuery (BinaryRowMode , command , datas )
233+ }
234+
215235// ConnectionID is the connection id at greeting
216236func (c * conn ) ConnectionID () uint32 {
217237 return c .greeting .ConnectionID
218238}
219239
220240// Query execute the query and return the row iterator
221241func (c * conn ) Query (sql string ) (Rows , error ) {
222- return c .query (sqldb .COM_QUERY , sql )
242+ return c .comQuery (sqldb .COM_QUERY , common . StringToBytes ( sql ) )
223243}
224244
245+ // Ping -- ping command.
225246func (c * conn ) Ping () error {
226- rows , err := c .query (sqldb .COM_PING , "" )
247+ rows , err := c .comQuery (sqldb .COM_PING , [] byte {} )
227248 if err != nil {
228249 return err
229250 }
230251 return rows .Close ()
231252}
232253
254+ // InitDB -- Init DB command.
233255func (c * conn ) InitDB (db string ) error {
234- rows , err := c .query (sqldb .COM_INIT_DB , db )
256+ rows , err := c .comQuery (sqldb .COM_INIT_DB , common . StringToBytes ( db ) )
235257 if err != nil {
236258 return err
237259 }
@@ -240,7 +262,7 @@ func (c *conn) InitDB(db string) error {
240262
241263// Exec executes the query and drain the results
242264func (c * conn ) Exec (sql string ) error {
243- rows , err := c .query (sqldb .COM_QUERY , sql )
265+ rows , err := c .comQuery (sqldb .COM_QUERY , common . StringToBytes ( sql ) )
244266 if err != nil {
245267 return err
246268 }
@@ -251,6 +273,7 @@ func (c *conn) Exec(sql string) error {
251273 return nil
252274}
253275
276+ // FetchAll -- fetch all command.
254277func (c * conn ) FetchAll (sql string , maxrows int ) (* sqltypes.Result , error ) {
255278 return c .FetchAllWithFunc (sql , maxrows , func (rows Rows ) error { return nil })
256279}
@@ -265,7 +288,7 @@ func (c *conn) FetchAllWithFunc(sql string, maxrows int, fn Func) (*sqltypes.Res
265288 var qrRow []sqltypes.Value
266289 var qrRows [][]sqltypes.Value
267290
268- if iRows , err = c .query (sqldb .COM_QUERY , sql ); err != nil {
291+ if iRows , err = c .comQuery (sqldb .COM_QUERY , common . StringToBytes ( sql ) ); err != nil {
269292 return nil , err
270293 }
271294
@@ -307,13 +330,25 @@ func (c *conn) FetchAllWithFunc(sql string, maxrows int, fn Func) (*sqltypes.Res
307330 return qr , err
308331}
309332
310- // NextPacket used to get the next packet
311- func (c * conn ) NextPacket () ([]byte , error ) {
312- return c .packets .Next ()
333+ // ComStatementPrepare -- statement prepare command.
334+ func (c * conn ) ComStatementPrepare (sql string ) (* Statement , error ) {
335+ if err := c .packets .WriteCommand (sqldb .COM_STMT_PREPARE , common .StringToBytes (sql )); err != nil {
336+ return nil , err
337+ }
338+ stmt , err := c .packets .ReadStatementPrepareResponse (c .greeting .Capability )
339+ if err != nil {
340+ return nil , err
341+ }
342+ return & Statement {
343+ conn : c ,
344+ ID : stmt .ID ,
345+ ColumnNames : stmt .ColumnNames ,
346+ }, nil
313347}
314348
349+ // Command -- execute a command.
315350func (c * conn ) Command (command byte ) error {
316- rows , err := c .query (command , "" )
351+ rows , err := c .comQuery (command , [] byte {} )
317352 if err != nil {
318353 return err
319354 }
@@ -324,10 +359,12 @@ func (c *conn) Command(command byte) error {
324359 return nil
325360}
326361
362+ // Quit -- quite command.
327363func (c * conn ) Quit () {
328364 c .packets .WriteCommand (sqldb .COM_QUIT , nil )
329365}
330366
367+ // Cleanup -- cleanup connection.
331368func (c * conn ) Cleanup () {
332369 if c .netConn != nil {
333370 c .netConn .Close ()
0 commit comments