1313# See the License for the specific language governing permissions and
1414# limitations under the License.
1515
16+ import attr
1617import ctypes
1718from random import randint
1819
19- import attr
20-
2120from 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