dump_list(item)
elif item is not None:
ad = self._dump_item(item)
- if needs_quotes(ad):
- if not isinstance(ad, bytes):
- ad = bytes(ad)
- ad = b'"' + self._re_esc.sub(rb"\\\1", ad) + b'"'
- tokens.append(ad)
+ if ad is None:
+ tokens.append(b"NULL")
+ else:
+ if needs_quotes(ad):
+ if not isinstance(ad, bytes):
+ ad = bytes(ad)
+ ad = b'"' + self._re_esc.sub(rb"\\\1", ad) + b'"'
+ tokens.append(ad)
else:
tokens.append(b"NULL")
return b"".join(tokens)
- def _dump_item(self, item: Any) -> Buffer:
+ def _dump_item(self, item: Any) -> Optional[Buffer]:
if self.sub_dumper:
return self.sub_dumper.dump(item)
else:
for item in L:
if item is not None:
# If we get here, the sub_dumper must have been set
- ad = self.sub_dumper.dump(item) # type: ignore[union-attr]
- data.append(pack_len(len(ad)))
- data.append(ad)
+ item = self.sub_dumper.dump(item) # type: ignore[union-attr]
+ if item is not None:
+ data.append(pack_len(len(item)))
+ data.append(item)
else:
hasnull = 1
data.append(b"\xff\xff\xff\xff")
# Copyright (C) 2020 The Psycopg Team
import re
-from typing import Any, Callable, Dict, Generic, List, Optional, Type, Tuple
+from typing import Any, Dict, Generic, List, Optional, Type, Tuple
from typing import cast, TYPE_CHECKING
from decimal import Decimal
from datetime import date, datetime
from .. import errors as e
from .. import postgres
from ..pq import Format
-from ..abc import AdaptContext, Buffer, Dumper, DumperKey, Query
+from ..abc import AdaptContext, Buffer, Dumper, DumperKey, DumpFunc, LoadFunc, Query
from ..adapt import RecursiveDumper, RecursiveLoader, PyFormat
from .._oids import INVALID_OID, TEXT_OID
from .._compat import cache, TypeVar
return dump_range_text(obj, dump)
-def dump_range_text(obj: Range[Any], dump: Callable[[Any], Buffer]) -> Buffer:
+def dump_range_text(obj: Range[Any], dump: DumpFunc) -> Buffer:
if obj.isempty:
return b"empty"
return dump_range_binary(obj, dump)
-def dump_range_binary(obj: Range[Any], dump: Callable[[Any], Buffer]) -> Buffer:
+def dump_range_binary(obj: Range[Any], dump: DumpFunc) -> Buffer:
if not obj:
return _EMPTY_HEAD
if obj.lower is not None:
data = dump(obj.lower)
- out += pack_len(len(data))
- out += data
+ if data is not None:
+ out += pack_len(len(data))
+ out += data
+ else:
+ head |= RANGE_LB_INF
else:
head |= RANGE_LB_INF
if obj.upper is not None:
data = dump(obj.upper)
- out += pack_len(len(data))
- out += data
+ if data is not None:
+ out += pack_len(len(data))
+ out += data
+ else:
+ head |= RANGE_UB_INF
else:
head |= RANGE_UB_INF
return load_range_text(data, self._load)[0]
-def load_range_text(
- data: Buffer, load: Callable[[Buffer], Any]
-) -> Tuple[Range[Any], int]:
+def load_range_text(data: Buffer, load: LoadFunc) -> Tuple[Range[Any], int]:
if data == b"empty":
return Range(empty=True), 5
return load_range_binary(data, self._load)
-def load_range_binary(data: Buffer, load: Callable[[Buffer], Any]) -> Range[Any]:
+def load_range_binary(data: Buffer, load: LoadFunc) -> Range[Any]:
head = data[0]
if head & RANGE_EMPTY:
return Range(empty=True)