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
1917import attr
18+ import ctypes
19+ from random import randint
2020
2121from 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