use import date from osm2pgsql property table if available

This commit is contained in:
Sarah Hoffmann 2024-03-05 11:33:32 +01:00
parent 247065ff6f
commit ae7c584e28
3 changed files with 38 additions and 10 deletions

View File

@ -219,12 +219,11 @@ class SetupAll:
""" Determine the database date and set the status accordingly. """ Determine the database date and set the status accordingly.
""" """
with connect(dsn) as conn: with connect(dsn) as conn:
if not offline: properties.set_property(conn, 'database_version', str(NOMINATIM_VERSION))
try: try:
dbdate = status.compute_database_date(conn) dbdate = status.compute_database_date(conn, offline)
status.set_status(conn, dbdate) status.set_status(conn, dbdate)
LOG.info('Database is at %s.', dbdate) LOG.info('Database is at %s.', dbdate)
except Exception as exc: # pylint: disable=broad-except except Exception as exc: # pylint: disable=broad-except
LOG.error('Cannot determine date of database: %s', exc) LOG.error('Cannot determine date of database: %s', exc)
properties.set_property(conn, 'database_version', str(NOMINATIM_VERSION))

View File

@ -29,11 +29,24 @@ class StatusRow(TypedDict):
indexed: Optional[bool] indexed: Optional[bool]
def compute_database_date(conn: Connection) -> dt.datetime: def compute_database_date(conn: Connection, offline: bool = False) -> dt.datetime:
""" Determine the date of the database from the newest object in the """ Determine the date of the database from the newest object in the
data base. data base.
""" """
# First, find the node with the highest ID in the database # If there is a date from osm2pgsql available, use that.
if conn.table_exists('osm2pgsql_properties'):
with conn.cursor() as cur:
cur.execute(""" SELECT value FROM osm2pgsql_properties
WHERE property = 'current_timestamp' """)
row = cur.fetchone()
if row is not None:
return dt.datetime.strptime(row[0], "%Y-%m-%dT%H:%M:%SZ")\
.replace(tzinfo=dt.timezone.utc)
if offline:
raise UsageError("Cannot determine database date from data in offline mode.")
# Else, find the node with the highest ID in the database
with conn.cursor() as cur: with conn.cursor() as cur:
if conn.table_exists('place'): if conn.table_exists('place'):
osmid = cur.scalar("SELECT max(osm_id) FROM place WHERE osm_type='N'") osmid = cur.scalar("SELECT max(osm_id) FROM place WHERE osm_type='N'")

View File

@ -31,6 +31,22 @@ def setup_status_table(status_table):
pass pass
@pytest.mark.parametrize('offline', [True, False])
def test_compute_database_date_from_osm2pgsql(table_factory, temp_db_conn, offline):
table_factory('osm2pgsql_properties', 'property TEXT, value TEXT',
content=(('current_timestamp', '2024-01-03T23:45:54Z'), ))
date = nominatim.db.status.compute_database_date(temp_db_conn, offline=offline)
assert date == iso_date('2024-01-03T23:45:54')
def test_compute_database_date_from_osm2pgsql_nodata(table_factory, temp_db_conn):
table_factory('osm2pgsql_properties', 'property TEXT, value TEXT')
with pytest.raises(UsageError, match='Cannot determine database date from data in offline mode'):
nominatim.db.status.compute_database_date(temp_db_conn, offline=True)
def test_compute_database_date_place_empty(place_table, temp_db_conn): def test_compute_database_date_place_empty(place_table, temp_db_conn):
with pytest.raises(UsageError): with pytest.raises(UsageError):
nominatim.db.status.compute_database_date(temp_db_conn) nominatim.db.status.compute_database_date(temp_db_conn)