From: Daniele Varrazzo Date: Sat, 28 Mar 2020 14:31:13 +0000 (+1300) Subject: Added map of types oids X-Git-Tag: 3.0.dev0~659 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fe132322bc156eab6400d0a78fcc3a9790653458;p=thirdparty%2Fpsycopg.git Added map of types oids --- diff --git a/psycopg3/adaptation.py b/psycopg3/adaptation.py index 3404b3c83..9ed76b933 100644 --- a/psycopg3/adaptation.py +++ b/psycopg3/adaptation.py @@ -9,11 +9,10 @@ import codecs from . import exceptions as exc from .pq import Format from .cursor import BaseCursor +from .types.oids import type_oid from .connection import BaseConnection INVALID_OID = 0 -TEXT_OID = 25 -NUMERIC_OID = 1700 ascii_encode = codecs.lookup("ascii").encode ascii_decode = codecs.lookup("ascii").decode @@ -179,7 +178,7 @@ class Transformer: oid = data[1] data = data[0] else: - oid = TEXT_OID + oid = type_oid["text"] out.append(data) types.append(oid) @@ -188,7 +187,7 @@ class Transformer: def adapt(self, obj, fmt): if obj is None: - return None, TEXT_OID + return None, type_oid["text"] cls = type(obj) func = self.get_adapt_function(cls, fmt) @@ -291,8 +290,8 @@ class StringAdapter(Adapter): return self.encode(obj)[0] -@caster(TEXT_OID) -@binary_caster(TEXT_OID) +@caster(type_oid["text"]) +@binary_caster(type_oid["text"]) class StringCaster(Typecaster): def __init__(self, oid, conn): super().__init__(oid, conn) @@ -314,10 +313,10 @@ class StringCaster(Typecaster): @adapter(int) def adapt_int(obj): - return ascii_encode(str(obj))[0], NUMERIC_OID + return ascii_encode(str(obj))[0], type_oid["numeric"] -@caster(NUMERIC_OID) +@caster(type_oid["numeric"]) def cast_int(data): return int(ascii_decode(data)[0]) diff --git a/psycopg3/types/__init__.py b/psycopg3/types/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/psycopg3/types/oids.py b/psycopg3/types/oids.py new file mode 100644 index 000000000..b6d006e37 --- /dev/null +++ b/psycopg3/types/oids.py @@ -0,0 +1,132 @@ +""" +Maps of builtin types and names + +You can update this file by executing it, using the PG* env var to connect +to a Postgres server. +""" + +# Copyright (C) 2020 The Psycopg Team + +_oids_table = [ + # autogenerated start + # Generated from PostgreSQL 11 + ("abstime", 702, 1023), + ("aclitem", 1033, 1034), + ("any", 2276, 0), + ("anyarray", 2277, 0), + ("anyelement", 2283, 0), + ("anyenum", 3500, 0), + ("anynonarray", 2776, 0), + ("anyrange", 3831, 0), + ("bit", 1560, 1561), + ("bool", 16, 1000), + ("box", 603, 1020), + ("bpchar", 1042, 1014), + ("bytea", 17, 1001), + ("char", 18, 1002), + ("cid", 29, 1012), + ("cidr", 650, 651), + ("circle", 718, 719), + ("cstring", 2275, 1263), + ("date", 1082, 1182), + ("daterange", 3912, 3913), + ("event_trigger", 3838, 0), + ("float4", 700, 1021), + ("float8", 701, 1022), + ("gtsvector", 3642, 3644), + ("inet", 869, 1041), + ("int2", 21, 1005), + ("int2vector", 22, 1006), + ("int4", 23, 1007), + ("int4range", 3904, 3905), + ("int8", 20, 1016), + ("int8range", 3926, 3927), + ("internal", 2281, 0), + ("interval", 1186, 1187), + ("json", 114, 199), + ("jsonb", 3802, 3807), + ("line", 628, 629), + ("lseg", 601, 1018), + ("macaddr", 829, 1040), + ("macaddr8", 774, 775), + ("money", 790, 791), + ("name", 19, 1003), + ("numeric", 1700, 1231), + ("numrange", 3906, 3907), + ("oid", 26, 1028), + ("oidvector", 30, 1013), + ("opaque", 2282, 0), + ("path", 602, 1019), + ("point", 600, 1017), + ("polygon", 604, 1027), + ("record", 2249, 2287), + ("refcursor", 1790, 2201), + ("reltime", 703, 1024), + ("smgr", 210, 0), + ("text", 25, 1009), + ("tid", 27, 1010), + ("time", 1083, 1183), + ("timestamp", 1114, 1115), + ("timestamptz", 1184, 1185), + ("timetz", 1266, 1270), + ("tinterval", 704, 1025), + ("trigger", 2279, 0), + ("tsquery", 3615, 3645), + ("tsrange", 3908, 3909), + ("tstzrange", 3910, 3911), + ("tsvector", 3614, 3643), + ("txid_snapshot", 2970, 2949), + ("unknown", 705, 0), + ("uuid", 2950, 2951), + ("varbit", 1562, 1563), + ("varchar", 1043, 1015), + ("void", 2278, 0), + ("xid", 28, 1011), + ("xml", 142, 143), + # autogenerated end +] + +type_oid = {name: oid for name, oid, array_oid in _oids_table} + + +def self_update(): + import subprocess as sp + + queries = [ + """ +select format(' # Generated from PostgreSQL %s', setting::int / 10000) + from pg_settings + where name = 'server_version_num'; +""", + """ +select format(' (\"%s\", %s, %s),', typname, oid, typarray) + from pg_type + where oid < 10000 + and typname !~ all('{^(_|pg_|reg),_handler$}') + order by 1; +""", + ] + + with open(__file__, "rb") as f: + lines = f.read().splitlines() + + new = [] + for query in queries: + out = sp.run( + ["psql", "-AXqt", "-c", query], stdout=sp.PIPE, check=True + ) + new.extend(out.stdout.splitlines()) + + istart, = [ + i for i, l in enumerate(lines) if b"autogenerated " + b"start" in l + ] + iend, = [i for i, l in enumerate(lines) if b"autogenerated " + b"end" in l] + lines[istart + 1 : iend] = new + + with open(__file__, "wb") as f: + f.write(b"\n".join(lines)) + f.write(b"\n") + + +if __name__ == "__main__": + self_update()