Skip to content
This repository was archived by the owner on Jan 5, 2023. It is now read-only.

Commit 54730e6

Browse files
committed
*: add statement prepare support and others
1. support statement prepare 2. support CHECKSUM/FULLTEXT syntax 3. remove sorter to use golang's slice sorter 4. move common from root to sqlparser/depends/common
1 parent 043dca7 commit 54730e6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+6793
-3318
lines changed

driver/client.go

Lines changed: 58 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5450
type 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
216236
func (c *conn) ConnectionID() uint32 {
217237
return c.greeting.ConnectionID
218238
}
219239

220240
// Query execute the query and return the row iterator
221241
func (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.
225246
func (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.
233255
func (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
242264
func (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.
254277
func (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.
315350
func (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.
327363
func (c *conn) Quit() {
328364
c.packets.WriteCommand(sqldb.COM_QUIT, nil)
329365
}
330366

367+
// Cleanup -- cleanup connection.
331368
func (c *conn) Cleanup() {
332369
if c.netConn != nil {
333370
c.netConn.Close()

driver/client_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import (
1414
"testing"
1515

1616
"github.com/stretchr/testify/assert"
17+
"github.com/xelabs/go-mysqlstack/xlog"
1718

1819
querypb "github.com/xelabs/go-mysqlstack/sqlparser/depends/query"
1920
"github.com/xelabs/go-mysqlstack/sqlparser/depends/sqltypes"
20-
"github.com/xelabs/go-mysqlstack/xlog"
2121
)
2222

2323
func TestClient(t *testing.T) {

driver/mock.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ import (
1919
"time"
2020

2121
"github.com/xelabs/go-mysqlstack/sqldb"
22-
"github.com/xelabs/go-mysqlstack/sqlparser/depends/sqltypes"
2322
"github.com/xelabs/go-mysqlstack/xlog"
23+
24+
querypb "github.com/xelabs/go-mysqlstack/sqlparser/depends/query"
25+
"github.com/xelabs/go-mysqlstack/sqlparser/depends/sqltypes"
2426
)
2527

2628
func randomPort(min int, max int) int {
@@ -205,7 +207,7 @@ func (th *TestHandler) ComInitDB(s *Session, db string) error {
205207
}
206208

207209
// ComQuery implements the interface.
208-
func (th *TestHandler) ComQuery(s *Session, query string, callback func(qr *sqltypes.Result) error) error {
210+
func (th *TestHandler) ComQuery(s *Session, query string, bindVariables map[string]*querypb.BindVariable, callback func(qr *sqltypes.Result) error) error {
209211
log := th.log
210212
query = strings.ToLower(query)
211213

@@ -226,15 +228,13 @@ func (th *TestHandler) ComQuery(s *Session, query string, callback func(qr *sqlt
226228
case <-time.After(time.Millisecond * time.Duration(cond.Delay)):
227229
log.Debug("mock.handler.delay.done...")
228230
}
229-
callback(cond.Result)
230-
return nil
231+
return callback(cond.Result)
231232
case COND_ERROR:
232233
return cond.Error
233234
case COND_PANIC:
234235
log.Panic("mock.handler.panic....")
235236
case COND_NORMAL:
236-
callback(cond.Result)
237-
return nil
237+
return callback(cond.Result)
238238
case COND_STREAM:
239239
flds := cond.Result.Fields
240240
// Send Fields for stream.
@@ -275,8 +275,7 @@ func (th *TestHandler) ComQuery(s *Session, query string, callback func(qr *sqlt
275275
}
276276
th.mu.Unlock()
277277
}
278-
callback(&sqltypes.Result{})
279-
return nil
278+
return callback(&sqltypes.Result{})
280279
}
281280

282281
th.mu.Lock()
@@ -289,8 +288,7 @@ func (th *TestHandler) ComQuery(s *Session, query string, callback func(qr *sqlt
289288
}
290289
for _, pat := range th.patterns {
291290
if pat.expr.MatchString(query) {
292-
callback(pat.result)
293-
return nil
291+
return callback(pat.result)
294292
}
295293
}
296294

@@ -302,8 +300,7 @@ func (th *TestHandler) ComQuery(s *Session, query string, callback func(qr *sqlt
302300
idx = v.idx
303301
v.idx++
304302
}
305-
callback(v.conds[idx].Result)
306-
return nil
303+
return callback(v.conds[idx].Result)
307304
}
308305
return fmt.Errorf("mock.handler.query[%v].error[can.not.found.the.cond.please.set.first]", query)
309306
}

0 commit comments

Comments
 (0)