X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/1b7c8240baeb383a2481f895fc85a74aaa16e94e..78c19bc006d5957f183968d086226be4b2b65fe3:/nominatim/api/core.py diff --git a/nominatim/api/core.py b/nominatim/api/core.py index b2624227..333833b0 100644 --- a/nominatim/api/core.py +++ b/nominatim/api/core.py @@ -19,6 +19,7 @@ import sqlalchemy.ext.asyncio as sa_asyncio from nominatim.errors import UsageError from nominatim.db.sqlalchemy_schema import SearchTables from nominatim.db.async_core_library import PGCORE_LIB, PGCORE_ERROR +import nominatim.db.sqlite_functions from nominatim.config import Configuration from nominatim.api.connection import SearchConnection from nominatim.api.status import get_status, StatusResult @@ -87,7 +88,7 @@ class NominatimAPIAsync: #pylint: disable=too-many-instance-attributes if self.config.get_int('API_POOL_SIZE') == 0: extra_args['poolclass'] = sa.pool.NullPool else: - extra_args['poolclass'] = sa.pool.QueuePool + extra_args['poolclass'] = sa.pool.AsyncAdaptedQueuePool extra_args['max_overflow'] = 0 extra_args['pool_size'] = self.config.get_int('API_POOL_SIZE') @@ -100,6 +101,10 @@ class NominatimAPIAsync: #pylint: disable=too-many-instance-attributes dburl = sa.engine.URL.create('sqlite+aiosqlite', database=params.get('dbname')) + if not ('NOMINATIM_DATABASE_RW' in self.config.environ + and self.config.get_bool('DATABASE_RW')) \ + and not Path(params.get('dbname', '')).is_file(): + raise UsageError(f"SQlite database '{params.get('dbname')}' does not exist.") else: dsn = self.config.get_database_params() query = {k: v for k, v in dsn.items() @@ -122,6 +127,7 @@ class NominatimAPIAsync: #pylint: disable=too-many-instance-attributes @sa.event.listens_for(engine.sync_engine, "connect") def _on_sqlite_connect(dbapi_con: Any, _: Any) -> None: dbapi_con.run_async(lambda conn: conn.enable_load_extension(True)) + nominatim.db.sqlite_functions.install_custom_functions(dbapi_con) cursor = dbapi_con.cursor() cursor.execute("SELECT load_extension('mod_spatialite')") cursor.execute('SELECT SetDecimalPrecision(7)') @@ -131,6 +137,10 @@ class NominatimAPIAsync: #pylint: disable=too-many-instance-attributes async with engine.begin() as conn: result = await conn.scalar(sa.text('SHOW server_version_num')) server_version = int(result) + if server_version >= 110000: + await conn.execute(sa.text("SET jit_above_cost TO '-1'")) + await conn.execute(sa.text( + "SET max_parallel_workers_per_gather TO '0'")) except (PGCORE_ERROR, sa.exc.OperationalError): server_version = 0 @@ -140,8 +150,6 @@ class NominatimAPIAsync: #pylint: disable=too-many-instance-attributes cursor = dbapi_con.cursor() cursor.execute("SET jit_above_cost TO '-1'") cursor.execute("SET max_parallel_workers_per_gather TO '0'") - # Make sure that all connections get the new settings - await engine.dispose() self._property_cache['DB:server_version'] = server_version @@ -366,7 +374,7 @@ class NominatimAPI: """ Close all active connections to the database. This function also closes the asynchronous worker loop making - the NominatimAPI object unusuable. + the NominatimAPI object unusable. """ self._loop.run_until_complete(self._async_api.close()) self._loop.close() @@ -439,7 +447,7 @@ class NominatimAPI: place. Only meaning full for POI-like objects (places with a rank_address of 30). linked_place_id (Optional[int]): Internal ID of the place this object - linkes to. When this ID is set then there is no guarantee that + links to. When this ID is set then there is no guarantee that the rest of the result information is complete. admin_level (int): Value of the `admin_level` OSM tag. Only meaningful for administrative boundary objects.