def test_intstore(self): """Use intstore to pack valid integers (2^64 max) as a string.""" try: for i, j in enumerate((8, 16, 24, 32, 64)): val = 2 ** (j - 1) utils.intstore(val) except ValueError as err: self.fail("intstore failed with 'int{0}store: {1}".format(i, err))
def test_intstore(self): """Use intstore to pack valid integers (2^64 max) as a string.""" try: for i, j in enumerate((8, 16, 24, 32, 64)): val = 2**(j - 1) utils.intstore(val) except ValueError as err: self.fail("intstore failed with 'int{0}store: {1}".format(i, err))
def test_intstore(self): """Use intstore to pack valid integers (2^64 max) as a string.""" try: for i,r in enumerate((8, 16, 24, 32, 64)): val = 2**(r-1) utils.intstore(val) except ValueError, e: self.fail("intstore failed with 'int%dstore: %s" %\ (i,e))
def test_intstore(self): """Use intstore to pack valid integers (2^64 max) as a string.""" try: for i, r in enumerate((8, 16, 24, 32, 64)): val = 2**(r - 1) utils.intstore(val) except ValueError as e: self.fail("intstore failed with 'int%dstore: %s" %\ (i,e))
def test_read_lc_int(self): """Read a length encoded integer from a buffer.""" buf = '\xfb' exp = 2**(8-1) lcs = utils.intstore(exp) self.assertEqual(exp,utils.read_lc_int(lcs)[1], "Failed getting length coded int(250)") exp = 2**(8-1) lcs = utils.intstore(251) + utils.intstore(exp) self.assertEqual(None,utils.read_lc_int(lcs)[1], "Failed getting length coded int(250)") exp = 2**(16-1) lcs = utils.intstore(252) + utils.intstore(exp) self.assertEqual(exp,utils.read_lc_int(lcs)[1], "Failed getting length coded int(2^16-1)") exp = 2**(24-1) lcs = utils.intstore(253) + utils.intstore(exp) self.assertEqual(exp,utils.read_lc_int(lcs)[1], "Failed getting length coded int(2^24-1)") exp = 12321848580485677055 lcs = '\xfe\xff\xff\xff\xff\xff\xff\xff\xaa\xdd\xdd' exprest = '\xdd\xdd' self.assertEqual((exprest,exp),utils.read_lc_int(lcs), "Failed getting length coded long long")
def test_read_lc_int(self): """Read a length encoded integer from a buffer.""" buf = b'\xfb' exp = 2**(8 - 1) lcs = utils.intstore(exp) self.assertEqual(exp, utils.read_lc_int(lcs)[1], "Failed getting length coded int(250)") exp = 2**(8 - 1) lcs = utils.intstore(251) + utils.intstore(exp) self.assertEqual(None, utils.read_lc_int(lcs)[1], "Failed getting length coded int(250)") exp = 2**(16 - 1) lcs = utils.intstore(252) + utils.intstore(exp) self.assertEqual(exp, utils.read_lc_int(lcs)[1], "Failed getting length coded int(2^16-1)") exp = 2**(24 - 1) lcs = utils.intstore(253) + utils.intstore(exp) self.assertEqual(exp, utils.read_lc_int(lcs)[1], "Failed getting length coded int(2^24-1)") exp = 12321848580485677055 lcs = b'\xfe\xff\xff\xff\xff\xff\xff\xff\xaa\xdd\xdd' exprest = b'\xdd\xdd' self.assertEqual((exprest, exp), utils.read_lc_int(lcs), "Failed getting length coded long long")
def make_stmt_execute(self, statement_id, data=(), parameters=(), flags=0, long_data_used=None, charset='utf8'): """Make a MySQL packet with the Statement Execute command""" iteration_count = 1 null_bitmap = [0] * ((len(data) + 7) // 8) values = [] types = [] packed = b'' if long_data_used is None: long_data_used = {} if parameters and data: if len(data) != len(parameters): raise errors.InterfaceError( "Failed executing prepared statement: data values does not" " match number of parameters") for pos, _ in enumerate(parameters): value = data[pos] flags = 0 if value is None: null_bitmap[(pos // 8)] |= 1 << (pos % 8) continue elif pos in long_data_used: if long_data_used[pos][0]: # We suppose binary data field_type = FieldType.BLOB else: # We suppose text data field_type = FieldType.STRING elif isinstance(value, int): (packed, field_type, flags) = self._prepare_binary_integer(value) values.append(packed) elif isinstance(value, str): value = value.encode(charset) values.append( utils.intstore(len(value)) + value) field_type = FieldType.VARCHAR elif isinstance(value, bytes): values.append(utils.intstore(len(value)) + value) field_type = FieldType.BLOB elif isinstance(value, Decimal): values.append( utils.intstore(len(str(value).encode(charset))) + str(value).encode(charset)) field_type = FieldType.DECIMAL elif isinstance(value, float): values.append(struct.pack('d', value)) field_type = FieldType.DOUBLE elif isinstance(value, (datetime.datetime, datetime.date)): (packed, field_type) = self._prepare_binary_timestamp( value) values.append(packed) elif isinstance(value, (datetime.timedelta, datetime.time)): (packed, field_type) = self._prepare_binary_time(value) values.append(packed) else: raise errors.ProgrammingError( "MySQL binary protocol can not handle " "'{classname}' objects".format( classname=value.__class__.__name__)) types.append(utils.int1store(field_type) + utils.int1store(flags)) packet = ( utils.int4store(statement_id), utils.int1store(flags), utils.int4store(iteration_count), b''.join([struct.pack('B', bit) for bit in null_bitmap]), utils.int1store(1), b''.join(types), b''.join(values) ) return b''.join(packet)
def make_stmt_execute(self, statement_id, data=(), parameters=(), flags=0, long_data_used=None, charset='utf8'): """Make a MySQL packet with the Statement Execute command""" iteration_count = 1 null_bitmap = [0] * ((len(data) + 7) // 8) values = [] types = [] packed = '' if long_data_used is None: long_data_used = {} if parameters and data: if len(data) != len(parameters): raise errors.InterfaceError( "Failed executing prepared statement: data values does not" " match number of parameters") for pos, _ in enumerate(parameters): value = data[pos] flags = 0 if value is None: null_bitmap[(pos // 8)] |= 1 << (pos % 8) continue elif pos in long_data_used: if long_data_used[pos][0]: # We suppose binary data field_type = FieldType.BLOB else: # We suppose text data field_type = FieldType.STRING elif isinstance(value, (int, long)): (packed, field_type, flags) = self._prepare_binary_integer(value) values.append(packed) elif isinstance(value, str): values.append(utils.intstore(len(value)) + value) field_type = FieldType.VARCHAR elif isinstance(value, unicode): value = value.encode(charset) values.append(utils.intstore(len(value)) + value) field_type = FieldType.VARCHAR elif isinstance(value, Decimal): values.append(utils.intstore(len(str(value))) + str(value)) field_type = FieldType.DECIMAL elif isinstance(value, float): values.append(struct.pack('d', value)) field_type = FieldType.DOUBLE elif isinstance(value, (datetime.datetime, datetime.date)): (packed, field_type) = self._prepare_binary_timestamp( value) values.append(packed) elif isinstance(value, (datetime.timedelta, datetime.time)): (packed, field_type) = self._prepare_binary_time(value) values.append(packed) else: raise errors.ProgrammingError( "MySQL binary protocol can not handle " "'{classname}' objects".format( classname=value.__class__.__name__)) types.append(utils.int1store(field_type) + utils.int1store(flags)) packet = ( utils.int4store(statement_id), utils.int1store(flags), utils.int4store(iteration_count), ''.join([struct.pack('B', bit) for bit in null_bitmap]), utils.int1store(1), ''.join(types), ''.join(values) ) return ''.join(packet)