def put_sqltype_decimal(buf_view, no_null_value, param_values, desc, param_count, short_length): scale = desc.scale max_len = desc.max_len if not isinstance(param_values, (int, str, Decimal)): raise errors.DataError( "invalid_parameter_value, data should be either int or str or decimal for column: {0}" .format(param_count)) try: param_values = Decimal(param_values) except: raise errors.DataError("decimal.ConversionSyntax") if scale > 0: param_values = param_values.fma(10**scale, 0) sign = 1 if param_values.is_signed() else 0 param_values = param_values.__abs__() param_values = param_values.to_integral_exact( rounding='ROUND_DOWN').to_eng_string() num_zeros = max_len - len(param_values) if num_zeros < 0: raise errors.DataError( "data_truncation_exceed {0}".format(param_count)) padding = bytes('0'.encode() * num_zeros) _ = Convert.put_bytes(padding, buf_view[no_null_value:], nolen=True) if sign: _ = Convert.put_bytes(param_values.encode(), buf_view[no_null_value + num_zeros:], nolen=True, is_data=True) # byte -80 : 0xFFFFFFB0 num, _ = Convert.get_bytes(buf_view[no_null_value:], length=1) _ = Convert.put_bytes(bytes([int(num) | 0xB0]), buf_view[no_null_value:], nolen=True, is_data=True) # _ = Convert.put_bytes(num | 0xB0, buf_view[no_null_value:], nolen=True, is_data=True) else: _ = Convert.put_bytes(param_values.encode(), buf_view[no_null_value + num_zeros:], nolen=True, is_data=True) return buf_view
class ContractingDecimal: def _get_other(self, other): if type(other) == ContractingDecimal: return other._d elif type(other) == float or type(other) == int: o = str(other) return Decimal(neg_sci_not(o)) return other def __init__(self, a): if type(a) == float or type(a) == int: o = str(a) self._d = Decimal(neg_sci_not(o)) elif type(a) == Decimal: self._d = a elif type(a) == str: self._d = Decimal(neg_sci_not(a)) else: self._d = Decimal(a) def __bool__(self): return self._d > 0 def __eq__(self, other): return self._d.__eq__(self._get_other(other)) def __lt__(self, other): return self._d.__lt__(self._get_other(other)) def __le__(self, other): return self._d.__le__(self._get_other(other)) def __gt__(self, other): return self._d.__gt__(self._get_other(other)) def __ge__(self, other): return self._d.__ge__(self._get_other(other)) def __str__(self): return self._d.__str__() def __neg__(self): return self._d.__neg__() def __pos__(self): return self._d.__pos__() def __abs__(self): return self._d.__abs__() def __add__(self, other): x = self._d.__add__(self._get_other(other)) return fix_precision(x) def __radd__(self, other): return fix_precision(self._d.__radd__(self._get_other(other))) def __sub__(self, other): return fix_precision(self._d.__sub__(self._get_other(other))) def __rsub__(self, other): return fix_precision(self._d.__rsub__(self._get_other(other))) def __mul__(self, other): return fix_precision(self._d.__mul__(self._get_other(other))) def __rmul__(self, other): return fix_precision(self._d.__rmul__(self._get_other(other))) def __truediv__(self, other): return fix_precision(self._d.__truediv__(self._get_other(other))) def __rtruediv__(self, other): return fix_precision(self._d.__rtruediv__(self._get_other(other))) def __divmod__(self, other): return fix_precision(self._d.__divmod__(self._get_other(other))) def __rdivmod__(self, other): return fix_precision(self._d.__divmod__(self._get_other(other))) def __mod__(self, other): return fix_precision(self._d.__mod__(self._get_other(other))) def __rmod__(self, other): return fix_precision(self._d.__rmod__(self._get_other(other))) def __floordiv__(self, other): return fix_precision(self._d.__floordiv__(self._get_other(other))) def __rfloordiv__(self, other): return fix_precision(self._d.__rfloordiv__(self._get_other(other))) def __pow__(self, other): return fix_precision(self._d.__pow__(self._get_other(other))) def __rpow__(self, other): return fix_precision(self._d.__rpow__(self._get_other(other))) def __int__(self): return self._d.__int__() def __float__(self): return float(self._d) def __round__(self, n=None): return self._d.__round__(n)
class ContractingDecimal: def _get_other(self, other): if type(other) == ContractingDecimal: return other._d elif type(other) == float or type(other) == int: return Decimal(str(other)) return other def __init__(self, a): if type(a) == float or type(a) == int: a = str(a) self._d = Decimal(a) def __bool__(self): return self._d > 0 def __eq__(self, other): return self._d.__eq__(self._get_other(other)) def __lt__(self, other): return self._d.__lt__(self._get_other(other)) def __le__(self, other): return self._d.__le__(self._get_other(other)) def __gt__(self, other): return self._d.__gt__(self._get_other(other)) def __ge__(self, other): return self._d.__ge__(self._get_other(other)) def __str__(self): return self._d.__str__() def __neg__(self): return self._d.__neg__() def __pos__(self): return self._d.__pos__() def __abs__(self): return self._d.__abs__() def __add__(self, other): x = self._d.__add__(self._get_other(other)) return fix_precision(x) def __radd__(self, other): return fix_precision(self._d.__radd__(self._get_other(other))) def __sub__(self, other): return fix_precision(self._d.__sub__(self._get_other(other))) def __rsub__(self, other): return fix_precision(self._d.__rsub__(self._get_other(other))) def __mul__(self, other): return fix_precision(self._d.__mul__(self._get_other(other))) def __rmul__(self, other): return fix_precision(self._d.__rmul__(self._get_other(other))) def __truediv__(self, other): return fix_precision(self._d.__truediv__(self._get_other(other))) def __rtruediv__(self, other): return fix_precision(self._d.__rtruediv__(self._get_other(other))) def __divmod__(self, other): return fix_precision(self._d.__divmod__(self._get_other(other))) def __rdivmod__(self, other): return fix_precision(self._d.__divmod__(self._get_other(other))) def __mod__(self, other): return fix_precision(self._d.__mod__(self._get_other(other))) def __rmod__(self, other): return fix_precision(self._d.__rmod__(self._get_other(other))) def __floordiv__(self, other): return fix_precision(self._d.__floordiv__(self._get_other(other))) def __rfloordiv__(self, other): return fix_precision(self._d.__rfloordiv__(self._get_other(other))) def __pow__(self, other): return fix_precision(self._d.__pow__(self._get_other(other))) def __rpow__(self, other): return fix_precision(self._d.__rpow__(self._get_other(other))) def __int__(self): return self._d.__int__() def __float__(self): raise Exception('Cannot cast Decimal to float.') def __repr__(self): return self._d.__repr__()