Skip to content

Commit a4aea72

Browse files
authored
Merge pull request #593 from skoef/conStatusFlag
Connection status flag manipulation
2 parents 13a9144 + e6f91a3 commit a4aea72

File tree

2 files changed

+124
-4
lines changed

2 files changed

+124
-4
lines changed

server/conn.go

+28-4
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,18 @@ func (c *Conn) Capability() uint32 {
143143
return c.capability
144144
}
145145

146+
func (c *Conn) SetCapability(cap uint32) {
147+
c.capability |= cap
148+
}
149+
150+
func (c *Conn) UnsetCapability(cap uint32) {
151+
c.capability &= ^cap
152+
}
153+
154+
func (c *Conn) HasCapability(cap uint32) bool {
155+
return c.capability&cap > 0
156+
}
157+
146158
func (c *Conn) Charset() uint8 {
147159
return c.charset
148160
}
@@ -152,17 +164,29 @@ func (c *Conn) ConnectionID() uint32 {
152164
}
153165

154166
func (c *Conn) IsAutoCommit() bool {
155-
return c.status&SERVER_STATUS_AUTOCOMMIT > 0
167+
return c.HasStatus(SERVER_STATUS_AUTOCOMMIT)
156168
}
157169

158170
func (c *Conn) IsInTransaction() bool {
159-
return c.status&SERVER_STATUS_IN_TRANS > 0
171+
return c.HasStatus(SERVER_STATUS_IN_TRANS)
160172
}
161173

162174
func (c *Conn) SetInTransaction() {
163-
c.status |= SERVER_STATUS_IN_TRANS
175+
c.SetStatus(SERVER_STATUS_IN_TRANS)
164176
}
165177

166178
func (c *Conn) ClearInTransaction() {
167-
c.status &= ^SERVER_STATUS_IN_TRANS
179+
c.UnsetStatus(SERVER_STATUS_IN_TRANS)
180+
}
181+
182+
func (c *Conn) SetStatus(status uint16) {
183+
c.status |= status
184+
}
185+
186+
func (c *Conn) UnsetStatus(status uint16) {
187+
c.status &= ^status
188+
}
189+
190+
func (c *Conn) HasStatus(status uint16) bool {
191+
return c.status&status > 0
168192
}

server/conn_test.go

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package server
2+
3+
import (
4+
"github.com/go-mysql-org/go-mysql/mysql"
5+
"github.com/pingcap/check"
6+
)
7+
8+
type connTestSuite struct {
9+
}
10+
11+
var _ = check.Suite(&connTestSuite{})
12+
13+
func (t *connTestSuite) TestStatus(c *check.C) {
14+
conn := Conn{}
15+
16+
flags := []uint16{
17+
mysql.SERVER_STATUS_IN_TRANS,
18+
mysql.SERVER_STATUS_AUTOCOMMIT,
19+
mysql.SERVER_MORE_RESULTS_EXISTS,
20+
mysql.SERVER_STATUS_NO_GOOD_INDEX_USED,
21+
mysql.SERVER_STATUS_NO_INDEX_USED,
22+
mysql.SERVER_STATUS_CURSOR_EXISTS,
23+
mysql.SERVER_STATUS_LAST_ROW_SEND,
24+
mysql.SERVER_STATUS_DB_DROPPED,
25+
mysql.SERVER_STATUS_NO_BACKSLASH_ESCAPED,
26+
mysql.SERVER_STATUS_METADATA_CHANGED,
27+
mysql.SERVER_QUERY_WAS_SLOW,
28+
mysql.SERVER_PS_OUT_PARAMS,
29+
}
30+
31+
for _, f := range flags {
32+
c.Assert(conn.HasStatus(f), check.IsFalse)
33+
conn.SetStatus(f)
34+
c.Assert(conn.HasStatus(f), check.IsTrue)
35+
conn.UnsetStatus(f)
36+
c.Assert(conn.HasStatus(f), check.IsFalse)
37+
}
38+
39+
// check special flag setters
40+
// IsAutoCommit
41+
c.Assert(conn.IsAutoCommit(), check.IsFalse)
42+
conn.SetStatus(mysql.SERVER_STATUS_AUTOCOMMIT)
43+
c.Assert(conn.IsAutoCommit(), check.IsTrue)
44+
conn.UnsetStatus(mysql.SERVER_STATUS_AUTOCOMMIT)
45+
46+
// IsInTransaction
47+
c.Assert(conn.IsInTransaction(), check.IsFalse)
48+
conn.SetStatus(mysql.SERVER_STATUS_IN_TRANS)
49+
c.Assert(conn.IsInTransaction(), check.IsTrue)
50+
conn.UnsetStatus(mysql.SERVER_STATUS_IN_TRANS)
51+
52+
// SetInTransaction & ClearInTransaction
53+
c.Assert(conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS), check.IsFalse)
54+
conn.SetInTransaction()
55+
c.Assert(conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS), check.IsTrue)
56+
conn.ClearInTransaction()
57+
c.Assert(conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS), check.IsFalse)
58+
}
59+
60+
func (t *connTestSuite) TestCapability(c *check.C) {
61+
conn := Conn{}
62+
63+
caps := []uint32{
64+
mysql.CLIENT_LONG_PASSWORD,
65+
mysql.CLIENT_FOUND_ROWS,
66+
mysql.CLIENT_LONG_FLAG,
67+
mysql.CLIENT_CONNECT_WITH_DB,
68+
mysql.CLIENT_NO_SCHEMA,
69+
mysql.CLIENT_COMPRESS,
70+
mysql.CLIENT_ODBC,
71+
mysql.CLIENT_LOCAL_FILES,
72+
mysql.CLIENT_IGNORE_SPACE,
73+
mysql.CLIENT_PROTOCOL_41,
74+
mysql.CLIENT_INTERACTIVE,
75+
mysql.CLIENT_SSL,
76+
mysql.CLIENT_IGNORE_SIGPIPE,
77+
mysql.CLIENT_TRANSACTIONS,
78+
mysql.CLIENT_RESERVED,
79+
mysql.CLIENT_SECURE_CONNECTION,
80+
mysql.CLIENT_MULTI_STATEMENTS,
81+
mysql.CLIENT_MULTI_RESULTS,
82+
mysql.CLIENT_PS_MULTI_RESULTS,
83+
mysql.CLIENT_PLUGIN_AUTH,
84+
mysql.CLIENT_CONNECT_ATTRS,
85+
mysql.CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA,
86+
}
87+
88+
for _, cap := range caps {
89+
c.Assert(conn.HasCapability(cap), check.IsFalse)
90+
conn.SetCapability(cap)
91+
c.Assert(conn.HasCapability(cap), check.IsTrue)
92+
c.Assert(conn.Capability()&cap > 0, check.IsTrue)
93+
conn.UnsetCapability(cap)
94+
c.Assert(conn.HasCapability(cap), check.IsFalse)
95+
}
96+
}

0 commit comments

Comments
 (0)