diff options
Diffstat (limited to 'webmap-cgi')
-rwxr-xr-x | webmap-cgi | 17 |
1 files changed, 7 insertions, 10 deletions
@@ -28,7 +28,7 @@ import logging from typing import Final, Iterator import atexit -from psycopg import connect, Cursor # pylint: disable=import-error +from psycopg import connect, RawCursor # pylint: disable=import-error import common @@ -62,7 +62,7 @@ def get_query_map(layernames : set[str]) -> dict[str,bytes]: for layername in layernames: cur.execute('SELECT f_geometry_column, coord_dimension, srid, type ' 'FROM ' + common.escape_identifier(SCHEMA_NAME) + '.geometry_columns ' - 'WHERE f_table_schema = %s AND f_table_name = %s', + 'WHERE f_table_schema = $1 AND f_table_name = $2', params=(SCHEMA_NAME, layername), prepare=False) resp = cur.fetchone() @@ -107,7 +107,7 @@ def get_query_map(layernames : set[str]) -> dict[str,bytes]: 'FROM pg_index i ' 'JOIN pg_attribute a ' ' ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) ' - 'WHERE i.indrelid = %s::regclass AND i.indisprimary', + 'WHERE i.indrelid = $1::regclass AND i.indisprimary', params=(common.escape_identifier(SCHEMA_NAME) + '.' + common.escape_identifier(layername),), prepare=False) @@ -128,7 +128,7 @@ def get_query_map(layernames : set[str]) -> dict[str,bytes]: column_names = [] cur.execute('SELECT column_name FROM information_schema.columns ' - 'WHERE table_schema = %s AND table_name = %s', + 'WHERE table_schema = $1 AND table_name = $2', params=(SCHEMA_NAME, layername), prepare=False) # never empty since the we know the table exists and has a primary key @@ -158,10 +158,10 @@ def get_query_map(layernames : set[str]) -> dict[str,bytes]: query += 'ST_Perimeter(' + geom_col2d_esc +') AS geom_perimeter,' elif d == 1: query += 'ST_Length(' + geom_col2d_esc +') AS geom_length,' - query += '%s AS layer_group,%s AS layer ' + query += '$1 AS layer_group,$2 AS layer ' query += 'FROM ' + common.escape_identifier(SCHEMA_NAME) + '.' query += common.escape_identifier(layername) + ' m ' - query += 'WHERE m.' + common.escape_identifier(pkey_col) + ' = %s' + query += 'WHERE m.' + common.escape_identifier(pkey_col) + ' = $3' query += ') ' query += 'SELECT json_serialize(to_json(feature) RETURNING bytea) FROM feature' # The query never returns more than one row since we filter on a single FID. @@ -269,16 +269,13 @@ def application(env, start_response) -> Iterator[bytes]: PG_CONN = connect('postgresql://webmap_guest@/webmap', autocommit=True, prepare_threshold=0, - # TODO[trixie] use cursor_factory=RawCursor - # https://www.psycopg.org/psycopg3/docs/advanced/cursors.html#cursor-types - cursor_factory=Cursor) + cursor_factory=RawCursor) @atexit.register def handler(): """Gracefully close the connection before terminating the worker""" # avoid "AttributeError: 'NoneType' object has no attribute 'connection_summary'" # when destructing the object - # TODO[trixie] reevaluate, possibly related to https://github.com/psycopg/psycopg/issues/591 PG_CONN.close() # pylint: disable=no-member common.init_logger(app=os_path.basename(__file__), level=logging.INFO) |