]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Added C bool dumpers (text, binary)
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 21 Nov 2020 20:33:51 +0000 (20:33 +0000)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 21 Nov 2020 20:47:40 +0000 (20:47 +0000)
psycopg3/psycopg3/types/singletons.py
psycopg3_c/psycopg3_c/_psycopg3.pyx
psycopg3_c/psycopg3_c/adapt.pyx
psycopg3_c/psycopg3_c/types/numeric.pyx
psycopg3_c/psycopg3_c/types/singletons.pyx [new file with mode: 0644]

index f6de7e09ddb7f2b556cf93b22cf5a731504719c4..0c6e04e9553cfbea603c328c23e857e0a94ab5de 100644 (file)
@@ -7,13 +7,11 @@ Adapters for None and boolean.
 from ..oids import builtins
 from ..adapt import Dumper, Loader
 
-BOOL_OID = builtins["bool"].oid
-
 
 @Dumper.text(bool)
 class BoolDumper(Dumper):
 
-    oid = BOOL_OID
+    oid = builtins["bool"].oid
 
     def dump(self, obj: bool) -> bytes:
         return b"t" if obj else b"f"
@@ -25,7 +23,7 @@ class BoolDumper(Dumper):
 @Dumper.binary(bool)
 class BoolBinaryDumper(Dumper):
 
-    oid = BOOL_OID
+    oid = builtins["bool"].oid
 
     def dump(self, obj: bool) -> bytes:
         return b"\x01" if obj else b"\x00"
index 6746187ac380617b21632eaa296120a75cbc9bb3..bf5ae1760f4cec205ed2402a0f92bd04273af009 100644 (file)
@@ -8,6 +8,7 @@ if a compiler is available.
 # Copyright (C) 2020 The Psycopg Team
 
 include "types/numeric.pyx"
+include "types/singletons.pyx"
 include "types/text.pyx"
 include "generators.pyx"
 include "adapt.pyx"
index fd1a336e397d56583bc51ccbd47a8e73a957a981..22a19b639cc2a06aadae1685310caa48e15189b0 100644 (file)
@@ -140,4 +140,5 @@ def register_builtin_c_adapters():
     """
     logger.debug("registering optimised c adapters")
     register_numeric_c_adapters()
+    register_singletons_c_adapters()
     register_text_c_adapters()
index 17e362beeb026fb0e77181b4fa3c914e961728d1..f24a879ed62db2296656cb49b0b0328442b8f0d6 100644 (file)
@@ -96,17 +96,6 @@ cdef class Float8BinaryLoader(CLoader):
         return PyFloat_FromDouble((<double *>swp)[0])
 
 
-cdef class BoolLoader(CLoader):
-    cdef object cload(self, const char *data, size_t length):
-        # this creates better C than `return data[0] == b't'`
-        return True if data[0] == b't' else False
-
-
-cdef class BoolBinaryLoader(CLoader):
-    cdef object cload(self, const char *data, size_t length):
-        return True if data[0] else False
-
-
 cdef void register_numeric_c_adapters():
     logger.debug("registering optimised numeric c adapters")
 
@@ -121,7 +110,6 @@ cdef void register_numeric_c_adapters():
     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)
@@ -129,4 +117,3 @@ cdef void register_numeric_c_adapters():
     OidBinaryLoader.register_binary(builtins["oid"].oid)
     Float4BinaryLoader.register_binary(builtins["float4"].oid)
     Float8BinaryLoader.register_binary(builtins["float8"].oid)
-    BoolBinaryLoader.register_binary(builtins["bool"].oid)
diff --git a/psycopg3_c/psycopg3_c/types/singletons.pyx b/psycopg3_c/psycopg3_c/types/singletons.pyx
new file mode 100644 (file)
index 0000000..5d1b803
--- /dev/null
@@ -0,0 +1,58 @@
+"""
+Cython adapters for boolean.
+"""
+
+# Copyright (C) 2020 The Psycopg Team
+
+cdef class BoolDumper(CDumper):
+    oid = 16  # TODO: bool oid
+
+    def dump(self, obj: bool) -> bytes:
+        # Fast paths, just a pointer comparison
+        if obj is True:
+            return b"t"
+        elif obj is False:
+            return b"f"
+        else:
+            return b"t" if obj else b"f"
+
+    def quote(self, obj: bool) -> bytes:
+        if obj is True:
+            return b"true"
+        elif obj is False:
+            return b"false"
+        else:
+            return b"true" if obj else b"false"
+
+
+cdef class BoolBinaryDumper(BoolDumper):
+    def dump(self, obj: bool) -> bytes:
+        if obj is True:
+            return b"\x01"
+        elif obj is False:
+            return b"\x00"
+        else:
+            return b"\x01" if obj else b"\x00"
+
+
+cdef class BoolLoader(CLoader):
+    cdef object cload(self, const char *data, size_t length):
+        # this creates better C than `return data[0] == b't'`
+        return True if data[0] == b't' else False
+
+
+cdef class BoolBinaryLoader(CLoader):
+    cdef object cload(self, const char *data, size_t length):
+        return True if data[0] else False
+
+
+cdef void register_singletons_c_adapters():
+    logger.debug("registering optimised singletons c adapters")
+
+    from psycopg3.oids import builtins
+
+    BoolDumper.register(bool)
+    BoolBinaryDumper.register_binary(bool)
+
+    BoolLoader.register(builtins["bool"].oid)
+    BoolBinaryLoader.register_binary(builtins["bool"].oid)