X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/4cb6dc01f382e9fb748efbe4517442af2274f210..ec7184c53315711b02ac66a05cf04a618e1d3ee3:/nominatim/db/status.py diff --git a/nominatim/db/status.py b/nominatim/db/status.py index 9d7344c4..71e58787 100644 --- a/nominatim/db/status.py +++ b/nominatim/db/status.py @@ -5,9 +5,11 @@ import datetime as dt import logging import re -from ..tools.exec_utils import get_url +from nominatim.tools.exec_utils import get_url +from nominatim.errors import UsageError LOG = logging.getLogger() +ISODATE_FORMAT = '%Y-%m-%dT%H:%M:%S' def compute_database_date(conn): """ Determine the date of the database from the newest object in the @@ -15,11 +17,14 @@ def compute_database_date(conn): """ # First, find the node with the highest ID in the database with conn.cursor() as cur: - osmid = cur.scalar("SELECT max(osm_id) FROM place WHERE osm_type='N'") + if conn.table_exists('place'): + osmid = cur.scalar("SELECT max(osm_id) FROM place WHERE osm_type='N'") + else: + osmid = cur.scalar("SELECT max(osm_id) FROM placex WHERE osm_type='N'") if osmid is None: LOG.fatal("No data found in the database.") - raise RuntimeError("No data found in the database.") + raise UsageError("No data found in the database.") LOG.info("Using node id %d for timestamp lookup", osmid) # Get the node from the API to find the timestamp when it was created. @@ -31,21 +36,27 @@ def compute_database_date(conn): if match is None: LOG.fatal("The node data downloaded from the API does not contain valid data.\n" "URL used: %s", node_url) - raise RuntimeError("Bad API data.") + raise UsageError("Bad API data.") - LOG.debug("Found timestamp %s", match[1]) + LOG.debug("Found timestamp %s", match.group(1)) - return dt.datetime.fromisoformat(match[1]).replace(tzinfo=dt.timezone.utc) + return dt.datetime.strptime(match.group(1), ISODATE_FORMAT).replace(tzinfo=dt.timezone.utc) def set_status(conn, date, seq=None, indexed=True): - """ Replace the current status with the given status. + """ Replace the current status with the given status. If date is `None` + then only sequence and indexed will be updated as given. Otherwise + the whole status is replaced. """ - assert date.tzinfo == dt.timezone.utc + assert date is None or date.tzinfo == dt.timezone.utc with conn.cursor() as cur: - cur.execute("TRUNCATE TABLE import_status") - cur.execute("""INSERT INTO import_status (lastimportdate, sequence_id, indexed) - VALUES (%s, %s, %s)""", (date, seq, indexed)) + if date is None: + cur.execute("UPDATE import_status set sequence_id = %s, indexed = %s", + (seq, indexed)) + else: + cur.execute("TRUNCATE TABLE import_status") + cur.execute("""INSERT INTO import_status (lastimportdate, sequence_id, indexed) + VALUES (%s, %s, %s)""", (date, seq, indexed)) conn.commit()