]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
feat: add _oid module to know OIDs at import time
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 6 Jan 2023 14:03:12 +0000 (14:03 +0000)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Mon, 9 Jan 2023 17:44:16 +0000 (17:44 +0000)
psycopg/psycopg/_oids.py [new file with mode: 0644]
psycopg/psycopg/postgres.py
psycopg_c/psycopg_c/_psycopg/oids.pxd
tools/update_oids.py

diff --git a/psycopg/psycopg/_oids.py b/psycopg/psycopg/_oids.py
new file mode 100644 (file)
index 0000000..f8aeeaa
--- /dev/null
@@ -0,0 +1,96 @@
+"""
+PostgreSQL known type OIDs
+
+This is an internal module. Types are publicly exposed by
+`psycopg.postgres.types`. This module is only used to know the OIDs at import
+time and avoid circular import problems.
+"""
+
+# Copyright (C) 2020 The Psycopg Team
+
+# A couple of special cases used a bit everywhere.
+INVALID_OID = 0
+TEXT_ARRAY_OID = 1009
+
+# Use tools/update_oids.py to update this data.
+# autogenerated: start
+
+# Generated from PostgreSQL 15.1
+
+ACLITEM_OID = 1033
+BIT_OID = 1560
+BOOL_OID = 16
+BOX_OID = 603
+BPCHAR_OID = 1042
+BYTEA_OID = 17
+CHAR_OID = 18
+CID_OID = 29
+CIDR_OID = 650
+CIRCLE_OID = 718
+DATE_OID = 1082
+DATEMULTIRANGE_OID = 4535
+DATERANGE_OID = 3912
+FLOAT4_OID = 700
+FLOAT8_OID = 701
+GTSVECTOR_OID = 3642
+INET_OID = 869
+INT2_OID = 21
+INT2VECTOR_OID = 22
+INT4_OID = 23
+INT4MULTIRANGE_OID = 4451
+INT4RANGE_OID = 3904
+INT8_OID = 20
+INT8MULTIRANGE_OID = 4536
+INT8RANGE_OID = 3926
+INTERVAL_OID = 1186
+JSON_OID = 114
+JSONB_OID = 3802
+JSONPATH_OID = 4072
+LINE_OID = 628
+LSEG_OID = 601
+MACADDR_OID = 829
+MACADDR8_OID = 774
+MONEY_OID = 790
+NAME_OID = 19
+NUMERIC_OID = 1700
+NUMMULTIRANGE_OID = 4532
+NUMRANGE_OID = 3906
+OID_OID = 26
+OIDVECTOR_OID = 30
+PATH_OID = 602
+PG_LSN_OID = 3220
+POINT_OID = 600
+POLYGON_OID = 604
+RECORD_OID = 2249
+REFCURSOR_OID = 1790
+REGCLASS_OID = 2205
+REGCOLLATION_OID = 4191
+REGCONFIG_OID = 3734
+REGDICTIONARY_OID = 3769
+REGNAMESPACE_OID = 4089
+REGOPER_OID = 2203
+REGOPERATOR_OID = 2204
+REGPROC_OID = 24
+REGPROCEDURE_OID = 2202
+REGROLE_OID = 4096
+REGTYPE_OID = 2206
+TEXT_OID = 25
+TID_OID = 27
+TIME_OID = 1083
+TIMESTAMP_OID = 1114
+TIMESTAMPTZ_OID = 1184
+TIMETZ_OID = 1266
+TSMULTIRANGE_OID = 4533
+TSQUERY_OID = 3615
+TSRANGE_OID = 3908
+TSTZMULTIRANGE_OID = 4534
+TSTZRANGE_OID = 3910
+TSVECTOR_OID = 3614
+TXID_SNAPSHOT_OID = 2970
+UUID_OID = 2950
+VARBIT_OID = 1562
+VARCHAR_OID = 1043
+XID_OID = 28
+XID8_OID = 5069
+XML_OID = 142
+# autogenerated: end
index 792a9c8dc0cd5a47fb3c6cae006098d13b60489d..35aa68d63281d637aed6d52d3e58fb18ed089ca7 100644 (file)
@@ -18,7 +18,7 @@ adapters = AdaptersMap(types=types)
 for t in [
     TypeInfo('"char"', 18, 1002),
     # autogenerated: start
-    # Generated from PostgreSQL 15.0
+    # Generated from PostgreSQL 15.1
     TypeInfo("aclitem", 1033, 1034),
     TypeInfo("bit", 1560, 1561),
     TypeInfo("bool", 16, 1000, regtype="boolean"),
index 2a864c4a1de03d386b6e6a0f3cb64121f058b8b8..a958dcadaea68c5bc2c4830df0c7541504899703 100644 (file)
@@ -11,7 +11,7 @@ cdef enum:
 
     # autogenerated: start
 
-    # Generated from PostgreSQL 15.0
+    # Generated from PostgreSQL 15.1
 
     ACLITEM_OID = 1033
     BIT_OID = 1560
index df4f969c7706baf096dc321950b0ac9f29ee3d5f..942d2ac57f817642f933da10dbbe27dbed1cf409 100755 (executable)
@@ -39,10 +39,11 @@ def main() -> None:
         update_crdb_python_oids(conn)
     else:
         update_python_oids(conn)
+        update_python_types(conn)
         update_cython_oids(conn)
 
 
-def update_python_oids(conn: Connection) -> None:
+def update_python_types(conn: Connection) -> None:
     fn = ROOT / "psycopg/psycopg/postgres.py"
 
     lines = []
@@ -55,6 +56,17 @@ def update_python_oids(conn: Connection) -> None:
     sp.check_call(["black", "-q", fn])
 
 
+def update_python_oids(conn: Connection) -> None:
+    fn = ROOT / "psycopg/psycopg/_oids.py"
+
+    lines = []
+    lines.extend(get_version_comment(conn))
+    lines.extend(get_py_oids(conn))
+
+    update_file(fn, lines)
+    sp.check_call(["black", "-q", fn])
+
+
 def update_cython_oids(conn: Connection) -> None:
     fn = ROOT / "psycopg_c/psycopg_c/_psycopg/oids.pxd"
 
@@ -90,6 +102,25 @@ def get_version_comment(conn: Connection) -> List[str]:
     return ["", f"    # Generated from {conn.info.vendor} {version}", ""]
 
 
+def get_py_oids(conn: Connection) -> List[str]:
+    lines = []
+    for (typname, oid) in conn.execute(
+        """
+select typname, oid
+from pg_type
+where
+    oid < 10000
+    and (typtype = any('{b,r,m}') or typname = 'record')
+    and (typname !~ '^(_|pg_)' or typname = 'pg_lsn')
+order by typname
+"""
+    ):
+        const_name = typname.upper() + "_OID"
+        lines.append(f"{const_name} = {oid}")
+
+    return lines
+
+
 def get_py_types(conn: Connection) -> List[str]:
     # Note: "record" is a pseudotype but still a useful one to have.
     # "pg_lsn" is a documented public type and useful in streaming replication