Skip to content

Commit 86fb5c5

Browse files
isapegoivandasch
andauthored
GG-32680 [IGNITE-14072] Refactor and optimize Response and SQLResponse (#19)
(cherry picked from commit c746329) Co-authored-by: Ivan Dashchinskiy <ivandasch@gmail.com>
1 parent 59061d0 commit 86fb5c5

5 files changed

Lines changed: 132 additions & 347 deletions

File tree

pygridgain/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 pygridgain.datatypes import String, Int, Bool
23-
from pygridgain.queries import Query, get_response_class
23+
from pygridgain.queries import Query
2424
from pygridgain.queries.op_codes import *
2525
from pygridgain.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 = []

pygridgain/datatypes/complex.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ def find_client():
496496
frame = rec[0]
497497
code = frame.f_code
498498
for varname in code.co_varnames:
499-
suspect = frame.f_locals[varname]
499+
suspect = frame.f_locals.get(varname)
500500
if isinstance(suspect, Client):
501501
return suspect
502502
if isinstance(suspect, Connection):

pygridgain/queries/__init__.py

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

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

pygridgain/queries/query.py

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,15 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
import ctypes
17-
from random import randint
1816

1917
import attr
18+
import ctypes
19+
from random import randint
2020

2121
from pygridgain.api.result import APIResult
22-
from pygridgain.constants import *
23-
from pygridgain.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()))
22+
from pygridgain.connection import Connection
23+
from pygridgain.constants import MIN_LONG, MAX_LONG, RHF_TOPOLOGY_CHANGED
24+
from pygridgain.queries.response import Response, SQLResponse
3625

3726

3827
@attr.s
@@ -59,11 +48,7 @@ def build_c_type(cls):
5948
)
6049
return cls._query_c_type
6150

62-
def from_python(self, values: dict = None):
63-
if values is None:
64-
values = {}
65-
buffer = b''
66-
51+
def _build_header(self, buffer: bytearray, values: dict):
6752
header_class = self.build_c_type()
6853
header = header_class()
6954
header.op_code = self.op_code
@@ -74,14 +59,23 @@ def from_python(self, values: dict = None):
7459
buffer += c_type.from_python(values[name])
7560

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

8377
def perform(
84-
self, conn: 'Connection', query_params: dict = None,
78+
self, conn: Connection, query_params: dict = None,
8579
response_config: list = None, sql: bool = False, **kwargs,
8680
) -> APIResult:
8781
"""
@@ -98,8 +92,14 @@ def perform(
9892
"""
9993
_, send_buffer = self.from_python(query_params)
10094
conn.send(send_buffer)
101-
response_class = get_response_class(conn, sql)
102-
response_struct = response_class(response_config, **kwargs)
95+
96+
if sql:
97+
response_struct = SQLResponse(protocol_version=conn.get_protocol_version(),
98+
following=response_config, **kwargs)
99+
else:
100+
response_struct = Response(protocol_version=conn.get_protocol_version(),
101+
following=response_config)
102+
103103
response_ctype, recv_buffer = response_struct.parse(conn)
104104
response = response_ctype.from_buffer_copy(recv_buffer)
105105

@@ -141,24 +141,7 @@ def build_c_type(cls):
141141
)
142142
return cls._query_c_type
143143

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
144+
def _build_header(self, buffer: bytearray, values: dict):
145+
header = super()._build_header(buffer, values)
146+
header.config_length = header.length - ctypes.sizeof(type(header))
147+
return header

0 commit comments

Comments
 (0)