From e52af73f37584bcddd7b2a5a1548414182bf454d Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sat, 14 Nov 2020 03:26:00 +0000 Subject: [PATCH] Added C float and binary bool loaders --- psycopg3_c/psycopg3_c/types/numeric.pyx | 38 +++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/psycopg3_c/psycopg3_c/types/numeric.pyx b/psycopg3_c/psycopg3_c/types/numeric.pyx index 46150ddbd..67399dd0c 100644 --- a/psycopg3_c/psycopg3_c/types/numeric.pyx +++ b/psycopg3_c/psycopg3_c/types/numeric.pyx @@ -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((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((data)[0]) + # avoid warning: + # dereferencing type-punned pointer will break strict-aliasing rules + cdef char *swp = &asint + return PyFloat_FromDouble((swp)[0]) + + +cdef class Float8BinaryLoader(CLoader): + cdef object cload(self, const char *data, size_t length): + cdef uint64_t asint = be64toh((data)[0]) + cdef char *swp = &asint + return PyFloat_FromDouble((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) -- 2.47.3