]> git.openstreetmap.org Git - nominatim.git/commitdiff
add event handler for default connection settings
authorSarah Hoffmann <lonvia@denofr.de>
Wed, 14 Dec 2022 19:31:46 +0000 (20:31 +0100)
committerSarah Hoffmann <lonvia@denofr.de>
Tue, 3 Jan 2023 09:03:00 +0000 (10:03 +0100)
docs/admin/Installation.md
nominatim/api.py

index 1c9b5f3d874b99b5c7681a1b6b45087c710b40e3..90b2cb39c87be2938f874d7b2e4aa8e8cc5999e9 100644 (file)
@@ -49,7 +49,7 @@ For running Nominatim:
   * [psutil](https://github.com/giampaolo/psutil)
   * [Jinja2](https://palletsprojects.com/p/jinja/)
   * [SQLAlchemy](https://www.sqlalchemy.org/) (1.4+ with greenlet support)
-  * [asyncpg](https://magicstack.github.io/asyncpg)
+  * [asyncpg](https://magicstack.github.io/asyncpg) (0.8+)
   * [PyICU](https://pypi.org/project/PyICU/)
   * [PyYaml](https://pyyaml.org/) (5.1+)
   * [datrie](https://github.com/pytries/datrie)
index e129c4f8de4e9e13c5f87a9183cc6deabbf14ec4..10cca5330d6ae11fa1699933c27e61ecac330e21 100644 (file)
@@ -7,12 +7,14 @@
 """
 Implementation of classes for API access via libraries.
 """
-from typing import Mapping, Optional
+from typing import Mapping, Optional, cast, Any
 import asyncio
 from pathlib import Path
 
+from sqlalchemy import text, event
 from sqlalchemy.engine.url import URL
 from sqlalchemy.ext.asyncio import create_async_engine
+import asyncpg
 
 from nominatim.config import Configuration
 from nominatim.apicmd.status import get_status, StatusResult
@@ -33,10 +35,29 @@ class NominatimAPIAsync:
                    host=dsn.get('host'), port=int(dsn['port']) if 'port' in dsn else None,
                    query={k: v for k, v in dsn.items()
                           if k not in ('user', 'password', 'dbname', 'host', 'port')})
-        self.engine = create_async_engine(dburl,
-                                          connect_args={"server_settings": {"jit": "off"}},
-                                          future=True)
-
+        self.engine = create_async_engine(
+                         dburl, future=True,
+                         connect_args={'server_settings': {
+                            'DateStyle': 'sql,european',
+                            'max_parallel_workers_per_gather': '0'
+                         }})
+        asyncio.get_event_loop().run_until_complete(self._query_server_version())
+        asyncio.get_event_loop().run_until_complete(self.close())
+
+        if self.server_version >= 110000:
+            @event.listens_for(self.engine.sync_engine, "connect") # type: ignore[misc]
+            def _on_connect(dbapi_con: Any, _: Any) -> None:
+                cursor = dbapi_con.cursor()
+                cursor.execute("SET jit_above_cost TO '-1'")
+
+
+    async def _query_server_version(self) -> None:
+        try:
+            async with self.engine.begin() as conn:
+                result = await conn.scalar(text('SHOW server_version_num'))
+                self.server_version = int(cast(str, result))
+        except asyncpg.PostgresError:
+            self.server_version = 0
 
     async def close(self) -> None:
         """ Close all active connections to the database. The NominatimAPIAsync