From: Daniele Varrazzo Date: Sat, 21 Nov 2020 20:33:51 +0000 (+0000) Subject: Added C bool dumpers (text, binary) X-Git-Tag: 3.0.dev0~332^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07ea5f537fb850a39d358aa30238637a50a164cd;p=thirdparty%2Fpsycopg.git Added C bool dumpers (text, binary) --- diff --git a/psycopg3/psycopg3/types/singletons.py b/psycopg3/psycopg3/types/singletons.py index f6de7e09d..0c6e04e95 100644 --- a/psycopg3/psycopg3/types/singletons.py +++ b/psycopg3/psycopg3/types/singletons.py @@ -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" diff --git a/psycopg3_c/psycopg3_c/_psycopg3.pyx b/psycopg3_c/psycopg3_c/_psycopg3.pyx index 6746187ac..bf5ae1760 100644 --- a/psycopg3_c/psycopg3_c/_psycopg3.pyx +++ b/psycopg3_c/psycopg3_c/_psycopg3.pyx @@ -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" diff --git a/psycopg3_c/psycopg3_c/adapt.pyx b/psycopg3_c/psycopg3_c/adapt.pyx index fd1a336e3..22a19b639 100644 --- a/psycopg3_c/psycopg3_c/adapt.pyx +++ b/psycopg3_c/psycopg3_c/adapt.pyx @@ -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() diff --git a/psycopg3_c/psycopg3_c/types/numeric.pyx b/psycopg3_c/psycopg3_c/types/numeric.pyx index 17e362bee..f24a879ed 100644 --- a/psycopg3_c/psycopg3_c/types/numeric.pyx +++ b/psycopg3_c/psycopg3_c/types/numeric.pyx @@ -96,17 +96,6 @@ cdef class Float8BinaryLoader(CLoader): return PyFloat_FromDouble((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 index 000000000..5d1b8033d --- /dev/null +++ b/psycopg3_c/psycopg3_c/types/singletons.pyx @@ -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)