[TD-6241]<fix>: fix unexpected nan while inserting None as float/doub… (#7486)
* [TD-6241]<fix>: fix unexpected nan while inserting None as float/double type * [TD-6241]<fix>: fix binary bind error in python connector
This commit is contained in:
parent
2fcc703f65
commit
306137cac5
|
@ -300,29 +300,8 @@ class TaosMultiBind(ctypes.Structure):
|
|||
self.buffer = cast(buffer, c_void_p)
|
||||
self.num = len(values)
|
||||
|
||||
def binary(self, values):
|
||||
def _str_to_buffer(self, values):
|
||||
self.num = len(values)
|
||||
self.buffer = cast(c_char_p("".join(filter(_is_not_none, values)).encode("utf-8")), c_void_p)
|
||||
self.length = (c_int * len(values))(*[len(value) if value is not None else 0 for value in values])
|
||||
self.buffer_type = FieldType.C_BINARY
|
||||
self.is_null = cast((c_byte * self.num)(*[1 if v == None else 0 for v in values]), c_char_p)
|
||||
|
||||
def timestamp(self, values, precision=PrecisionEnum.Milliseconds):
|
||||
try:
|
||||
buffer = cast(values, c_void_p)
|
||||
except:
|
||||
buffer_type = c_int64 * len(values)
|
||||
buffer = buffer_type(*[_datetime_to_timestamp(value, precision) for value in values])
|
||||
|
||||
self.buffer_type = FieldType.C_TIMESTAMP
|
||||
self.buffer = cast(buffer, c_void_p)
|
||||
self.buffer_length = sizeof(c_int64)
|
||||
self.num = len(values)
|
||||
|
||||
def nchar(self, values):
|
||||
# type: (list[str]) -> None
|
||||
self.num = len(values)
|
||||
self.buffer_type = FieldType.C_NCHAR
|
||||
is_null = [1 if v == None else 0 for v in values]
|
||||
self.is_null = cast((c_byte * self.num)(*is_null), c_char_p)
|
||||
|
||||
|
@ -356,6 +335,26 @@ class TaosMultiBind(ctypes.Structure):
|
|||
)
|
||||
self.length = (c_int32 * len(values))(*[len(b) if b is not None else 0 for b in _bytes])
|
||||
self.buffer_length = buffer_length
|
||||
def binary(self, values):
|
||||
self.buffer_type = FieldType.C_BINARY
|
||||
self._str_to_buffer(values)
|
||||
|
||||
def timestamp(self, values, precision=PrecisionEnum.Milliseconds):
|
||||
try:
|
||||
buffer = cast(values, c_void_p)
|
||||
except:
|
||||
buffer_type = c_int64 * len(values)
|
||||
buffer = buffer_type(*[_datetime_to_timestamp(value, precision) for value in values])
|
||||
|
||||
self.buffer_type = FieldType.C_TIMESTAMP
|
||||
self.buffer = cast(buffer, c_void_p)
|
||||
self.buffer_length = sizeof(c_int64)
|
||||
self.num = len(values)
|
||||
|
||||
def nchar(self, values):
|
||||
# type: (list[str]) -> None
|
||||
self.buffer_type = FieldType.C_NCHAR
|
||||
self._str_to_buffer(values)
|
||||
|
||||
def tinyint_unsigned(self, values):
|
||||
self.buffer_type = FieldType.C_TINYINT_UNSIGNED
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
"""Constants in TDengine python
|
||||
"""
|
||||
|
||||
import ctypes, struct
|
||||
|
||||
|
||||
class FieldType(object):
|
||||
"""TDengine Field Types"""
|
||||
|
||||
|
@ -33,8 +36,8 @@ class FieldType(object):
|
|||
C_INT_UNSIGNED_NULL = 4294967295
|
||||
C_BIGINT_NULL = -9223372036854775808
|
||||
C_BIGINT_UNSIGNED_NULL = 18446744073709551615
|
||||
C_FLOAT_NULL = float("nan")
|
||||
C_DOUBLE_NULL = float("nan")
|
||||
C_FLOAT_NULL = ctypes.c_float(struct.unpack("<f", b"\x00\x00\xf0\x7f")[0])
|
||||
C_DOUBLE_NULL = ctypes.c_double(struct.unpack("<d", b"\x00\x00\x00\x00\x00\xff\xff\x7f")[0])
|
||||
C_BINARY_NULL = bytearray([int("0xff", 16)])
|
||||
# Timestamp precision definition
|
||||
C_TIMESTAMP_MILLI = 0
|
||||
|
|
Loading…
Reference in New Issue