def parse(self, client: 'Client'): header_class = self.build_header() buffer = client.recv(ctypes.sizeof(header_class)) header = header_class.from_buffer_copy(buffer) fields = [] if header.status_code == OP_SUCCESS: for name, ignite_type in self.following: c_type, buffer_fragment = ignite_type.parse(client) buffer += buffer_fragment fields.append((name, c_type)) else: c_type, buffer_fragment = String.parse(client) buffer += buffer_fragment fields.append(('error_message', c_type)) response_class = type( 'Response', (header_class,), { '_pack_': 1, '_fields_': fields, } ) return response_class, buffer
def parse(self, client: 'Client'): header_class = self.build_header() buffer = client.recv(ctypes.sizeof(header_class)) header = header_class.from_buffer_copy(buffer) fields = [] if header.status_code == OP_SUCCESS: for name, ignite_type in self.following: c_type, buffer_fragment = ignite_type.parse(client) buffer += buffer_fragment fields.append((name, c_type)) else: c_type, buffer_fragment = String.parse(client) buffer += buffer_fragment fields.append(('error_message', c_type)) response_class = type('Response', (header_class, ), { '_pack_': 1, '_fields_': fields, }) return response_class, buffer
def __parse_header(self, stream): init_pos = stream.tell() if self.protocol_context.is_status_flags_supported(): header_class = StatusFlagResponseHeader else: header_class = ResponseHeader header_len = ctypes.sizeof(header_class) header = stream.read_ctype(header_class) stream.seek(header_len, SEEK_CUR) fields = [] has_error = False if self.protocol_context.is_status_flags_supported(): if header.flags & RHF_TOPOLOGY_CHANGED: fields = [ ('affinity_version', ctypes.c_longlong), ('affinity_minor', ctypes.c_int), ] if header.flags & RHF_ERROR: fields.append(('status_code', ctypes.c_int)) has_error = True else: has_error = header.status_code != OP_SUCCESS if fields: stream.seek(sum(ctypes.sizeof(c_type) for _, c_type in fields), SEEK_CUR) if has_error: msg_type = String.parse(stream) fields.append(('error_message', msg_type)) return not has_error, init_pos, header_class, fields
def __init__(self, response: 'Response'): self.status = response.status_code self.query_id = response.query_id if hasattr(response, 'error_message'): self.message = String.to_python(response.error_message)
def parse(self, client: 'Client'): header_class = self.build_header() buffer = client.recv(ctypes.sizeof(header_class)) header = header_class.from_buffer_copy(buffer) fields = [] if header.status_code == OP_SUCCESS: following = [ self.fields_or_field_count(), ('row_count', Int), ] if self.has_cursor: following.insert(0, ('cursor', Long)) body_struct = Struct(following) body_class, body_buffer = body_struct.parse(client) body = body_class.from_buffer_copy(body_buffer) if self.include_field_names: field_count = body.fields.length else: field_count = body.field_count data_fields = [] data_buffer = b'' for i in range(body.row_count): row_fields = [] row_buffer = b'' for j in range(field_count): field_class, field_buffer = AnyDataObject.parse(client) row_fields.append(('column_{}'.format(j), field_class)) row_buffer += field_buffer row_class = type('SQLResponseRow', (ctypes.LittleEndianStructure, ), { '_pack_': 1, '_fields_': row_fields, }) data_fields.append(('row_{}'.format(i), row_class)) data_buffer += row_buffer data_class = type('SQLResponseData', (ctypes.LittleEndianStructure, ), { '_pack_': 1, '_fields_': data_fields, }) fields += body_class._fields_ + [ ('data', data_class), ('more', ctypes.c_bool), ] buffer += body_buffer + data_buffer else: c_type, buffer_fragment = String.parse(client) buffer += buffer_fragment fields.append(('error_message', c_type)) final_class = type('SQLResponse', (header_class, ), { '_pack_': 1, '_fields_': fields, }) buffer += client.recv(ctypes.sizeof(final_class) - len(buffer)) return final_class, buffer
def __init__(self, response): self.status = getattr(response, 'status_code', OP_SUCCESS) self.query_id = response.query_id if hasattr(response, 'error_message'): self.message = String.to_python(response.error_message)
def parse(self, client: 'Client'): header_class = self.build_header() buffer = client.recv(ctypes.sizeof(header_class)) header = header_class.from_buffer_copy(buffer) fields = [] if header.status_code == OP_SUCCESS: following = [ self.fields_or_field_count(), ('row_count', Int), ] if self.has_cursor: following.insert(0, ('cursor', Long)) body_struct = Struct(following) body_class, body_buffer = body_struct.parse(client) body = body_class.from_buffer_copy(body_buffer) if self.include_field_names: field_count = body.fields.length else: field_count = body.field_count data_fields = [] data_buffer = b'' for i in range(body.row_count): row_fields = [] row_buffer = b'' for j in range(field_count): field_class, field_buffer = AnyDataObject.parse(client) row_fields.append(('column_{}'.format(j), field_class)) row_buffer += field_buffer row_class = type( 'SQLResponseRow', (ctypes.LittleEndianStructure,), { '_pack_': 1, '_fields_': row_fields, } ) data_fields.append(('row_{}'.format(i), row_class)) data_buffer += row_buffer data_class = type( 'SQLResponseData', (ctypes.LittleEndianStructure,), { '_pack_': 1, '_fields_': data_fields, } ) fields += body_class._fields_ + [ ('data', data_class), ('more', ctypes.c_bool), ] buffer += body_buffer + data_buffer else: c_type, buffer_fragment = String.parse(client) buffer += buffer_fragment fields.append(('error_message', c_type)) final_class = type( 'SQLResponse', (header_class,), { '_pack_': 1, '_fields_': fields, } ) buffer += client.recv(ctypes.sizeof(final_class) - len(buffer)) return final_class, buffer