Skip to content

Commit 0d235d8

Browse files
Dbapi2 (#160)
* added dbapi2 errors and extended Cursor and Connection functionality * disable quoting for boolean query params * updated connection and response * workaround for update and insert * workaround for lastrowid * implemented fetchone logic * minor changes * minor changes and added dbapi2 descriptions * set use_list to False for Response object * created Cursor and Connection classes Co-authored-by: Denis Ignatenko <[email protected]>
1 parent 217e59d commit 0d235d8

File tree

6 files changed

+379
-19
lines changed

6 files changed

+379
-19
lines changed

tarantool/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,4 @@ def connectmesh(addrs=({'host': 'localhost', 'port': 3301},), user=None,
7575

7676
__all__ = ['connect', 'Connection', 'connectmesh', 'MeshConnection', 'Schema',
7777
'Error', 'DatabaseError', 'NetworkError', 'NetworkWarning',
78-
'SchemaError']
78+
'SchemaError', 'dbapi']

tarantool/connection.py

+29-10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import ctypes
1313
import ctypes.util
14+
1415
try:
1516
from ctypes import c_ssize_t
1617
except ImportError:
@@ -50,12 +51,20 @@
5051
ITERATOR_ALL
5152
)
5253
from tarantool.error import (
54+
Error,
5355
NetworkError,
5456
DatabaseError,
5557
InterfaceError,
5658
SchemaError,
5759
NetworkWarning,
60+
OperationalError,
61+
DataError,
62+
IntegrityError,
63+
InternalError,
64+
ProgrammingError,
65+
NotSupportedError,
5866
SchemaReloadException,
67+
Warning,
5968
warn
6069
)
6170
from tarantool.schema import Schema
@@ -77,11 +86,20 @@ class Connection(object):
7786
Also this class provides low-level interface to data manipulation
7887
(insert/delete/update/select).
7988
'''
80-
Error = tarantool.error
89+
# DBAPI Extension: supply exceptions as attributes on the connection
90+
Error = Error
8191
DatabaseError = DatabaseError
8292
InterfaceError = InterfaceError
8393
SchemaError = SchemaError
8494
NetworkError = NetworkError
95+
Warning = Warning
96+
DataError = DataError
97+
OperationalError = OperationalError
98+
IntegrityError = IntegrityError
99+
InternalError = InternalError
100+
ProgrammingError = ProgrammingError
101+
NotSupportedError = NotSupportedError
102+
ImproperlyConfigured = Exception
85103

86104
def __init__(self, host, port,
87105
user=None,
@@ -92,6 +110,7 @@ def __init__(self, host, port,
92110
connect_now=True,
93111
encoding=ENCODING_DEFAULT,
94112
call_16=False,
113+
use_list=True,
95114
connection_timeout=CONNECTION_TIMEOUT):
96115
'''
97116
Initialize a connection to the server.
@@ -124,6 +143,7 @@ def __init__(self, host, port,
124143
self._socket = None
125144
self.connected = False
126145
self.error = True
146+
self.use_list = use_list
127147
self.encoding = encoding
128148
self.call_16 = call_16
129149
self.connection_timeout = connection_timeout
@@ -261,7 +281,7 @@ def _send_request_wo_reconnect(self, request):
261281
while True:
262282
try:
263283
self._socket.sendall(bytes(request))
264-
response = Response(self, self._read_response())
284+
response = Response(self, self._read_response(), self.use_list)
265285
break
266286
except SchemaReloadException as e:
267287
self.update_schema(e.schema_version)
@@ -293,13 +313,12 @@ def check(): # Check that connection is alive
293313
retbytes = self._sys_recv(sock_fd, buf, 1, flag)
294314

295315
err = 0
296-
if os.name!= 'nt':
316+
if os.name != 'nt':
297317
err = ctypes.get_errno()
298318
else:
299319
err = ctypes.get_last_error()
300320
self._socket.setblocking(True)
301321

302-
303322
WWSAEWOULDBLOCK = 10035
304323
if (retbytes < 0) and (err == errno.EAGAIN or
305324
err == errno.EWOULDBLOCK or
@@ -446,7 +465,7 @@ def _join_v16(self, server_uuid):
446465
self._socket.sendall(bytes(request))
447466

448467
while True:
449-
resp = Response(self, self._read_response())
468+
resp = Response(self, self._read_response(), self.use_list)
450469
yield resp
451470
if resp.code == REQUEST_TYPE_OK or resp.code >= REQUEST_TYPE_ERROR:
452471
return
@@ -460,7 +479,7 @@ class JoinState:
460479
self._socket.sendall(bytes(request))
461480
state = JoinState.Handshake
462481
while True:
463-
resp = Response(self, self._read_response())
482+
resp = Response(self, self._read_response(), self.use_list)
464483
yield resp
465484
if resp.code >= REQUEST_TYPE_ERROR:
466485
return
@@ -489,7 +508,7 @@ def subscribe(self, cluster_uuid, server_uuid, vclock=None):
489508
request = RequestSubscribe(self, cluster_uuid, server_uuid, vclock)
490509
self._socket.sendall(bytes(request))
491510
while True:
492-
resp = Response(self, self._read_response())
511+
resp = Response(self, self._read_response(), self.use_list)
493512
yield resp
494513
if resp.code >= REQUEST_TYPE_ERROR:
495514
return
@@ -791,10 +810,10 @@ def execute(self, query, params=None):
791810
'''
792811
Execute SQL request.
793812
Execute SQL query in database.
794-
795-
:param query: SQL syntax query
813+
814+
:param query: SQL syntax query
796815
:type query: str
797-
816+
798817
:param params: Bind values to use in query
799818
:type params: list, dict
800819

0 commit comments

Comments
 (0)