]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Added c bytea loaders
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 10 May 2020 15:44:41 +0000 (03:44 +1200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 10 May 2020 15:44:41 +0000 (03:44 +1200)
psycopg3/adapt.pyx
psycopg3/types/text.py
psycopg3/types/text.pyx

index 02cb4e1a5697bae11e897d9cf51cdf0adb5651a8..c712553474607b396cf404c9e723c1abb92d954e 100644 (file)
@@ -74,5 +74,8 @@ cdef void register_text_c_loaders():
     from psycopg3 import adapt
     from psycopg3.types import text
     register_c_loader(text.StringLoader.load, load_text, get_context_text)
+    register_c_loader(text.NameLoader.load, load_text, get_context_text)
+    register_c_loader(text.load_bytea_text, load_bytea_text)
+    register_c_loader(text.load_bytea_binary, load_bytea_binary)
     register_c_loader(adapt.UnknownLoader.load, load_unknown_text)
     register_c_loader(adapt.load_unknown_binary, load_unknown_binary)
index 56d0cf10c505c37d54575cec8b7b472eb0dbbacb..f36ae9e750ba01598fdaaf33ccd52b705fd316ee 100644 (file)
@@ -98,7 +98,7 @@ def dump_bytes(b: bytes) -> Tuple[bytes, int]:
 
 
 @Loader.text(builtins["bytea"].oid)
-def load_bytea(data: bytes) -> bytes:
+def load_bytea_text(data: bytes) -> bytes:
     return Escaping().unescape_bytea(data)
 
 
index b143d4e4eb5da5268b5d0334c9004f7218623913..dc9b77c98c82a9f6ac22bcfd614fd629ab4e376e 100644 (file)
@@ -1,5 +1,6 @@
 from cpython.bytes cimport PyBytes_FromStringAndSize
 from cpython.unicode cimport PyUnicode_DecodeUTF8
+from psycopg3.pq cimport libpq
 
 
 cdef object load_text(const char *data, size_t length, void *context):
@@ -20,6 +21,24 @@ cdef void *get_context_text(object loader):
         return NULL
 
 
+cdef object load_bytea_text(const char *data, size_t length, void *context):
+    cdef size_t len_out
+    cdef unsigned char *out = libpq.PQunescapeBytea(
+        <const unsigned char *>data, &len_out)
+    if out is NULL:
+        raise MemoryError(
+            f"couldn't allocate for unescape_bytea of {len(data)} bytes"
+        )
+
+    rv = out[:len_out]
+    libpq.PQfreemem(out)
+    return rv
+
+
+cdef object load_bytea_binary(const char *data, size_t length, void *context):
+    return data[:length]
+
+
 cdef object load_unknown_text(const char *data, size_t length, void *context):
     # TODO: codec
     return PyUnicode_DecodeUTF8(data, length, NULL)