import codecs
import struct
from typing import TYPE_CHECKING, AsyncGenerator, Generator
-from typing import Any, Dict, Match, Optional, Sequence, Type, Union
+from typing import Any, Dict, List, Match, Optional, Sequence, Type, Union
from types import TracebackType
from . import pq
raise TypeError(f"can't write {type(data).__name__}")
def format_row(self, row: Sequence[Any]) -> bytes:
- # TODO: cache this, or pass just a single format
- formats = [self.format] * len(row)
- out = self._transformer.dump_sequence(row, formats)
+ out: List[Optional[bytes]] = []
+ for item in row:
+ if item is not None:
+ dumper = self._transformer.get_dumper(item, self.format)
+ out.append(dumper.dump(item))
+ else:
+ out.append(None)
return self._format_row(out)
- def _format_row_text(self, row: Sequence[Optional[bytes]],) -> bytes:
+ def _format_row_text(self, row: Sequence[Optional[bytes]]) -> bytes:
return (
b"\t".join(
_bsrepl_re.sub(_bsrepl_sub, item)
# Copyright (C) 2020 The Psycopg Team
import codecs
-from typing import Any, Callable, Dict, Generator, Iterable, List, Mapping
+from typing import Any, Callable, Dict, Generator, Mapping
from typing import Optional, Sequence, Tuple, Type, TypeVar, Union
from typing import TYPE_CHECKING
from typing_extensions import Protocol
def set_row_types(self, types: Sequence[Tuple[int, Format]]) -> None:
...
- def dump_sequence(
- self, objs: Iterable[Any], formats: Iterable[Format]
- ) -> List[Optional[bytes]]:
- ...
-
- def types_sequence(self) -> List[int]:
- ...
-
def get_dumper(self, obj: Any, format: Format) -> "Dumper":
...
for oid, fmt in types:
rc.append(self.get_load_function(oid, fmt))
- # TODO: drop?
- def dump_sequence(
- self, objs: Iterable[Any], formats: Iterable[Format]
- ) -> List[Optional[bytes]]:
- out: List[Optional[bytes]] = []
- oids = self._oids = []
-
- for var, fmt in zip(objs, formats):
- if var is not None:
- dumper = self.get_dumper(var, fmt)
- out.append(dumper.dump(var))
- oids.append(dumper.oid)
- else:
- out.append(None)
- oids.append(TEXT_OID)
-
- return out
-
- # TODO: drop?
- def types_sequence(self) -> List[int]:
- return self._oids
-
def get_dumper(self, obj: Any, format: Format) -> "Dumper":
key = (type(obj), format)
try:
if TYPE_CHECKING:
from ..proto import Transformer
+TEXT_OID = 25 # TODO: builtins["text"].oid
+
class QueryPart(NamedTuple):
pre: bytes
params = _validate_and_reorder_params(
self._parts, vars, self._order
)
- self.params = self._tx.dump_sequence(params, self.formats or ())
+ self.params = []
+ assert self.formats is not None
+
if self.types is None:
- self.types = self._tx.types_sequence()
+ self.types = []
+ for i in range(len(params)):
+ param = params[i]
+ if param is not None:
+ dumper = self._tx.get_dumper(param, self.formats[i])
+ self.params.append(dumper.dump(param))
+ self.types.append(dumper.oid)
+ else:
+ self.params.append(None)
+ self.types.append(TEXT_OID)
+ else:
+ for i in range(len(params)):
+ param = params[i]
+ if param is not None:
+ dumper = self._tx.get_dumper(param, self.formats[i])
+ self.params.append(dumper.dump(param))
+ else:
+ self.params.append(None)
else:
self.params = self.types = None
def set_row_types(
self, types: Sequence[Tuple[int, pq.Format]]
) -> None: ...
- def dump_sequence(
- self, objs: Iterable[Any], formats: Iterable[pq.Format]
- ) -> List[Optional[bytes]]: ...
- def types_sequence(self) -> List[int]: ...
def get_dumper(self, obj: Any, format: pq.Format) -> "Dumper": ...
def lookup_dumper(self, src: type, format: pq.Format) -> DumperType: ...
def load_row(self, row: int) -> Optional[Tuple[Any, ...]]: ...
loader.context = cloader.get_context(pyloader.__self__)
loader.own_context = 1
- def dump_sequence(
- self, objs: Iterable[Any], formats: Iterable[Format]
- ) -> List[Optional[bytes]]:
- out: List[Optional[bytes]] = []
- oids = self._oids = []
-
- for var, fmt in zip(objs, formats):
- if var is not None:
- dumper = self.get_dumper(var, fmt)
- out.append(dumper.dump(var))
- oids.append(dumper.oid)
- else:
- out.append(None)
- oids.append(TEXT_OID)
-
- return out
-
- def types_sequence(self) -> List[int]:
- return self._oids
-
def get_dumper(self, obj: Any, format: Format) -> "Dumper":
key = (type(obj), format)
try: