Skip to content

Commit c746329

Browse files
ivandaschisapego
authored andcommitted
IGNITE-14072 Refactor, remove duplicates and optimize Response and SQLResponse
This closes #8
1 parent 4ca871d commit c746329

5 files changed

Lines changed: 130 additions & 347 deletions

File tree

pyignite/api/binary.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@
2020
body_struct, enum_struct, schema_struct, binary_fields_struct,
2121
)
2222
from pyignite.datatypes import String, Int, Bool
23-
from pyignite.queries import Query, get_response_class
23+
from pyignite.queries import Query
2424
from pyignite.queries.op_codes import *
2525
from pyignite.utils import int_overflow, entity_id
2626
from .result import APIResult
27+
from ..queries.response import Response
2728

2829

2930
def get_binary_type(
@@ -53,9 +54,9 @@ def get_binary_type(
5354
})
5455
connection.send(send_buffer)
5556

56-
response_head_struct = get_response_class(connection)([
57-
('type_exists', Bool),
58-
])
57+
response_head_struct = Response(protocol_version=connection.get_protocol_version(),
58+
following=[('type_exists', Bool)])
59+
5960
response_head_type, recv_buffer = response_head_struct.parse(connection)
6061
response_head = response_head_type.from_buffer_copy(recv_buffer)
6162
response_parts = []

pyignite/datatypes/complex.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ def find_client():
456456
frame = rec[0]
457457
code = frame.f_code
458458
for varname in code.co_varnames:
459-
suspect = frame.f_locals[varname]
459+
suspect = frame.f_locals.get(varname)
460460
if isinstance(suspect, Client):
461461
return suspect
462462
if isinstance(suspect, Connection):

pyignite/queries/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@
2121
:mod:`pyignite.datatypes` binary parser/generator classes.
2222
"""
2323

24-
from .query import Query, ConfigQuery, get_response_class
24+
from .query import Query, ConfigQuery

pyignite/queries/query.py

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,14 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16+
import attr
1617
import ctypes
1718
from random import randint
1819

19-
import attr
20-
2120
from pyignite.api.result import APIResult
22-
from pyignite.constants import *
23-
from pyignite.queries import response
24-
25-
26-
def get_response_class(obj: object, sql: bool = False):
27-
"""
28-
Response class factory.
29-
30-
:param obj: cache, connection or client object,
31-
:param sql: (optional) return normal (default) or SQL response class,
32-
:return: response class.
33-
"""
34-
template = 'SQLResponse{}{}{}' if sql else 'Response{}{}{}'
35-
return getattr(response, template.format(*obj.get_protocol_version()))
21+
from pyignite.connection import Connection
22+
from pyignite.constants import MIN_LONG, MAX_LONG, RHF_TOPOLOGY_CHANGED
23+
from pyignite.queries.response import Response, SQLResponse
3624

3725

3826
@attr.s
@@ -59,11 +47,7 @@ def build_c_type(cls):
5947
)
6048
return cls._query_c_type
6149

62-
def from_python(self, values: dict = None):
63-
if values is None:
64-
values = {}
65-
buffer = b''
66-
50+
def _build_header(self, buffer: bytearray, values: dict):
6751
header_class = self.build_c_type()
6852
header = header_class()
6953
header.op_code = self.op_code
@@ -74,14 +58,23 @@ def from_python(self, values: dict = None):
7458
buffer += c_type.from_python(values[name])
7559

7660
header.length = (
77-
len(buffer)
78-
+ ctypes.sizeof(header_class)
79-
- ctypes.sizeof(ctypes.c_int)
61+
len(buffer)
62+
+ ctypes.sizeof(header_class)
63+
- ctypes.sizeof(ctypes.c_int)
8064
)
81-
return header.query_id, bytes(header) + buffer
65+
66+
return header
67+
68+
def from_python(self, values: dict = None):
69+
if values is None:
70+
values = {}
71+
buffer = bytearray()
72+
header = self._build_header(buffer, values)
73+
buffer[:0] = bytes(header)
74+
return header.query_id, bytes(buffer)
8275

8376
def perform(
84-
self, conn: 'Connection', query_params: dict = None,
77+
self, conn: Connection, query_params: dict = None,
8578
response_config: list = None, sql: bool = False, **kwargs,
8679
) -> APIResult:
8780
"""
@@ -98,8 +91,14 @@ def perform(
9891
"""
9992
_, send_buffer = self.from_python(query_params)
10093
conn.send(send_buffer)
101-
response_class = get_response_class(conn, sql)
102-
response_struct = response_class(response_config, **kwargs)
94+
95+
if sql:
96+
response_struct = SQLResponse(protocol_version=conn.get_protocol_version(),
97+
following=response_config, **kwargs)
98+
else:
99+
response_struct = Response(protocol_version=conn.get_protocol_version(),
100+
following=response_config)
101+
103102
response_ctype, recv_buffer = response_struct.parse(conn)
104103
response = response_ctype.from_buffer_copy(recv_buffer)
105104

@@ -141,24 +140,7 @@ def build_c_type(cls):
141140
)
142141
return cls._query_c_type
143142

144-
def from_python(self, values: dict = None):
145-
if values is None:
146-
values = {}
147-
buffer = b''
148-
149-
header_class = self.build_c_type()
150-
header = header_class()
151-
header.op_code = self.op_code
152-
if self.query_id is None:
153-
header.query_id = randint(MIN_LONG, MAX_LONG)
154-
155-
for name, c_type in self.following:
156-
buffer += c_type.from_python(values[name])
157-
158-
header.length = (
159-
len(buffer)
160-
+ ctypes.sizeof(header_class)
161-
- ctypes.sizeof(ctypes.c_int)
162-
)
163-
header.config_length = header.length - ctypes.sizeof(header_class)
164-
return header.query_id, bytes(header) + buffer
143+
def _build_header(self, buffer: bytearray, values: dict):
144+
header = super()._build_header(buffer, values)
145+
header.config_length = header.length - ctypes.sizeof(type(header))
146+
return header

0 commit comments

Comments
 (0)