From: Daniele Varrazzo Date: Fri, 6 Jan 2023 14:36:45 +0000 (+0000) Subject: refactor: drop use of `postgres.types` to know OIDs at import time X-Git-Tag: pool-3.2.0~135^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4fbe3aecf6877d6edcfbedac5920e7fb19b904be;p=thirdparty%2Fpsycopg.git refactor: drop use of `postgres.types` to know OIDs at import time --- diff --git a/psycopg/psycopg/__init__.py b/psycopg/psycopg/__init__.py index baadf30c3..072edef52 100644 --- a/psycopg/psycopg/__init__.py +++ b/psycopg/psycopg/__init__.py @@ -46,6 +46,7 @@ paramstyle = "pyformat" # register default adapters for PostgreSQL adapters = postgres.adapters # exposed by the package +postgres.register_default_types(adapters.types) postgres.register_default_adapters(adapters) # After the default ones, because these can deal with the bytea oid better diff --git a/psycopg/psycopg/crdb/__init__.py b/psycopg/psycopg/crdb/__init__.py index 323903aba..11e1dc3b6 100644 --- a/psycopg/psycopg/crdb/__init__.py +++ b/psycopg/psycopg/crdb/__init__.py @@ -10,6 +10,7 @@ from .connection import CrdbConnection, AsyncCrdbConnection, CrdbConnectionInfo adapters = _types.adapters # exposed by the package connect = CrdbConnection.connect +_types.register_crdb_types(adapters.types) _types.register_crdb_adapters(adapters) __all__ = [ diff --git a/psycopg/psycopg/crdb/_types.py b/psycopg/psycopg/crdb/_types.py index ac04c96e8..1cbd7d040 100644 --- a/psycopg/psycopg/crdb/_types.py +++ b/psycopg/psycopg/crdb/_types.py @@ -118,46 +118,47 @@ def _register_crdb_none_adapters(context: AdaptContext) -> None: context.adapters.register_dumper(NoneType, CrdbNoneDumper) -for t in [ - TypeInfo("json", 3802, 3807, regtype="jsonb"), # Alias json -> jsonb. - TypeInfo("int8", 20, 1016, regtype="integer"), # Alias integer -> int8 - TypeInfo('"char"', 18, 1002), # special case, not generated - # autogenerated: start - # Generated from CockroachDB 22.2.1 - TypeInfo("bit", 1560, 1561), - TypeInfo("bool", 16, 1000, regtype="boolean"), - TypeInfo("bpchar", 1042, 1014, regtype="character"), - TypeInfo("bytea", 17, 1001), - TypeInfo("date", 1082, 1182), - TypeInfo("float4", 700, 1021, regtype="real"), - TypeInfo("float8", 701, 1022, regtype="double precision"), - TypeInfo("inet", 869, 1041), - TypeInfo("int2", 21, 1005, regtype="smallint"), - TypeInfo("int2vector", 22, 1006), - TypeInfo("int4", 23, 1007), - TypeInfo("int8", 20, 1016, regtype="bigint"), - TypeInfo("interval", 1186, 1187), - TypeInfo("jsonb", 3802, 3807), - TypeInfo("name", 19, 1003), - TypeInfo("numeric", 1700, 1231), - TypeInfo("oid", 26, 1028), - TypeInfo("oidvector", 30, 1013), - TypeInfo("record", 2249, 2287), - TypeInfo("regclass", 2205, 2210), - TypeInfo("regnamespace", 4089, 4090), - TypeInfo("regproc", 24, 1008), - TypeInfo("regprocedure", 2202, 2207), - TypeInfo("regrole", 4096, 4097), - TypeInfo("regtype", 2206, 2211), - TypeInfo("text", 25, 1009), - TypeInfo("time", 1083, 1183, regtype="time without time zone"), - TypeInfo("timestamp", 1114, 1115, regtype="timestamp without time zone"), - TypeInfo("timestamptz", 1184, 1185, regtype="timestamp with time zone"), - TypeInfo("timetz", 1266, 1270, regtype="time with time zone"), - TypeInfo("unknown", 705, 0), - TypeInfo("uuid", 2950, 2951), - TypeInfo("varbit", 1562, 1563, regtype="bit varying"), - TypeInfo("varchar", 1043, 1015, regtype="character varying"), - # autogenerated: end -]: - types.add(t) +def register_crdb_types(types: TypesRegistry) -> None: + for t in [ + TypeInfo("json", 3802, 3807, regtype="jsonb"), # Alias json -> jsonb. + TypeInfo("int8", 20, 1016, regtype="integer"), # Alias integer -> int8 + TypeInfo('"char"', 18, 1002), # special case, not generated + # autogenerated: start + # Generated from CockroachDB 22.2.1 + TypeInfo("bit", 1560, 1561), + TypeInfo("bool", 16, 1000, regtype="boolean"), + TypeInfo("bpchar", 1042, 1014, regtype="character"), + TypeInfo("bytea", 17, 1001), + TypeInfo("date", 1082, 1182), + TypeInfo("float4", 700, 1021, regtype="real"), + TypeInfo("float8", 701, 1022, regtype="double precision"), + TypeInfo("inet", 869, 1041), + TypeInfo("int2", 21, 1005, regtype="smallint"), + TypeInfo("int2vector", 22, 1006), + TypeInfo("int4", 23, 1007), + TypeInfo("int8", 20, 1016, regtype="bigint"), + TypeInfo("interval", 1186, 1187), + TypeInfo("jsonb", 3802, 3807), + TypeInfo("name", 19, 1003), + TypeInfo("numeric", 1700, 1231), + TypeInfo("oid", 26, 1028), + TypeInfo("oidvector", 30, 1013), + TypeInfo("record", 2249, 2287), + TypeInfo("regclass", 2205, 2210), + TypeInfo("regnamespace", 4089, 4090), + TypeInfo("regproc", 24, 1008), + TypeInfo("regprocedure", 2202, 2207), + TypeInfo("regrole", 4096, 4097), + TypeInfo("regtype", 2206, 2211), + TypeInfo("text", 25, 1009), + TypeInfo("time", 1083, 1183, regtype="time without time zone"), + TypeInfo("timestamp", 1114, 1115, regtype="timestamp without time zone"), + TypeInfo("timestamptz", 1184, 1185, regtype="timestamp with time zone"), + TypeInfo("timetz", 1266, 1270, regtype="time with time zone"), + TypeInfo("unknown", 705, 0), + TypeInfo("uuid", 2950, 2951), + TypeInfo("varbit", 1562, 1563, regtype="bit varying"), + TypeInfo("varchar", 1043, 1015, regtype="character varying"), + # autogenerated: end + ]: + types.add(t) diff --git a/psycopg/psycopg/dbapi20.py b/psycopg/psycopg/dbapi20.py index 3c3d8b72f..aab4c822f 100644 --- a/psycopg/psycopg/dbapi20.py +++ b/psycopg/psycopg/dbapi20.py @@ -9,15 +9,15 @@ import datetime as dt from math import floor from typing import Any, Sequence, Union -from . import postgres +from . import _oids from .abc import AdaptContext, Buffer from .types.string import BytesDumper, BytesBinaryDumper class DBAPITypeObject: - def __init__(self, name: str, type_names: Sequence[str]): + def __init__(self, name: str, oids: Sequence[int]): self.name = name - self.values = tuple(postgres.types[n].oid for n in type_names) + self.values = tuple(oids) def __repr__(self) -> str: return f"psycopg.{self.name}" @@ -35,13 +35,33 @@ class DBAPITypeObject: return NotImplemented -BINARY = DBAPITypeObject("BINARY", ("bytea",)) +BINARY = DBAPITypeObject("BINARY", (_oids.BYTEA_OID,)) DATETIME = DBAPITypeObject( - "DATETIME", "timestamp timestamptz date time timetz interval".split() + "DATETIME", + ( + _oids.TIMESTAMP_OID, + _oids.TIMESTAMPTZ_OID, + _oids.DATE_OID, + _oids.TIME_OID, + _oids.TIMETZ_OID, + _oids.INTERVAL_OID, + ), +) +NUMBER = DBAPITypeObject( + "NUMBER", + ( + _oids.INT2_OID, + _oids.INT4_OID, + _oids.INT8_OID, + _oids.FLOAT4_OID, + _oids.FLOAT8_OID, + _oids.NUMERIC_OID, + ), +) +ROWID = DBAPITypeObject("ROWID", (_oids.OID_OID,)) +STRING = DBAPITypeObject( + "STRING", (_oids.TEXT_OID, _oids.VARCHAR_OID, _oids.BPCHAR_OID) ) -NUMBER = DBAPITypeObject("NUMBER", "int2 int4 int8 float4 float8 numeric".split()) -ROWID = DBAPITypeObject("ROWID", ("oid",)) -STRING = DBAPITypeObject("STRING", "text varchar bpchar".split()) class Binary: diff --git a/psycopg/psycopg/postgres.py b/psycopg/psycopg/postgres.py index 53a8ccf59..10843a2d6 100644 --- a/psycopg/psycopg/postgres.py +++ b/psycopg/psycopg/postgres.py @@ -14,89 +14,92 @@ types = TypesRegistry() # Global adapter maps with PostgreSQL types configuration adapters = AdaptersMap(types=types) -# Use tools/update_oids.py to update this data. -for t in [ - TypeInfo('"char"', 18, 1002), - # autogenerated: start - # Generated from PostgreSQL 15.1 - TypeInfo("aclitem", 1033, 1034), - TypeInfo("bit", 1560, 1561), - TypeInfo("bool", 16, 1000, regtype="boolean"), - TypeInfo("box", 603, 1020, delimiter=";"), - TypeInfo("bpchar", 1042, 1014, regtype="character"), - TypeInfo("bytea", 17, 1001), - TypeInfo("cid", 29, 1012), - TypeInfo("cidr", 650, 651), - TypeInfo("circle", 718, 719), - TypeInfo("date", 1082, 1182), - TypeInfo("float4", 700, 1021, regtype="real"), - TypeInfo("float8", 701, 1022, regtype="double precision"), - TypeInfo("gtsvector", 3642, 3644), - TypeInfo("inet", 869, 1041), - TypeInfo("int2", 21, 1005, regtype="smallint"), - TypeInfo("int2vector", 22, 1006), - TypeInfo("int4", 23, 1007, regtype="integer"), - TypeInfo("int8", 20, 1016, regtype="bigint"), - TypeInfo("interval", 1186, 1187), - TypeInfo("json", 114, 199), - TypeInfo("jsonb", 3802, 3807), - TypeInfo("jsonpath", 4072, 4073), - TypeInfo("line", 628, 629), - TypeInfo("lseg", 601, 1018), - TypeInfo("macaddr", 829, 1040), - TypeInfo("macaddr8", 774, 775), - TypeInfo("money", 790, 791), - TypeInfo("name", 19, 1003), - TypeInfo("numeric", 1700, 1231), - TypeInfo("oid", 26, 1028), - TypeInfo("oidvector", 30, 1013), - TypeInfo("path", 602, 1019), - TypeInfo("pg_lsn", 3220, 3221), - TypeInfo("point", 600, 1017), - TypeInfo("polygon", 604, 1027), - TypeInfo("record", 2249, 2287), - TypeInfo("refcursor", 1790, 2201), - TypeInfo("regclass", 2205, 2210), - TypeInfo("regcollation", 4191, 4192), - TypeInfo("regconfig", 3734, 3735), - TypeInfo("regdictionary", 3769, 3770), - TypeInfo("regnamespace", 4089, 4090), - TypeInfo("regoper", 2203, 2208), - TypeInfo("regoperator", 2204, 2209), - TypeInfo("regproc", 24, 1008), - TypeInfo("regprocedure", 2202, 2207), - TypeInfo("regrole", 4096, 4097), - TypeInfo("regtype", 2206, 2211), - TypeInfo("text", 25, 1009), - TypeInfo("tid", 27, 1010), - TypeInfo("time", 1083, 1183, regtype="time without time zone"), - TypeInfo("timestamp", 1114, 1115, regtype="timestamp without time zone"), - TypeInfo("timestamptz", 1184, 1185, regtype="timestamp with time zone"), - TypeInfo("timetz", 1266, 1270, regtype="time with time zone"), - TypeInfo("tsquery", 3615, 3645), - TypeInfo("tsvector", 3614, 3643), - TypeInfo("txid_snapshot", 2970, 2949), - TypeInfo("uuid", 2950, 2951), - TypeInfo("varbit", 1562, 1563, regtype="bit varying"), - TypeInfo("varchar", 1043, 1015, regtype="character varying"), - TypeInfo("xid", 28, 1011), - TypeInfo("xid8", 5069, 271), - TypeInfo("xml", 142, 143), - RangeInfo("daterange", 3912, 3913, subtype_oid=1082), - RangeInfo("int4range", 3904, 3905, subtype_oid=23), - RangeInfo("int8range", 3926, 3927, subtype_oid=20), - RangeInfo("numrange", 3906, 3907, subtype_oid=1700), - RangeInfo("tsrange", 3908, 3909, subtype_oid=1114), - RangeInfo("tstzrange", 3910, 3911, subtype_oid=1184), - MultirangeInfo("datemultirange", 4535, 6155, range_oid=3912, subtype_oid=1082), - MultirangeInfo("int4multirange", 4451, 6150, range_oid=3904, subtype_oid=23), - MultirangeInfo("int8multirange", 4536, 6157, range_oid=3926, subtype_oid=20), - MultirangeInfo("nummultirange", 4532, 6151, range_oid=3906, subtype_oid=1700), - MultirangeInfo("tsmultirange", 4533, 6152, range_oid=3908, subtype_oid=1114), - MultirangeInfo("tstzmultirange", 4534, 6153, range_oid=3910, subtype_oid=1184), - # autogenerated: end -]: - types.add(t) + +def register_default_types(types: TypesRegistry) -> None: + + # Use tools/update_oids.py to update this data. + for t in [ + TypeInfo('"char"', 18, 1002), + # autogenerated: start + # Generated from PostgreSQL 15.1 + TypeInfo("aclitem", 1033, 1034), + TypeInfo("bit", 1560, 1561), + TypeInfo("bool", 16, 1000, regtype="boolean"), + TypeInfo("box", 603, 1020, delimiter=";"), + TypeInfo("bpchar", 1042, 1014, regtype="character"), + TypeInfo("bytea", 17, 1001), + TypeInfo("cid", 29, 1012), + TypeInfo("cidr", 650, 651), + TypeInfo("circle", 718, 719), + TypeInfo("date", 1082, 1182), + TypeInfo("float4", 700, 1021, regtype="real"), + TypeInfo("float8", 701, 1022, regtype="double precision"), + TypeInfo("gtsvector", 3642, 3644), + TypeInfo("inet", 869, 1041), + TypeInfo("int2", 21, 1005, regtype="smallint"), + TypeInfo("int2vector", 22, 1006), + TypeInfo("int4", 23, 1007, regtype="integer"), + TypeInfo("int8", 20, 1016, regtype="bigint"), + TypeInfo("interval", 1186, 1187), + TypeInfo("json", 114, 199), + TypeInfo("jsonb", 3802, 3807), + TypeInfo("jsonpath", 4072, 4073), + TypeInfo("line", 628, 629), + TypeInfo("lseg", 601, 1018), + TypeInfo("macaddr", 829, 1040), + TypeInfo("macaddr8", 774, 775), + TypeInfo("money", 790, 791), + TypeInfo("name", 19, 1003), + TypeInfo("numeric", 1700, 1231), + TypeInfo("oid", 26, 1028), + TypeInfo("oidvector", 30, 1013), + TypeInfo("path", 602, 1019), + TypeInfo("pg_lsn", 3220, 3221), + TypeInfo("point", 600, 1017), + TypeInfo("polygon", 604, 1027), + TypeInfo("record", 2249, 2287), + TypeInfo("refcursor", 1790, 2201), + TypeInfo("regclass", 2205, 2210), + TypeInfo("regcollation", 4191, 4192), + TypeInfo("regconfig", 3734, 3735), + TypeInfo("regdictionary", 3769, 3770), + TypeInfo("regnamespace", 4089, 4090), + TypeInfo("regoper", 2203, 2208), + TypeInfo("regoperator", 2204, 2209), + TypeInfo("regproc", 24, 1008), + TypeInfo("regprocedure", 2202, 2207), + TypeInfo("regrole", 4096, 4097), + TypeInfo("regtype", 2206, 2211), + TypeInfo("text", 25, 1009), + TypeInfo("tid", 27, 1010), + TypeInfo("time", 1083, 1183, regtype="time without time zone"), + TypeInfo("timestamp", 1114, 1115, regtype="timestamp without time zone"), + TypeInfo("timestamptz", 1184, 1185, regtype="timestamp with time zone"), + TypeInfo("timetz", 1266, 1270, regtype="time with time zone"), + TypeInfo("tsquery", 3615, 3645), + TypeInfo("tsvector", 3614, 3643), + TypeInfo("txid_snapshot", 2970, 2949), + TypeInfo("uuid", 2950, 2951), + TypeInfo("varbit", 1562, 1563, regtype="bit varying"), + TypeInfo("varchar", 1043, 1015, regtype="character varying"), + TypeInfo("xid", 28, 1011), + TypeInfo("xid8", 5069, 271), + TypeInfo("xml", 142, 143), + RangeInfo("daterange", 3912, 3913, subtype_oid=1082), + RangeInfo("int4range", 3904, 3905, subtype_oid=23), + RangeInfo("int8range", 3926, 3927, subtype_oid=20), + RangeInfo("numrange", 3906, 3907, subtype_oid=1700), + RangeInfo("tsrange", 3908, 3909, subtype_oid=1114), + RangeInfo("tstzrange", 3910, 3911, subtype_oid=1184), + MultirangeInfo("datemultirange", 4535, 6155, range_oid=3912, subtype_oid=1082), + MultirangeInfo("int4multirange", 4451, 6150, range_oid=3904, subtype_oid=23), + MultirangeInfo("int8multirange", 4536, 6157, range_oid=3926, subtype_oid=20), + MultirangeInfo("nummultirange", 4532, 6151, range_oid=3906, subtype_oid=1700), + MultirangeInfo("tsmultirange", 4533, 6152, range_oid=3908, subtype_oid=1114), + MultirangeInfo("tstzmultirange", 4534, 6153, range_oid=3910, subtype_oid=1184), + # autogenerated: end + ]: + types.add(t) def register_default_adapters(context: AdaptContext) -> None: diff --git a/psycopg/psycopg/types/array.py b/psycopg/psycopg/types/array.py index 3771841b8..93f9da389 100644 --- a/psycopg/psycopg/types/array.py +++ b/psycopg/psycopg/types/array.py @@ -13,7 +13,7 @@ from .. import errors as e from .. import postgres from ..abc import AdaptContext, Buffer, Dumper, DumperKey, NoneType, Loader, Transformer from ..adapt import RecursiveDumper, RecursiveLoader, PyFormat -from .._oids import TEXT_OID, INVALID_OID +from .._oids import TEXT_OID, INVALID_OID, TEXT_ARRAY_OID from .._compat import cache, prod from .._struct import pack_len, unpack_len from .._cmodule import _psycopg @@ -26,14 +26,12 @@ _struct_dim = struct.Struct("!II") # dim, lower bound _pack_dim = cast(Callable[[int, int], bytes], _struct_dim.pack) _unpack_dim = cast(Callable[[Buffer, int], Tuple[int, int]], _struct_dim.unpack_from) -TEXT_ARRAY_OID = postgres.types["text"].array_oid - PY_TEXT = PyFormat.TEXT PQ_BINARY = pq.Format.BINARY class BaseListDumper(RecursiveDumper): - element_oid = 0 + element_oid = INVALID_OID def __init__(self, cls: type, context: Optional[AdaptContext] = None): if cls is NoneType: diff --git a/psycopg/psycopg/types/bool.py b/psycopg/psycopg/types/bool.py index db7e18127..db34ce17c 100644 --- a/psycopg/psycopg/types/bool.py +++ b/psycopg/psycopg/types/bool.py @@ -4,7 +4,7 @@ Adapters for booleans. # Copyright (C) 2020 The Psycopg Team -from .. import postgres +from .. import _oids from ..pq import Format from ..abc import AdaptContext from ..adapt import Buffer, Dumper, Loader @@ -12,7 +12,7 @@ from ..adapt import Buffer, Dumper, Loader class BoolDumper(Dumper): - oid = postgres.types["bool"].oid + oid = _oids.BOOL_OID def dump(self, obj: bool) -> bytes: return b"t" if obj else b"f" @@ -24,7 +24,7 @@ class BoolDumper(Dumper): class BoolBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["bool"].oid + oid = _oids.BOOL_OID def dump(self, obj: bool) -> bytes: return b"\x01" if obj else b"\x00" diff --git a/psycopg/psycopg/types/composite.py b/psycopg/psycopg/types/composite.py index d75b1d413..9170aa279 100644 --- a/psycopg/psycopg/types/composite.py +++ b/psycopg/psycopg/types/composite.py @@ -61,7 +61,7 @@ class SequenceDumper(RecursiveDumper): class TupleDumper(SequenceDumper): # Should be this, but it doesn't work - # oid = postgres_types["record"].oid + # oid = _oids.RECORD_OID def dump(self, obj: Tuple[Any, ...]) -> bytes: return self._dump_sequence(obj, b"(", b")", b",") diff --git a/psycopg/psycopg/types/datetime.py b/psycopg/psycopg/types/datetime.py index f0dfe83eb..d4842cdcd 100644 --- a/psycopg/psycopg/types/datetime.py +++ b/psycopg/psycopg/types/datetime.py @@ -9,7 +9,7 @@ import struct from datetime import date, datetime, time, timedelta, timezone from typing import Any, Callable, cast, Optional, Tuple, TYPE_CHECKING -from .. import postgres +from .. import _oids from ..pq import Format from .._tz import get_tzinfo from ..abc import AdaptContext, DumperKey @@ -39,7 +39,7 @@ _py_date_min_days = date.min.toordinal() class DateDumper(Dumper): - oid = postgres.types["date"].oid + oid = _oids.DATE_OID def dump(self, obj: date) -> bytes: # NOTE: whatever the PostgreSQL DateStyle input format (DMY, MDY, YMD) @@ -50,7 +50,7 @@ class DateDumper(Dumper): class DateBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["date"].oid + oid = _oids.DATE_OID def dump(self, obj: date) -> bytes: days = obj.toordinal() - _pg_date_epoch_days @@ -77,7 +77,7 @@ class _BaseTimeTextDumper(_BaseTimeDumper): class TimeDumper(_BaseTimeTextDumper): - oid = postgres.types["time"].oid + oid = _oids.TIME_OID def upgrade(self, obj: time, format: PyFormat) -> Dumper: if not obj.tzinfo: @@ -88,13 +88,13 @@ class TimeDumper(_BaseTimeTextDumper): class TimeTzDumper(_BaseTimeTextDumper): - oid = postgres.types["timetz"].oid + oid = _oids.TIMETZ_OID class TimeBinaryDumper(_BaseTimeDumper): format = Format.BINARY - oid = postgres.types["time"].oid + oid = _oids.TIME_OID def dump(self, obj: time) -> bytes: us = obj.microsecond + 1_000_000 * ( @@ -112,7 +112,7 @@ class TimeBinaryDumper(_BaseTimeDumper): class TimeTzBinaryDumper(_BaseTimeDumper): format = Format.BINARY - oid = postgres.types["timetz"].oid + oid = _oids.TIMETZ_OID def dump(self, obj: time) -> bytes: us = obj.microsecond + 1_000_000 * ( @@ -145,7 +145,7 @@ class _BaseDatetimeTextDumper(_BaseDatetimeDumper): class DatetimeDumper(_BaseDatetimeTextDumper): - oid = postgres.types["timestamptz"].oid + oid = _oids.TIMESTAMPTZ_OID def upgrade(self, obj: datetime, format: PyFormat) -> Dumper: if obj.tzinfo: @@ -156,13 +156,13 @@ class DatetimeDumper(_BaseDatetimeTextDumper): class DatetimeNoTzDumper(_BaseDatetimeTextDumper): - oid = postgres.types["timestamp"].oid + oid = _oids.TIMESTAMP_OID class DatetimeBinaryDumper(_BaseDatetimeDumper): format = Format.BINARY - oid = postgres.types["timestamptz"].oid + oid = _oids.TIMESTAMPTZ_OID def dump(self, obj: datetime) -> bytes: delta = obj - _pg_datetimetz_epoch @@ -179,7 +179,7 @@ class DatetimeBinaryDumper(_BaseDatetimeDumper): class DatetimeNoTzBinaryDumper(_BaseDatetimeDumper): format = Format.BINARY - oid = postgres.types["timestamp"].oid + oid = _oids.TIMESTAMP_OID def dump(self, obj: datetime) -> bytes: delta = obj - _pg_datetime_epoch @@ -189,7 +189,7 @@ class DatetimeNoTzBinaryDumper(_BaseDatetimeDumper): class TimedeltaDumper(Dumper): - oid = postgres.types["interval"].oid + oid = _oids.INTERVAL_OID def __init__(self, cls: type, context: Optional[AdaptContext] = None): super().__init__(cls, context) @@ -218,7 +218,7 @@ class TimedeltaDumper(Dumper): class TimedeltaBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["interval"].oid + oid = _oids.INTERVAL_OID def dump(self, obj: timedelta) -> bytes: micros = 1_000_000 * obj.seconds + obj.microseconds diff --git a/psycopg/psycopg/types/json.py b/psycopg/psycopg/types/json.py index a80e0e4e3..fc4a6d6f3 100644 --- a/psycopg/psycopg/types/json.py +++ b/psycopg/psycopg/types/json.py @@ -8,8 +8,8 @@ import json from typing import Any, Callable, Dict, Optional, Tuple, Type, Union from .. import abc +from .. import _oids from .. import errors as e -from .. import postgres from ..pq import Format from ..adapt import Buffer, Dumper, Loader, PyFormat, AdaptersMap from ..errors import DataError @@ -134,24 +134,24 @@ class _JsonDumper(Dumper): class JsonDumper(_JsonDumper): - oid = postgres.types["json"].oid + oid = _oids.JSON_OID class JsonBinaryDumper(_JsonDumper): format = Format.BINARY - oid = postgres.types["json"].oid + oid = _oids.JSON_OID class JsonbDumper(_JsonDumper): - oid = postgres.types["jsonb"].oid + oid = _oids.JSONB_OID class JsonbBinaryDumper(_JsonDumper): format = Format.BINARY - oid = postgres.types["jsonb"].oid + oid = _oids.JSONB_OID def dump(self, obj: _JsonWrapper) -> bytes: dumps = obj.dumps or self.dumps diff --git a/psycopg/psycopg/types/multirange.py b/psycopg/psycopg/types/multirange.py index 44235494f..682402a20 100644 --- a/psycopg/psycopg/types/multirange.py +++ b/psycopg/psycopg/types/multirange.py @@ -9,6 +9,7 @@ from typing import Any, Generic, List, Iterable from typing import MutableSequence, Optional, Type, Union, overload from datetime import date, datetime +from .. import _oids from .. import errors as e from .. import postgres from ..pq import Format @@ -378,27 +379,27 @@ def register_multirange( class Int4MultirangeDumper(MultirangeDumper): - oid = postgres.types["int4multirange"].oid + oid = _oids.INT4MULTIRANGE_OID class Int8MultirangeDumper(MultirangeDumper): - oid = postgres.types["int8multirange"].oid + oid = _oids.INT8MULTIRANGE_OID class NumericMultirangeDumper(MultirangeDumper): - oid = postgres.types["nummultirange"].oid + oid = _oids.NUMMULTIRANGE_OID class DateMultirangeDumper(MultirangeDumper): - oid = postgres.types["datemultirange"].oid + oid = _oids.DATEMULTIRANGE_OID class TimestampMultirangeDumper(MultirangeDumper): - oid = postgres.types["tsmultirange"].oid + oid = _oids.TSMULTIRANGE_OID class TimestamptzMultirangeDumper(MultirangeDumper): - oid = postgres.types["tstzmultirange"].oid + oid = _oids.TSTZMULTIRANGE_OID # Binary dumpers for builtin multirange types wrappers @@ -407,81 +408,81 @@ class TimestamptzMultirangeDumper(MultirangeDumper): class Int4MultirangeBinaryDumper(MultirangeBinaryDumper): - oid = postgres.types["int4multirange"].oid + oid = _oids.INT4MULTIRANGE_OID class Int8MultirangeBinaryDumper(MultirangeBinaryDumper): - oid = postgres.types["int8multirange"].oid + oid = _oids.INT8MULTIRANGE_OID class NumericMultirangeBinaryDumper(MultirangeBinaryDumper): - oid = postgres.types["nummultirange"].oid + oid = _oids.NUMMULTIRANGE_OID class DateMultirangeBinaryDumper(MultirangeBinaryDumper): - oid = postgres.types["datemultirange"].oid + oid = _oids.DATEMULTIRANGE_OID class TimestampMultirangeBinaryDumper(MultirangeBinaryDumper): - oid = postgres.types["tsmultirange"].oid + oid = _oids.TSMULTIRANGE_OID class TimestamptzMultirangeBinaryDumper(MultirangeBinaryDumper): - oid = postgres.types["tstzmultirange"].oid + oid = _oids.TSTZMULTIRANGE_OID # Text loaders for builtin multirange types class Int4MultirangeLoader(MultirangeLoader[int]): - subtype_oid = postgres.types["int4"].oid + subtype_oid = _oids.INT4_OID class Int8MultirangeLoader(MultirangeLoader[int]): - subtype_oid = postgres.types["int8"].oid + subtype_oid = _oids.INT8_OID class NumericMultirangeLoader(MultirangeLoader[Decimal]): - subtype_oid = postgres.types["numeric"].oid + subtype_oid = _oids.NUMERIC_OID class DateMultirangeLoader(MultirangeLoader[date]): - subtype_oid = postgres.types["date"].oid + subtype_oid = _oids.DATE_OID class TimestampMultirangeLoader(MultirangeLoader[datetime]): - subtype_oid = postgres.types["timestamp"].oid + subtype_oid = _oids.TIMESTAMP_OID class TimestampTZMultirangeLoader(MultirangeLoader[datetime]): - subtype_oid = postgres.types["timestamptz"].oid + subtype_oid = _oids.TIMESTAMPTZ_OID # Binary loaders for builtin multirange types class Int4MultirangeBinaryLoader(MultirangeBinaryLoader[int]): - subtype_oid = postgres.types["int4"].oid + subtype_oid = _oids.INT4_OID class Int8MultirangeBinaryLoader(MultirangeBinaryLoader[int]): - subtype_oid = postgres.types["int8"].oid + subtype_oid = _oids.INT8_OID class NumericMultirangeBinaryLoader(MultirangeBinaryLoader[Decimal]): - subtype_oid = postgres.types["numeric"].oid + subtype_oid = _oids.NUMERIC_OID class DateMultirangeBinaryLoader(MultirangeBinaryLoader[date]): - subtype_oid = postgres.types["date"].oid + subtype_oid = _oids.DATE_OID class TimestampMultirangeBinaryLoader(MultirangeBinaryLoader[datetime]): - subtype_oid = postgres.types["timestamp"].oid + subtype_oid = _oids.TIMESTAMP_OID class TimestampTZMultirangeBinaryLoader(MultirangeBinaryLoader[datetime]): - subtype_oid = postgres.types["timestamptz"].oid + subtype_oid = _oids.TIMESTAMPTZ_OID def register_default_adapters(context: AdaptContext) -> None: diff --git a/psycopg/psycopg/types/net.py b/psycopg/psycopg/types/net.py index 2f2c05b1e..99a023e9b 100644 --- a/psycopg/psycopg/types/net.py +++ b/psycopg/psycopg/types/net.py @@ -7,7 +7,7 @@ Adapters for network types. from typing import Callable, Optional, Type, Union, TYPE_CHECKING from typing_extensions import TypeAlias -from .. import postgres +from .. import _oids from ..pq import Format from ..abc import AdaptContext from ..adapt import Buffer, Dumper, Loader @@ -51,7 +51,7 @@ class _LazyIpaddress: class InterfaceDumper(Dumper): - oid = postgres.types["inet"].oid + oid = _oids.INET_OID def dump(self, obj: Interface) -> bytes: return str(obj).encode() @@ -59,7 +59,7 @@ class InterfaceDumper(Dumper): class NetworkDumper(Dumper): - oid = postgres.types["cidr"].oid + oid = _oids.CIDR_OID def dump(self, obj: Network) -> bytes: return str(obj).encode() @@ -67,7 +67,7 @@ class NetworkDumper(Dumper): class _AIBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["inet"].oid + oid = _oids.INET_OID class AddressBinaryDumper(_AIBinaryDumper): @@ -111,7 +111,7 @@ class InetBinaryDumper(_AIBinaryDumper, _LazyIpaddress): class NetworkBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["cidr"].oid + oid = _oids.CIDR_OID def dump(self, obj: Network) -> bytes: packed = obj.network_address.packed diff --git a/psycopg/psycopg/types/numeric.py b/psycopg/psycopg/types/numeric.py index 1bd9329f5..ada6e942e 100644 --- a/psycopg/psycopg/types/numeric.py +++ b/psycopg/psycopg/types/numeric.py @@ -9,7 +9,7 @@ from math import log from typing import Any, Callable, DefaultDict, Dict, Tuple, Union, cast from decimal import Decimal, DefaultContext, Context -from .. import postgres +from .. import _oids from .. import errors as e from ..pq import Format from ..abc import AdaptContext @@ -66,7 +66,7 @@ class _SpecialValuesDumper(Dumper): class FloatDumper(_SpecialValuesDumper): - oid = postgres.types["float8"].oid + oid = _oids.FLOAT8_OID _special = { b"inf": b"'Infinity'::float8", @@ -76,13 +76,13 @@ class FloatDumper(_SpecialValuesDumper): class Float4Dumper(FloatDumper): - oid = postgres.types["float4"].oid + oid = _oids.FLOAT4_OID class FloatBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["float8"].oid + oid = _oids.FLOAT8_OID def dump(self, obj: float) -> bytes: return pack_float8(obj) @@ -90,7 +90,7 @@ class FloatBinaryDumper(Dumper): class Float4BinaryDumper(FloatBinaryDumper): - oid = postgres.types["float4"].oid + oid = _oids.FLOAT4_OID def dump(self, obj: float) -> bytes: return pack_float4(obj) @@ -98,7 +98,7 @@ class Float4BinaryDumper(FloatBinaryDumper): class DecimalDumper(_SpecialValuesDumper): - oid = postgres.types["numeric"].oid + oid = _oids.NUMERIC_OID def dump(self, obj: Decimal) -> bytes: if obj.is_nan(): @@ -115,23 +115,23 @@ class DecimalDumper(_SpecialValuesDumper): class Int2Dumper(_IntDumper): - oid = postgres.types["int2"].oid + oid = _oids.INT2_OID class Int4Dumper(_IntDumper): - oid = postgres.types["int4"].oid + oid = _oids.INT4_OID class Int8Dumper(_IntDumper): - oid = postgres.types["int8"].oid + oid = _oids.INT8_OID class IntNumericDumper(_IntDumper): - oid = postgres.types["numeric"].oid + oid = _oids.NUMERIC_OID class OidDumper(_IntDumper): - oid = postgres.types["oid"].oid + oid = _oids.OID_OID class IntDumper(Dumper): @@ -363,7 +363,7 @@ NUMERIC_NINF_BIN = _pack_numeric_head(0, 0, NUMERIC_NINF, 0) class DecimalBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["numeric"].oid + oid = _oids.NUMERIC_OID def dump(self, obj: Decimal) -> Buffer: return dump_decimal_to_numeric_binary(obj) @@ -380,7 +380,7 @@ class NumericDumper(DecimalDumper): class NumericBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["numeric"].oid + oid = _oids.NUMERIC_OID def dump(self, obj: Union[Decimal, int]) -> Buffer: if isinstance(obj, int): diff --git a/psycopg/psycopg/types/range.py b/psycopg/psycopg/types/range.py index 513f68a50..81ca38e38 100644 --- a/psycopg/psycopg/types/range.py +++ b/psycopg/psycopg/types/range.py @@ -10,6 +10,7 @@ from typing import cast from decimal import Decimal from datetime import date, datetime +from .. import _oids from .. import errors as e from .. import postgres from ..pq import Format @@ -564,27 +565,27 @@ def register_range(info: RangeInfo, context: Optional[AdaptContext] = None) -> N class Int4RangeDumper(RangeDumper): - oid = postgres.types["int4range"].oid + oid = _oids.INT4RANGE_OID class Int8RangeDumper(RangeDumper): - oid = postgres.types["int8range"].oid + oid = _oids.INT8RANGE_OID class NumericRangeDumper(RangeDumper): - oid = postgres.types["numrange"].oid + oid = _oids.NUMRANGE_OID class DateRangeDumper(RangeDumper): - oid = postgres.types["daterange"].oid + oid = _oids.DATERANGE_OID class TimestampRangeDumper(RangeDumper): - oid = postgres.types["tsrange"].oid + oid = _oids.TSRANGE_OID class TimestamptzRangeDumper(RangeDumper): - oid = postgres.types["tstzrange"].oid + oid = _oids.TSTZRANGE_OID # Binary dumpers for builtin range types wrappers @@ -593,81 +594,81 @@ class TimestamptzRangeDumper(RangeDumper): class Int4RangeBinaryDumper(RangeBinaryDumper): - oid = postgres.types["int4range"].oid + oid = _oids.INT4RANGE_OID class Int8RangeBinaryDumper(RangeBinaryDumper): - oid = postgres.types["int8range"].oid + oid = _oids.INT8RANGE_OID class NumericRangeBinaryDumper(RangeBinaryDumper): - oid = postgres.types["numrange"].oid + oid = _oids.NUMRANGE_OID class DateRangeBinaryDumper(RangeBinaryDumper): - oid = postgres.types["daterange"].oid + oid = _oids.DATERANGE_OID class TimestampRangeBinaryDumper(RangeBinaryDumper): - oid = postgres.types["tsrange"].oid + oid = _oids.TSRANGE_OID class TimestamptzRangeBinaryDumper(RangeBinaryDumper): - oid = postgres.types["tstzrange"].oid + oid = _oids.TSTZRANGE_OID # Text loaders for builtin range types class Int4RangeLoader(RangeLoader[int]): - subtype_oid = postgres.types["int4"].oid + subtype_oid = _oids.INT4_OID class Int8RangeLoader(RangeLoader[int]): - subtype_oid = postgres.types["int8"].oid + subtype_oid = _oids.INT8_OID class NumericRangeLoader(RangeLoader[Decimal]): - subtype_oid = postgres.types["numeric"].oid + subtype_oid = _oids.NUMERIC_OID class DateRangeLoader(RangeLoader[date]): - subtype_oid = postgres.types["date"].oid + subtype_oid = _oids.DATE_OID class TimestampRangeLoader(RangeLoader[datetime]): - subtype_oid = postgres.types["timestamp"].oid + subtype_oid = _oids.TIMESTAMP_OID class TimestampTZRangeLoader(RangeLoader[datetime]): - subtype_oid = postgres.types["timestamptz"].oid + subtype_oid = _oids.TIMESTAMPTZ_OID # Binary loaders for builtin range types class Int4RangeBinaryLoader(RangeBinaryLoader[int]): - subtype_oid = postgres.types["int4"].oid + subtype_oid = _oids.INT4_OID class Int8RangeBinaryLoader(RangeBinaryLoader[int]): - subtype_oid = postgres.types["int8"].oid + subtype_oid = _oids.INT8_OID class NumericRangeBinaryLoader(RangeBinaryLoader[Decimal]): - subtype_oid = postgres.types["numeric"].oid + subtype_oid = _oids.NUMERIC_OID class DateRangeBinaryLoader(RangeBinaryLoader[date]): - subtype_oid = postgres.types["date"].oid + subtype_oid = _oids.DATE_OID class TimestampRangeBinaryLoader(RangeBinaryLoader[datetime]): - subtype_oid = postgres.types["timestamp"].oid + subtype_oid = _oids.TIMESTAMP_OID class TimestampTZRangeBinaryLoader(RangeBinaryLoader[datetime]): - subtype_oid = postgres.types["timestamptz"].oid + subtype_oid = _oids.TIMESTAMPTZ_OID def register_default_adapters(context: AdaptContext) -> None: diff --git a/psycopg/psycopg/types/string.py b/psycopg/psycopg/types/string.py index fe5779b20..113186679 100644 --- a/psycopg/psycopg/types/string.py +++ b/psycopg/psycopg/types/string.py @@ -6,12 +6,11 @@ Adapters for textual types. from typing import Optional, Union, TYPE_CHECKING -from .. import postgres +from .. import _oids from ..pq import Format, Escaping from ..abc import AdaptContext from ..adapt import Buffer, Dumper, Loader from ..errors import DataError -from .._oids import INVALID_OID from .._encodings import conn_encoding if TYPE_CHECKING: @@ -58,17 +57,17 @@ class _StrDumper(_BaseStrDumper): class StrBinaryDumper(_StrBinaryDumper): - oid = postgres.types["text"].oid + oid = _oids.TEXT_OID class StrBinaryDumperVarchar(_StrBinaryDumper): - oid = postgres.types["varchar"].oid + oid = _oids.VARCHAR_OID class StrBinaryDumperName(_StrBinaryDumper): - oid = postgres.types["name"].oid + oid = _oids.NAME_OID class StrDumper(_StrDumper): @@ -81,17 +80,17 @@ class StrDumper(_StrDumper): text oid is required, for instance with variadic functions. """ - oid = postgres.types["text"].oid + oid = _oids.TEXT_OID class StrDumperVarchar(_StrDumper): - oid = postgres.types["varchar"].oid + oid = _oids.VARCHAR_OID class StrDumperName(_StrDumper): - oid = postgres.types["name"].oid + oid = _oids.NAME_OID class StrDumperUnknown(_StrDumper): @@ -133,7 +132,7 @@ class TextBinaryLoader(TextLoader): class BytesDumper(Dumper): - oid = postgres.types["bytea"].oid + oid = _oids.BYTEA_OID _qprefix = b"" def __init__(self, cls: type, context: Optional[AdaptContext] = None): @@ -172,7 +171,7 @@ class BytesDumper(Dumper): class BytesBinaryDumper(Dumper): format = Format.BINARY - oid = postgres.types["bytea"].oid + oid = _oids.BYTEA_OID def dump(self, obj: Buffer) -> Buffer: return obj @@ -216,7 +215,7 @@ def register_default_adapters(context: AdaptContext) -> None: adapters.register_dumper(str, StrDumper) adapters.register_dumper(str, StrDumperUnknown) - adapters.register_loader(INVALID_OID, TextLoader) + adapters.register_loader(_oids.INVALID_OID, TextLoader) adapters.register_loader("bpchar", TextLoader) adapters.register_loader("name", TextLoader) adapters.register_loader("text", TextLoader) @@ -236,5 +235,5 @@ def register_default_adapters(context: AdaptContext) -> None: adapters.register_dumper(memoryview, BytesBinaryDumper) adapters.register_loader("bytea", ByteaLoader) - adapters.register_loader(INVALID_OID, ByteaBinaryLoader) + adapters.register_loader(_oids.INVALID_OID, ByteaBinaryLoader) adapters.register_loader("bytea", ByteaBinaryLoader) diff --git a/psycopg/psycopg/types/uuid.py b/psycopg/psycopg/types/uuid.py index f92354c35..f9f35d54f 100644 --- a/psycopg/psycopg/types/uuid.py +++ b/psycopg/psycopg/types/uuid.py @@ -6,7 +6,7 @@ Adapters for the UUID type. from typing import Callable, Optional, TYPE_CHECKING -from .. import postgres +from .. import _oids from ..pq import Format from ..abc import AdaptContext from ..adapt import Buffer, Dumper, Loader @@ -20,7 +20,7 @@ UUID: Callable[..., "uuid.UUID"] = None # type: ignore[assignment] class UUIDDumper(Dumper): - oid = postgres.types["uuid"].oid + oid = _oids.UUID_OID def dump(self, obj: "uuid.UUID") -> bytes: return obj.hex.encode()