Skip to content

Commit 6bd99e9

Browse files
committed
[driver] add more test cases
1 parent f8d06c9 commit 6bd99e9

20 files changed

Lines changed: 1353 additions & 309 deletions

common/buffer.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,12 @@ func (b *Buffer) ReadLenEncode() (v uint64, err error) {
248248
}
249249
}
250250

251+
func (b *Buffer) WriteLenEncodeString(s string) {
252+
l := len(s)
253+
b.WriteLenEncode(uint64(l))
254+
b.WriteString(s)
255+
}
256+
251257
func (b *Buffer) ReadLenEncodeString() (s string, err error) {
252258
var l uint64
253259

@@ -262,6 +268,12 @@ func (b *Buffer) ReadLenEncodeString() (s string, err error) {
262268
return
263269
}
264270

271+
func (b *Buffer) WriteLenEncodeBytes(v []byte) {
272+
l := len(v)
273+
b.WriteLenEncode(uint64(l))
274+
b.WriteBytes(v)
275+
}
276+
265277
func (b *Buffer) ReadLenEncodeBytes() (v []byte, err error) {
266278
var l uint64
267279

@@ -306,7 +318,8 @@ func (b *Buffer) ReadZero(n int) (err error) {
306318
return
307319
}
308320

309-
func (b *Buffer) WriteString(s string, n int) {
321+
func (b *Buffer) WriteString(s string) {
322+
n := len(s)
310323
b.extend(n)
311324
copy(b.buf[b.pos:], s)
312325
b.pos += n
@@ -318,7 +331,8 @@ func (b *Buffer) ReadString(n int) (s string, err error) {
318331
return
319332
}
320333

321-
s = BytesToString(b.buf[b.seek:(b.seek + n)])
334+
//s = BytesToString(b.buf[b.seek:(b.seek + n)])
335+
s = string(b.buf[b.seek:(b.seek + n)])
322336
b.seek += n
323337

324338
return
@@ -332,7 +346,8 @@ func (b *Buffer) ReadStringNUL() (s string, err error) {
332346
if v, err = b.readBytesWithToken(0x00); err != nil {
333347
return
334348
}
335-
s = BytesToString(v)
349+
//s = BytesToString(v)
350+
s = string(v)
336351

337352
return
338353
}
@@ -345,7 +360,8 @@ func (b *Buffer) ReadStringEOF() (s string, err error) {
345360
if v, err = b.readBytesWithToken(0xfe); err != nil {
346361
return
347362
}
348-
s = BytesToString(v)
363+
//s = BytesToString(v)
364+
s = string(v)
349365

350366
return
351367
}
@@ -376,7 +392,8 @@ func (b *Buffer) readBytesWithToken(token uint8) (v []byte, err error) {
376392
return
377393
}
378394

379-
func (b *Buffer) WriteBytes(bs []byte, n int) {
395+
func (b *Buffer) WriteBytes(bs []byte) {
396+
n := len(bs)
380397
b.extend(n)
381398
copy(b.buf[b.pos:], bs)
382399
b.pos += n

common/buffer_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ func TestBuffer(t *testing.T) {
2222
buf.WriteU32(30)
2323
buf.WriteU8(208)
2424
buf.WriteU16(65535)
25-
buf.WriteBytes([]byte{1, 2, 3, 4, 5}, 5)
25+
buf.WriteBytes([]byte{1, 2, 3, 4, 5})
2626
buf.WriteZero(3)
27-
buf.WriteString("abc", 3)
27+
buf.WriteString("abc")
2828
buf.WriteEOF(1)
29-
buf.WriteString("xyz", 3)
29+
buf.WriteString("xyz")
3030
buf.WriteEOF(2)
3131
buf.WriteU24(1024)
3232

@@ -113,7 +113,7 @@ func TestBuffer(t *testing.T) {
113113
func TestBufferDatas(t *testing.T) {
114114
buf := NewBuffer(100)
115115
buf.WriteU32(22222232)
116-
buf.WriteString("abc", 3)
116+
buf.WriteString("abc")
117117
buf.WriteZero(2)
118118

119119
{
@@ -363,7 +363,7 @@ func TestBufferLenEncodeString(t *testing.T) {
363363
}
364364

365365
{
366-
buf.WriteString(s, len(s))
366+
buf.WriteString(s)
367367
}
368368

369369
{
@@ -379,7 +379,7 @@ func TestBufferLenEncodeString(t *testing.T) {
379379
}
380380

381381
{
382-
buf.WriteBytes(data, len(data))
382+
buf.WriteBytes(data)
383383
}
384384

385385
reader := ReadBuffer(buf.Datas())
@@ -406,22 +406,22 @@ func TestBufferNULEOF(t *testing.T) {
406406
data2 := "radon"
407407

408408
{
409-
buf.WriteString(data1, len(data1))
409+
buf.WriteString(data1)
410410
buf.WriteZero(1)
411411
}
412412

413413
{
414-
buf.WriteString(data2, len(data2))
414+
buf.WriteString(data2)
415415
buf.WriteZero(1)
416416
}
417417

418418
{
419-
buf.WriteString(data1, len(data1))
419+
buf.WriteString(data1)
420420
buf.WriteEOF(1)
421421
}
422422

423423
{
424-
buf.WriteString(data2, len(data2))
424+
buf.WriteString(data2)
425425
buf.WriteEOF(1)
426426
}
427427

consts/commands.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const (
3333
COM_TABLE_DUMP
3434
COM_CONNECT_OUT
3535
COM_REGISTER_SLAVE
36+
COM_STMT_PREPARE
3637
COM_STMT_EXECUTE
3738
COM_STMT_SEND_LONG_DATA
3839
COM_STMT_CLOSE
@@ -43,3 +44,73 @@ const (
4344
COM_BINLOG_DUMP_GTID
4445
COM_RESET_CONNECTION
4546
)
47+
48+
func CommandString(cmd byte) string {
49+
switch cmd {
50+
case COM_SLEEP:
51+
return "COM_SLEEP"
52+
case COM_QUIT:
53+
return "COM_QUIT"
54+
case COM_INIT_DB:
55+
return "COM_INIT_DB"
56+
case COM_QUERY:
57+
return "COM_QUERY"
58+
case COM_FIELD_LIST:
59+
return "COM_FIELD_LIST"
60+
case COM_CREATE_DB:
61+
return "COM_CREATE_DB"
62+
case COM_DROP_DB:
63+
return "COM_DROP_DB"
64+
case COM_REFRESH:
65+
return "COM_REFRESH"
66+
case COM_SHUTDOWN:
67+
return "COM_SHUTDOWN"
68+
case COM_STATISTICS:
69+
return "COM_STATISTICS"
70+
case COM_PROCESS_INFO:
71+
return "COM_PROCESS_INFO"
72+
case COM_CONNECT:
73+
return "COM_CONNECT"
74+
case COM_PROCESS_KILL:
75+
return "COM_PROCESS_KILL"
76+
case COM_DEBUG:
77+
return "COM_DEBUG"
78+
case COM_PING:
79+
return "COM_PING"
80+
case COM_TIME:
81+
return "COM_TIME"
82+
case COM_DELAYED_INSERT:
83+
return "COM_DELAYED_INSERT"
84+
case COM_CHANGE_USER:
85+
return "COM_CHANGE_USER"
86+
case COM_BINLOG_DUMP:
87+
return "COM_BINLOG_DUMP"
88+
case COM_TABLE_DUMP:
89+
return "COM_TABLE_DUMP"
90+
case COM_CONNECT_OUT:
91+
return "COM_CONNECT_OUT"
92+
case COM_REGISTER_SLAVE:
93+
return "COM_REGISTER_SLAVE"
94+
case COM_STMT_PREPARE:
95+
return "COM_STMT_PREPARE"
96+
case COM_STMT_EXECUTE:
97+
return "COM_STMT_EXECUTE"
98+
case COM_STMT_SEND_LONG_DATA:
99+
return "COM_STMT_SEND_LONG_DATA"
100+
case COM_STMT_CLOSE:
101+
return "COM_STMT_CLOSE"
102+
case COM_STMT_RESET:
103+
return "COM_STMT_RESET"
104+
case COM_SET_OPTION:
105+
return "COM_SET_OPTION"
106+
case COM_STMT_FETCH:
107+
return "COM_STMT_FETCH"
108+
case COM_DAEMON:
109+
return "COM_DAEMON"
110+
case COM_BINLOG_DUMP_GTID:
111+
return "COM_BINLOG_DUMP_GTID"
112+
case COM_RESET_CONNECTION:
113+
return "COM_RESET_CONNECTION"
114+
}
115+
return "UNKNOWN"
116+
}

driver/conn.go

Lines changed: 72 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,91 +17,122 @@ import (
1717
"net"
1818
)
1919

20-
type Conn struct {
20+
type Conn interface {
21+
Cleanup()
22+
Close() error
23+
Closed() bool
24+
NextPacket() ([]byte, error)
25+
Query(sql string) (rows Rows, err error)
26+
Exec(sql string) (rows Rows, err error)
27+
}
28+
29+
type conn struct {
2130
netConn net.Conn
2231
greeting *proto.Greeting
2332
auth *proto.Auth
2433
packets *packet.Packets
2534
}
2635

27-
func NewConn(username, password, protocol, address, database string) (*Conn, error) {
28-
netconn, err := net.Dial(protocol, address)
29-
if err != nil {
30-
return nil, errors.WithStack(err)
36+
func (c *conn) handleErrorPacket(data []byte) error {
37+
if data[0] == proto.ERR_PACKET {
38+
pkt, e := c.packets.ParseERR(data, c.greeting.Capability)
39+
if e != nil {
40+
c.Cleanup()
41+
return e
42+
}
43+
return errors.New(pkt.ErrorMessage)
3144
}
3245

33-
conn := &Conn{
34-
netConn: netconn,
35-
greeting: proto.NewGreeting(0),
36-
auth: proto.NewAuth(),
37-
packets: packet.NewPackets(netconn),
46+
return nil
47+
}
48+
49+
func NewConn(username, password, address, database string) (c *conn, err error) {
50+
var payload []byte
51+
52+
c = &conn{}
53+
if c.netConn, err = net.Dial("tcp", address); err != nil {
54+
return nil, errors.WithStack(err)
3855
}
3956

57+
c.auth = proto.NewAuth()
58+
c.greeting = proto.NewGreeting(0)
59+
c.packets = packet.NewPackets(c.netConn)
60+
4061
{
62+
4163
// greeting read
42-
payload, err := conn.packets.Next()
43-
if err != nil {
44-
return nil, err
64+
if payload, err = c.packets.Next(); err != nil {
65+
c.Cleanup()
66+
return
67+
}
68+
if err = c.handleErrorPacket(payload); err != nil {
69+
return
4570
}
4671

4772
// greeting unpack
48-
err = conn.greeting.UnPack(payload)
49-
if err != nil {
50-
return nil, err
73+
if err = c.greeting.UnPack(payload); err != nil {
74+
c.Cleanup()
75+
return
5176
}
5277
}
5378

5479
{
5580
// auth pack
56-
payload := conn.auth.Pack(
57-
conn.greeting.Capability,
58-
conn.greeting.Charset,
81+
payload := c.auth.Pack(
82+
c.greeting.Capability,
83+
c.greeting.Charset,
5984
username,
6085
password,
61-
conn.greeting.Salt,
86+
c.greeting.Salt,
6287
database,
6388
)
6489

6590
// auth write
66-
err := conn.packets.Write(payload)
67-
if err != nil {
68-
return nil, err
91+
if err = c.packets.Write(payload); err != nil {
92+
c.Cleanup()
93+
return
6994
}
7095
}
7196

7297
{
7398
// read
74-
payload, err := conn.packets.Next()
75-
if err != nil {
76-
return nil, err
99+
if payload, err = c.packets.Next(); err != nil {
100+
c.Cleanup()
101+
return
77102
}
78103

79-
if payload[0] != proto.OK_PACKET {
80-
pkt, err := conn.packets.ParseERR(payload, conn.greeting.Capability)
81-
if err != nil {
82-
return nil, err
83-
}
84-
return nil, errors.New(pkt.ErrorMessage)
104+
if err = c.handleErrorPacket(payload); err != nil {
105+
return
85106
}
86107
}
87108

88-
return conn, nil
109+
return c, nil
110+
}
111+
112+
func (c *conn) NextPacket() ([]byte, error) {
113+
return c.packets.Next()
114+
}
115+
116+
func (c *conn) Cleanup() {
117+
if c.netConn != nil {
118+
c.netConn.Close()
119+
c.netConn = nil
120+
}
89121
}
90122

91123
// Close closes the connection
92-
func (c *Conn) Close() error {
124+
func (c *conn) Close() error {
93125
if c.netConn != nil {
94126
if err := c.packets.WriteCommand(consts.COM_QUIT, nil); err != nil {
95127
return err
96128
}
97-
98-
if c.netConn != nil {
99-
if err := c.netConn.Close(); err != nil {
100-
return errors.WithStack(err)
101-
}
102-
c.netConn = nil
103-
}
129+
c.Cleanup()
104130
}
105131

106132
return nil
107133
}
134+
135+
// Closed checks the connection broken or not
136+
func (c *conn) Closed() bool {
137+
return c.netConn == nil
138+
}

0 commit comments

Comments
 (0)