]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Added C float and binary bool loaders
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 14 Nov 2020 03:26:00 +0000 (03:26 +0000)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 14 Nov 2020 03:26:00 +0000 (03:26 +0000)
psycopg3_c/psycopg3_c/types/numeric.pyx

index 46150ddbd7288ae4521adde0fdbb43e078725840..67399dd0cb952bdfc4a0d04ade1a03527b44fd91 100644 (file)
@@ -7,9 +7,9 @@ Cython adapters for numeric types.
 from libc.stdint cimport *
 from psycopg3_c.endian cimport be16toh, be32toh, be64toh
 
-
 from cpython.long cimport (
     PyLong_FromLong, PyLong_FromLongLong, PyLong_FromUnsignedLong)
+from cpython.float cimport PyFloat_FromDouble
 
 
 cdef class IntLoader(CLoader):
@@ -37,12 +37,35 @@ cdef class OidBinaryLoader(CLoader):
         return PyLong_FromUnsignedLong(be32toh((<uint32_t *>data)[0]))
 
 
+cdef class FloatLoader(CLoader):
+    cdef object cload(self, const char *data, size_t length):
+        return float(data)
+
+
+cdef class Float4BinaryLoader(CLoader):
+    cdef object cload(self, const char *data, size_t length):
+        cdef uint32_t asint = be32toh((<uint32_t *>data)[0])
+        # avoid warning:
+        # dereferencing type-punned pointer will break strict-aliasing rules
+        cdef char *swp = <char *>&asint
+        return PyFloat_FromDouble((<float *>swp)[0])
+
+
+cdef class Float8BinaryLoader(CLoader):
+    cdef object cload(self, const char *data, size_t length):
+        cdef uint64_t asint = be64toh((<uint64_t *>data)[0])
+        cdef char *swp = <char *>&asint
+        return PyFloat_FromDouble((<double *>swp)[0])
+
+
+cdef class BoolLoader(CLoader):
+    cdef object cload(self, const char *data, size_t length):
+        return data[0] == b't'
+
+
 cdef class BoolBinaryLoader(CLoader):
     cdef object cload(self, const char *data, size_t length):
-        if data[0]:
-            return True
-        else:
-            return False
+        return data[0] != b'\x00'
 
 
 cdef void register_numeric_c_loaders():
@@ -55,9 +78,14 @@ cdef void register_numeric_c_loaders():
     IntLoader.register(builtins["int4"].oid)
     IntLoader.register(builtins["int8"].oid)
     IntLoader.register(builtins["oid"].oid)
+    FloatLoader.register(builtins["float4"].oid)
+    FloatLoader.register(builtins["float8"].oid)
+    BoolLoader.register(builtins["bool"].oid)
 
     Int2BinaryLoader.register_binary(builtins["int2"].oid)
     Int4BinaryLoader.register_binary(builtins["int4"].oid)
     Int8BinaryLoader.register_binary(builtins["int8"].oid)
     OidBinaryLoader.register_binary(builtins["oid"].oid)
+    Float4BinaryLoader.register_binary(builtins["float4"].oid)
+    Float8BinaryLoader.register_binary(builtins["float8"].oid)
     BoolBinaryLoader.register_binary(builtins["bool"].oid)