in pyignite/datatypes/standard.py [0:0]
def from_python_not_null(cls, stream, value: decimal.Decimal, **kwargs):
sign, digits, scale = value.normalize().as_tuple()
integer = int(''.join([str(d) for d in digits]))
# calculate number of bytes (at least one, and not forget the sign bit)
length = ceil((integer.bit_length() + 1) / 8)
# write byte string
data = []
for i in range(length):
digit = integer % 0x100
integer //= 0x100
data.insert(0, digit)
# apply sign
if sign:
data[0] |= 0x80
else:
data[0] &= 0x7f
data_class = cls.build_c_type(length)
data_object = data_class()
data_object.type_code = int.from_bytes(
cls.type_code,
byteorder=PROTOCOL_BYTE_ORDER
)
data_object.length = length
data_object.scale = -scale
for i in range(length):
data_object.data[i] = data[i]
stream.write(data_object)