]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
perf(c): use PyObject_CallFunctionObjArgs in UUIDBinaryLoader
authorhenadzit <henadzi.tsaryk@gmail.com>
Fri, 7 Feb 2025 18:43:49 +0000 (19:43 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 20 Feb 2025 10:15:41 +0000 (11:15 +0100)
psycopg_c/psycopg_c/types/uuid.pyx

index 8bac18f86b07a7f9fa02739da71523de11ef8534..e9be3b680a5f6ed15fae0d82cfc44de0624148e8 100644 (file)
@@ -114,14 +114,25 @@ cdef class UUIDLoader(CLoader):
 cdef class UUIDBinaryLoader(CLoader):
     format = PQ_BINARY
 
+    cdef PyObject *_uuid_type
+    cdef object _uuid_new
+    cdef object _obj_setattr
+    cdef PyObject *_safeuuid_unknown
+
     def __cinit__(self, oid: int, context: AdaptContext | None = None):
         global uuid
         # uuid is slow to import, lazy load it
         if uuid is None:
             import uuid
 
+        self._uuid_type = <PyObject *>uuid.UUID
+        self._uuid_new = uuid.UUID.__new__
+        self._obj_setattr = object.__setattr__
+        self._safeuuid_unknown = <PyObject *>uuid.SafeUUID.unknown
+
     cdef object cload(self, const char *data, size_t length):
-        u = uuid.UUID.__new__(uuid.UUID)
-        object.__setattr__(u, 'is_safe', uuid.SafeUUID.unknown)
-        object.__setattr__(u, 'int', int.from_bytes(data[:length], 'big'))
+        cdef object int_value = int.from_bytes(data[:length], 'big')
+        cdef object u = PyObject_CallFunctionObjArgs(self._uuid_new, self._uuid_type, NULL)
+        PyObject_CallFunctionObjArgs(self._obj_setattr, <PyObject *>u, <PyObject *>"is_safe", self._safeuuid_unknown, NULL)
+        PyObject_CallFunctionObjArgs(self._obj_setattr, <PyObject *>u, <PyObject *>"int", <PyObject *>int_value, NULL)
         return u