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"
@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"
# Copyright (C) 2020 The Psycopg Team
include "types/numeric.pyx"
+include "types/singletons.pyx"
include "types/text.pyx"
include "generators.pyx"
include "adapt.pyx"
"""
logger.debug("registering optimised c adapters")
register_numeric_c_adapters()
+ register_singletons_c_adapters()
register_text_c_adapters()
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")
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)
OidBinaryLoader.register_binary(builtins["oid"].oid)
Float4BinaryLoader.register_binary(builtins["float4"].oid)
Float8BinaryLoader.register_binary(builtins["float8"].oid)
- BoolBinaryLoader.register_binary(builtins["bool"].oid)
--- /dev/null
+"""
+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)