forked from MagicStack/asyncpg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate_type_map.py
executable file
·100 lines (72 loc) · 2.59 KB
/
generate_type_map.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/env python3
#
# Copyright (C) 2016-present the ayncpg authors and contributors
# <see AUTHORS file>
#
# This module is part of asyncpg and is released under
# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
import argparse
import asyncio
import asyncpg
# Array types with builtin codecs, necessary for codec
# bootstrap to work
#
_BUILTIN_ARRAYS = ('_text', '_oid')
_INVALIDOID = 0
# postgresql/src/include/access/transam.h: FirstBootstrapObjectId
_MAXBUILTINOID = 10000 - 1
async def runner(args):
conn = await asyncpg.connect(host=args.pghost, port=args.pgport,
user=args.pguser)
buf = '# GENERATED FROM pg_catalog.pg_type\n' + \
'# DO NOT MODIFY, use tools/generate_type_map.py to update\n\n' + \
'DEF INVALIDOID = {}\nDEF MAXBUILTINOID = {}\n'.format(
_INVALIDOID, _MAXBUILTINOID)
pg_types = await conn.fetch('''
SELECT
oid,
typname
FROM
pg_catalog.pg_type
WHERE
typtype IN ('b', 'p')
AND (typelem = 0 OR typname = any($1) OR typlen > 0)
AND oid <= $2
ORDER BY
oid
''', _BUILTIN_ARRAYS, _MAXBUILTINOID)
defs = []
typemap = {}
array_types = []
for pg_type in pg_types:
typeoid = pg_type['oid']
typename = pg_type['typname']
defname = '{}OID'.format(typename.upper())
defs.append('DEF {name} = {oid}'.format(name=defname, oid=typeoid))
if typename in _BUILTIN_ARRAYS:
array_types.append(defname)
typename = typename[1:] + '[]'
typemap[defname] = typename
buf += 'DEF MAXSUPPORTEDOID = {}\n\n'.format(pg_types[-1]['oid'])
buf += '\n'.join(defs)
buf += '\n\nARRAY_TYPES = ({},)'.format(', '.join(array_types))
f_typemap = ('{}: {!r}'.format(dn, n) for dn, n in sorted(typemap.items()))
buf += '\n\nTYPEMAP = {{\n {}}}'.format(',\n '.join(f_typemap))
print(buf)
def main():
parser = argparse.ArgumentParser(
description='generate protocol/pgtypes.pxi from pg_catalog.pg_types')
parser.add_argument(
'--pghost', type=str, default='127.0.0.1',
help='PostgreSQL server host')
parser.add_argument(
'--pgport', type=int, default=5432,
help='PostgreSQL server port')
parser.add_argument(
'--pguser', type=str, default='postgres',
help='PostgreSQL server user')
args = parser.parse_args()
loop = asyncio.get_event_loop()
loop.run_until_complete(runner(args))
if __name__ == '__main__':
main()