]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Add c datetime text dumpers
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 2 Jun 2021 00:49:23 +0000 (01:49 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 2 Jun 2021 01:06:03 +0000 (02:06 +0100)
psycopg3_c/psycopg3_c/types/date.pyx

index 0e3e6fd1467d411ab55fc6d66a86c82e9bd39fdb..bb539d46be7c964efc82559b415aa0d9fb89cc35 100644 (file)
@@ -174,6 +174,59 @@ cdef class TimeTzBinaryDumper(_BaseTimeDumper):
         return sizeof(int64_t) + sizeof(int32_t)
 
 
+cdef class _BaseDateTimeDumper(CDumper):
+
+    cpdef get_key(self, obj, format):
+        # Use (cls,) to report the need to upgrade (downgrade, actually) to a
+        # dumper for naive timestamp.
+        if obj.tzinfo:
+            return self.cls
+        else:
+            return (self.cls,)
+
+    cpdef upgrade(self, obj: time, format):
+        raise NotImplementedError
+
+
+cdef class _BaseDateTimeTextDumper(_BaseDateTimeDumper):
+
+    format = PQ_TEXT
+
+    cdef Py_ssize_t cdump(self, obj, bytearray rv, Py_ssize_t offset) except -1:
+        cdef Py_ssize_t size;
+        cdef const char *src
+
+        # NOTE: whatever the PostgreSQL DateStyle input format (DMY, MDY, YMD)
+        # the YYYY-MM-DD is always understood correctly.
+        cdef str s = str(obj)
+        src = PyUnicode_AsUTF8AndSize(s, &size)
+
+        cdef char *buf = CDumper.ensure_size(rv, offset, size)
+        memcpy(buf, src, size)
+        return size
+
+
+@cython.final
+cdef class DateTimeTzDumper(_BaseDateTimeTextDumper):
+
+    def __cinit__(self):
+        self.oid = oids.TIMESTAMPTZ_OID
+
+    cpdef upgrade(self, obj, format):
+        if obj.tzinfo:
+            return self
+        else:
+            return DateTimeDumper(self.cls)
+
+
+@cython.final
+cdef class DateTimeDumper(_BaseDateTimeTextDumper):
+
+    def __cinit__(self):
+        self.oid = oids.TIMESTAMP_OID
+
+
+
 @cython.final
 cdef class DateLoader(CLoader):