from . import _transform
Transformer = _transform.Transformer
+
+
+class RecursiveDumper(Dumper):
+ """Dumper with a transformer to help dumping recursive types."""
+
+ def __init__(self, cls: type, context: Optional[AdaptContext] = None):
+ super().__init__(cls, context)
+ self._tx = Transformer(context)
+
+
+class RecursiveLoader(Loader):
+ """Loader with a transformer to help loading recursive types."""
+
+ def __init__(self, oid: int, context: Optional[AdaptContext] = None):
+ super().__init__(oid, context)
+ self._tx = Transformer(context)
from .. import pq
from .. import errors as e
from ..oids import postgres_types, TEXT_OID, TEXT_ARRAY_OID, INVALID_OID
-from ..adapt import Buffer, Dumper, Loader, Transformer
+from ..adapt import Dumper, RecursiveDumper, RecursiveLoader
from ..adapt import Format as Pg3Format
-from ..proto import AdaptContext
+from ..proto import AdaptContext, Buffer
from .._struct import pack_len, unpack_len
from .._typeinfo import TypeInfo
)
-class BaseListDumper(Dumper):
+class BaseListDumper(RecursiveDumper):
def __init__(self, cls: type, context: Optional[AdaptContext] = None):
super().__init__(cls, context)
- self._tx = Transformer(context)
self.sub_dumper: Optional[Dumper] = None
self._types = context.adapters.types if context else postgres_types
return b"".join(data)
-class BaseArrayLoader(Loader):
+class BaseArrayLoader(RecursiveLoader):
base_oid: int
- def __init__(self, oid: int, context: Optional[AdaptContext] = None):
- super().__init__(oid, context)
- self._tx = Transformer(context)
-
class ArrayLoader(BaseArrayLoader):
from .. import pq
from ..oids import TEXT_OID
-from ..adapt import Buffer, Format, Dumper, Loader, Transformer
-from ..proto import AdaptContext
+from ..adapt import Format, RecursiveDumper, RecursiveLoader
+from ..proto import AdaptContext, Buffer
from .._struct import unpack_len
from .._typeinfo import CompositeInfo
)
-class SequenceDumper(Dumper):
+class SequenceDumper(RecursiveDumper):
format = pq.Format.TEXT
- def __init__(self, cls: type, context: Optional[AdaptContext] = None):
- super().__init__(cls, context)
- self._tx = Transformer(context)
-
def _dump_sequence(
self, obj: Sequence[Any], start: bytes, end: bytes, sep: bytes
) -> bytes:
return self._dump_sequence(obj, b"(", b")", b",")
-class BaseCompositeLoader(Loader):
+class BaseCompositeLoader(RecursiveLoader):
format = pq.Format.TEXT
- def __init__(self, oid: int, context: Optional[AdaptContext] = None):
- super().__init__(oid, context)
- self._tx = Transformer(context)
-
def _parse_record(self, data: bytes) -> Iterator[Optional[bytes]]:
"""
Split a non-empty representation of a composite type into components.
)
-class RecordBinaryLoader(Loader):
+class RecordBinaryLoader(RecursiveLoader):
format = pq.Format.BINARY
_types_set = False
- def __init__(self, oid: int, context: Optional[AdaptContext] = None):
- super().__init__(oid, context)
- self._tx = Transformer(context)
-
def load(self, data: Buffer) -> Tuple[Any, ...]:
if not self._types_set:
self._config_types(data)
from ..pq import Format
from ..oids import postgres_types as builtins, INVALID_OID
-from ..adapt import Buffer, Dumper, Loader, Format as Pg3Format, Transformer
-from ..proto import AdaptContext
+from ..adapt import Dumper, RecursiveLoader, Format as Pg3Format
+from ..proto import AdaptContext, Buffer
from .._struct import unpack_len
from .._typeinfo import RangeInfo
return Range(min, max, bounds)
-class RangeBinaryLoader(Loader, Generic[T]):
+class RangeBinaryLoader(RecursiveLoader, Generic[T]):
format = Format.BINARY
subtype_oid: int
- def __init__(self, oid: int, context: Optional[AdaptContext] = None):
- super().__init__(oid, context)
- self._tx = Transformer(context)
-
def load(self, data: Buffer) -> Range[T]:
head = data[0]
if head & RANGE_EMPTY: