LoaderCache: TypeAlias = Dict[int, "Loader"]
TEXT = pq.Format.TEXT
+PY_TEXT = PyFormat.TEXT
class Transformer(AdaptContext):
out[i] = self._row_dumpers[i].dump(param)
return out
- types = [INVALID_OID] * nparams
+ types = [self._get_none_oid()] * nparams
pqformats = [TEXT] * nparams
for i in range(nparams):
return out
def as_literal(self, obj: Any) -> Buffer:
- dumper = self.get_dumper(obj, PyFormat.TEXT)
+ dumper = self.get_dumper(obj, PY_TEXT)
rv = dumper.quote(obj)
# If the result is quoted, and the oid not unknown or text,
# add an explicit type cast.
dumper = cache[key1] = dumper.upgrade(obj, format)
return dumper
+ def _get_none_oid(self):
+ try:
+ return self._none_oid
+ except AttributeError:
+ pass
+
+ try:
+ rv = self._none_oid = self._adapters.get_dumper(NoneType, PY_TEXT).oid
+ except KeyError:
+ raise e.InterfaceError("None dumper not found")
+
+ return rv
+
def get_dumper_by_oid(self, oid: int, format: pq.Format) -> "Dumper":
"""
Return a Dumper to dump an object to the type with given oid.
cdef readonly object types
cdef readonly object formats
cdef str _encoding
+ cdef int _none_oid
# mapping class -> Dumper instance (auto, text, binary)
cdef dict _auto_dumpers
self.connection = None
self.types = self.formats = None
+ self._none_oid = -1
@classmethod
def from_context(cls, context: Optional["AdaptContext"]):
cdef object dumped
cdef Py_ssize_t size
+ if self._none_oid < 0:
+ self._none_oid = self.adapters.get_dumper(NoneType, "s").oid
+
dumpers = self._row_dumpers
if dumpers:
fmt = (<RowDumper>dumper_ptr).format
else:
dumped = None
- oid = oids.INVALID_OID
+ oid = self._none_oid
fmt = PQ_TEXT
Py_INCREF(dumped)