]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
refactor(psycopg_c): define and use an ARRAYSIZE macro
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 13 Aug 2022 01:44:17 +0000 (03:44 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Mon, 15 Aug 2022 13:41:04 +0000 (15:41 +0200)
psycopg_c/psycopg_c/_psycopg.pyx
psycopg_c/psycopg_c/types/datetime.pyx

index b3781f6a234ff8e3a93eca7adfb9cee880c2d436..6c325e7a3d73cb9de94dab62e4d6675b36e79be0 100644 (file)
@@ -22,6 +22,15 @@ PG_TEXT = _py_Format.TEXT
 PG_BINARY = _py_Format.BINARY
 
 
+cdef extern from *:
+    """
+#ifndef ARRAYSIZE
+#define ARRAYSIZE(a) ((sizeof(a) / sizeof(*(a))))
+#endif
+    """
+    int ARRAYSIZE(void *array)
+
+
 include "_psycopg/adapt.pyx"
 include "_psycopg/copy.pyx"
 include "_psycopg/generators.pyx"
index f1cd9c6a3d1950359279df9f0e1611aeec5538da..720a852c48affd6d71eeec9cbf39245f6d6b2c7f 100644 (file)
@@ -386,7 +386,7 @@ cdef class DateLoader(CLoader):
 
         cdef const char *ptr
         cdef const char *end = data + length
-        ptr = _parse_date_values(data, end, vals, sizeof(vals) // sizeof(vals[0]))
+        ptr = _parse_date_values(data, end, vals, ARRAYSIZE(vals))
         if ptr == NULL:
             s = bytes(data).decode("utf8", "replace")
             raise e.DataError(f"can't parse date {s!r}")
@@ -433,7 +433,7 @@ cdef class TimeLoader(CLoader):
         cdef const char *end = data + length
 
         # Parse the first 3 groups of digits
-        ptr = _parse_date_values(data, end, vals, sizeof(vals) // sizeof(vals[0]))
+        ptr = _parse_date_values(data, end, vals, ARRAYSIZE(vals))
         if ptr == NULL:
             s = bytes(data).decode("utf8", "replace")
             raise e.DataError(f"can't parse time {s!r}")
@@ -490,7 +490,7 @@ cdef class TimetzLoader(CLoader):
         cdef const char *end = data + length
 
         # Parse the first 3 groups of digits (time)
-        ptr = _parse_date_values(data, end, vals, 3)
+        ptr = _parse_date_values(data, end, vals, ARRAYSIZE(vals))
         if ptr == NULL:
             s = bytes(data).decode("utf8", "replace")
             raise e.DataError(f"can't parse timetz {s!r}")
@@ -577,7 +577,7 @@ cdef class TimestampLoader(CLoader):
         cdef const char *ptr
 
         # Parse the first 6 groups of digits (date and time)
-        ptr = _parse_date_values(data, end, vals, sizeof(vals) // sizeof(vals[0]))
+        ptr = _parse_date_values(data, end, vals, ARRAYSIZE(vals))
         if ptr == NULL:
             raise _get_timestamp_load_error(self._pgconn, data) from None
 
@@ -719,7 +719,7 @@ cdef class TimestamptzLoader(_BaseTimestamptzLoader):
 
         # Parse the first 6 groups of digits (date and time)
         cdef const char *ptr
-        ptr = _parse_date_values(data, end, vals, sizeof(vals) // sizeof(vals[0]))
+        ptr = _parse_date_values(data, end, vals, ARRAYSIZE(vals))
         if ptr == NULL:
             raise _get_timestamp_load_error(self._pgconn, data) from None
 
@@ -905,7 +905,7 @@ cdef class IntervalLoader(CLoader):
         cdef int vals[3]
         memset(vals, 0, sizeof(vals))
         if ptr != NULL:
-            ptr = _parse_date_values(ptr, end, vals, sizeof(vals) // sizeof(vals[0]))
+            ptr = _parse_date_values(ptr, end, vals, ARRAYSIZE(vals))
             if ptr == NULL:
                 s = bytes(data).decode("utf8", "replace")
                 raise e.DataError(f"can't parse interval {s!r}")
@@ -1043,7 +1043,7 @@ cdef int _parse_timezone_to_seconds(const char **bufptr, const char *end):
     cdef int vals[3]
     memset(vals, 0, sizeof(vals))
 
-    ptr = _parse_date_values(ptr + 1, end, vals, sizeof(vals) // sizeof(vals[0]))
+    ptr = _parse_date_values(ptr + 1, end, vals, ARRAYSIZE(vals))
     if ptr == NULL:
         return 0