]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Add c binary time loader
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 2 Jun 2021 02:44:48 +0000 (03:44 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 2 Jun 2021 02:44:48 +0000 (03:44 +0100)
psycopg3_c/psycopg3_c/types/date.pyx

index 6a9360de2f8421bd515ebabc1d218a67bc85b2af..f6dbb71a153c94f1bf93aad84d70f9b15cc63731 100644 (file)
@@ -458,6 +458,33 @@ cdef class TimeLoader(CLoader):
             raise e.DataError(f"can't parse date {s!r}: {ex}") from None
 
 
+@cython.final
+cdef class TimeBinaryLoader(CLoader):
+
+    format = PQ_BINARY
+
+    cdef object cload(self, const char *data, size_t length):
+        cdef int64_t val = endian.be64toh((<uint64_t *>data)[0])
+        cdef int h, m, s, ms
+
+        with cython.cdivision(True):
+            ms = val % 1_000_000
+            val //= 1_000_000
+
+            s = val % 60
+            val //= 60
+
+            m = val % 60
+            h = val // 60
+
+        try:
+            return cdt.time_new(h, m, s, ms, None)
+        except ValueError:
+            raise e.DataError(
+                f"time not supported by Python: hour={h}"
+            ) from None
+
+
 cdef const char *_get_datestyle(pq.PGconn pgconn):
     cdef const char *ds
     if pgconn is not None: