Skip to content

Commit def5474

Browse files
committed
BUG23550743: Add close method to XSession and NodeSession
Added test cases for regression
1 parent 40dd508 commit def5474

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

lib/mysqlx/connection.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import socket
2727

2828
from .authentication import MySQL41AuthPlugin
29-
from .errors import InterfaceError
29+
from .errors import InterfaceError, OperationalError
3030
from .crud import Schema
3131
from .protocol import Protocol, MessageReaderWriter
3232
from .result import Result, RowResult, DocResult
@@ -45,6 +45,9 @@ def connect(self, host, port):
4545
self._socket.connect((host, port,))
4646

4747
def read(self, count):
48+
if self._socket == None:
49+
raise OperationalError("MySQLx Connection not available")
50+
4851
buf = ""
4952
while count > 0:
5053
data = self._socket.recv(count)
@@ -55,8 +58,15 @@ def read(self, count):
5558
return buf
5659

5760
def sendall(self, data):
61+
if self._socket == None:
62+
raise OperationalError("MySQLx Connection not available")
63+
5864
self._socket.sendall(data)
5965

66+
def close(self):
67+
self._socket.close()
68+
self._socket = None
69+
6070

6171
class Connection(object):
6272
def __init__(self, settings):
@@ -128,6 +138,13 @@ def get_row_result(self, cmd, *args):
128138
self.protocol.send_execute_statement("xplugin", cmd, args)
129139
return RowResult(self)
130140

141+
def close(self):
142+
if self._active_result is not None:
143+
self._active_result.fetch_all()
144+
self.protocol.send_close()
145+
self.protocol.read_ok()
146+
self.stream.close()
147+
131148

132149
class BaseSession(object):
133150
"""Base functionality for Session classes through the X Protocol.
@@ -148,6 +165,9 @@ def __init__(self, settings):
148165
self._connection = Connection(self._settings)
149166
self._connection.connect()
150167

168+
def is_open(self):
169+
return self._connection.stream._socket is not None
170+
151171
def get_schema(self, name):
152172
"""Retrieves a Schema object from the current session by it's name.
153173
@@ -196,6 +216,9 @@ def rollback(self):
196216
"""
197217
self._connection.execute_nonquery("sql", "ROLLBACK", True)
198218

219+
def close(self):
220+
self._connection.close()
221+
199222

200223
class XSession(BaseSession):
201224
"""Enables interaction with a X Protocol enabled MySQL Product.

lib/mysqlx/protocol.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
(MySQLx.ServerMessages.RESULTSET_FETCH_DONE, MySQLxResultset.FetchDone),
5656
(MySQLx.ServerMessages.RESULTSET_FETCH_DONE_MORE_RESULTSETS,
5757
MySQLxResultset.FetchDoneMoreResultsets),
58+
(MySQLx.ServerMessages.OK, MySQLx.Ok),
5859
]
5960

6061

@@ -333,3 +334,15 @@ def arg_object_to_expr(self, value, allow_relational):
333334

334335
def arg_object_to_scalar(self, value, allow_relational):
335336
return self.arg_object_to_expr(value, allow_relational).literal
337+
338+
def read_ok(self):
339+
msg = self._reader.read_message()
340+
if isinstance(msg, MySQLx.Error):
341+
raise InterfaceError(msg.msg)
342+
343+
if not isinstance(msg, MySQLx.Ok):
344+
raise InterfaceError("Unexpected message encountered")
345+
346+
def send_close(self):
347+
msg = MySQLxSession.Close()
348+
self._writer.write_message(MySQLx.ClientMessages.SESS_CLOSE, msg)

tests/test_mysqlx_connection.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ def test_create_schema(self):
6868
schema = self.session.create_schema(self.schema_name)
6969
self.assertTrue(schema.exists_in_database())
7070

71+
def test_close(self):
72+
session = mysqlx.get_session(self.connect_kwargs)
73+
schema = session.get_schema(self.schema_name)
74+
75+
session.close()
76+
self.assertRaises(mysqlx.OperationalError, schema.exists_in_database)
77+
7178

7279
@unittest.skipIf(tests.MYSQL_VERSION < (5, 7, 12), "XPlugin not compatible")
7380
class MySQLxNodeSessionTests(tests.MySQLxTests):

0 commit comments

Comments
 (0)