def _parse_accsecrd(self): secmec = sectkn = None chained = True while chained: dds_type, chained, number, code_point, obj = ddm.read_dds( self.sock) if code_point == cp.ACCSECRD: while len(obj): ln = int.from_bytes(obj[:2], byteorder='big') sub_cp = int.from_bytes(obj[2:4], byteorder='big') v = obj[4:ln] obj = obj[ln:] if sub_cp == cp.SECMEC: secmec = int.from_bytes(v[:2], byteorder='big') elif sub_cp == cp.SECTKN: sectkn = v return secmec, sectkn
def _parse_response(self): results = collections.deque() params_description = None description = None err = qrydsc = None chained = True err_msg = None while chained: dds_type, chained, number, code_point, obj = ddm.read_dds( self.sock) if code_point == cp.SQLERRRM: err_msg = ddm.parse_reply(obj).get(cp.SRVDGN).decode('utf-8') elif code_point == cp.SQLCARD: if err is None: err, _ = ddm.parse_sqlcard(obj, self.encoding, self.endian) elif code_point == cp.SQLDARD: if obj[0] == 0xFF: err, params_description = ddm.parse_sqldard( obj, 'utf-8', self.endian, self.db_type) else: err, description = ddm.parse_sqldard( obj, 'utf-8', self.endian, self.db_type) elif code_point == cp.QRYDSC: ln = obj[0] b = obj[1:ln] assert b[:2] == b'\x76\xd0' b = b[2:] # [(DRDA_TYPE_xxxx, size_binary), ...] qrydsc = [(c[0], c[1:]) for c in [b[i:i + 3] for i in range(0, len(b), 3)]] elif code_point == cp.QRYDTA: b = obj while len(b): if (b[0], b[1]) != (0xff, 0x00): break b = b[2:] r = [] for t, ps in qrydsc: v, b = utils.read_field(t, ps, b, self.endian) r.append(v) results.append(tuple(r)) if err: raise err return results, description, params_description