Skip to content

Commit d992c24

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 29184e0 commit d992c24

File tree

5 files changed

+372
-13
lines changed

5 files changed

+372
-13
lines changed

Diff for: 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']

Diff for: tarantool/connection.py

+24-6
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,20 @@
5050
ITERATOR_ALL
5151
)
5252
from tarantool.error import (
53+
Error,
5354
NetworkError,
5455
DatabaseError,
5556
InterfaceError,
5657
SchemaError,
5758
NetworkWarning,
59+
OperationalError,
60+
DataError,
61+
IntegrityError,
62+
InternalError,
63+
ProgrammingError,
64+
NotSupportedError,
5865
SchemaReloadException,
66+
Warning,
5967
warn
6068
)
6169
from tarantool.schema import Schema
@@ -77,11 +85,20 @@ class Connection(object):
7785
Also this class provides low-level interface to data manipulation
7886
(insert/delete/update/select).
7987
'''
80-
Error = tarantool.error
88+
# DBAPI Extension: supply exceptions as attributes on the connection
89+
Error = Error
8190
DatabaseError = DatabaseError
8291
InterfaceError = InterfaceError
8392
SchemaError = SchemaError
8493
NetworkError = NetworkError
94+
Warning = Warning
95+
DataError = DataError
96+
OperationalError = OperationalError
97+
IntegrityError = IntegrityError
98+
InternalError = InternalError
99+
ProgrammingError = ProgrammingError
100+
NotSupportedError = NotSupportedError
101+
ImproperlyConfigured = Exception
85102

86103
def __init__(self, host, port,
87104
user=None,
@@ -92,6 +109,7 @@ def __init__(self, host, port,
92109
connect_now=True,
93110
encoding=ENCODING_DEFAULT,
94111
call_16=False,
112+
use_list=True,
95113
connection_timeout=CONNECTION_TIMEOUT):
96114
'''
97115
Initialize a connection to the server.
@@ -124,6 +142,7 @@ def __init__(self, host, port,
124142
self._socket = None
125143
self.connected = False
126144
self.error = True
145+
self.use_list = use_list
127146
self.encoding = encoding
128147
self.call_16 = call_16
129148
self.connection_timeout = connection_timeout
@@ -261,7 +280,7 @@ def _send_request_wo_reconnect(self, request):
261280
while True:
262281
try:
263282
self._socket.sendall(bytes(request))
264-
response = Response(self, self._read_response())
283+
response = Response(self, self._read_response(), self.use_list)
265284
break
266285
except SchemaReloadException as e:
267286
self.update_schema(e.schema_version)
@@ -299,7 +318,6 @@ def check(): # Check that connection is alive
299318
err = ctypes.get_last_error()
300319
self._socket.setblocking(True)
301320

302-
303321
WWSAEWOULDBLOCK = 10035
304322
if (retbytes < 0) and (err == errno.EAGAIN or
305323
err == errno.EWOULDBLOCK or
@@ -446,7 +464,7 @@ def _join_v16(self, server_uuid):
446464
self._socket.sendall(bytes(request))
447465

448466
while True:
449-
resp = Response(self, self._read_response())
467+
resp = Response(self, self._read_response(), self.use_list)
450468
yield resp
451469
if resp.code == REQUEST_TYPE_OK or resp.code >= REQUEST_TYPE_ERROR:
452470
return
@@ -460,7 +478,7 @@ class JoinState:
460478
self._socket.sendall(bytes(request))
461479
state = JoinState.Handshake
462480
while True:
463-
resp = Response(self, self._read_response())
481+
resp = Response(self, self._read_response(), self.use_list)
464482
yield resp
465483
if resp.code >= REQUEST_TYPE_ERROR:
466484
return
@@ -489,7 +507,7 @@ def subscribe(self, cluster_uuid, server_uuid, vclock=None):
489507
request = RequestSubscribe(self, cluster_uuid, server_uuid, vclock)
490508
self._socket.sendall(bytes(request))
491509
while True:
492-
resp = Response(self, self._read_response())
510+
resp = Response(self, self._read_response(), self.use_list)
493511
yield resp
494512
if resp.code >= REQUEST_TYPE_ERROR:
495513
return

0 commit comments

Comments
 (0)