2 Access and helper functions for the status and status log table.
8 from ..tools.exec_utils import get_url
10 LOG = logging.getLogger()
12 def compute_database_date(conn):
13 """ Determine the date of the database from the newest object in the
16 # First, find the node with the highest ID in the database
17 with conn.cursor() as cur:
18 osmid = cur.scalar("SELECT max(osm_id) FROM place WHERE osm_type='N'")
21 LOG.fatal("No data found in the database.")
22 raise RuntimeError("No data found in the database.")
24 LOG.info("Using node id %d for timestamp lookup", osmid)
25 # Get the node from the API to find the timestamp when it was created.
26 node_url = 'https://www.openstreetmap.org/api/0.6/node/{}/1'.format(osmid)
27 data = get_url(node_url)
29 match = re.search(r'timestamp="((\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}))Z"', data)
32 LOG.fatal("The node data downloaded from the API does not contain valid data.\n"
33 "URL used: %s", node_url)
34 raise RuntimeError("Bad API data.")
36 LOG.debug("Found timestamp %s", match[1])
38 return dt.datetime.fromisoformat(match[1]).replace(tzinfo=dt.timezone.utc)
41 def set_status(conn, date, seq=None, indexed=True):
42 """ Replace the current status with the given status.
44 assert date.tzinfo == dt.timezone.utc
45 with conn.cursor() as cur:
46 cur.execute("TRUNCATE TABLE import_status")
47 cur.execute("""INSERT INTO import_status (lastimportdate, sequence_id, indexed)
48 VALUES (%s, %s, %s)""", (date, seq, indexed))
54 """ Return the current status as a triple of (date, sequence, indexed).
55 If status has not been set up yet, a triple of None is returned.
57 with conn.cursor() as cur:
58 cur.execute("SELECT * FROM import_status LIMIT 1")
60 return None, None, None
63 return row['lastimportdate'], row['sequence_id'], row['indexed']
66 def set_indexed(conn, state):
67 """ Set the indexed flag in the status table to the given state.
69 with conn.cursor() as cur:
70 cur.execute("UPDATE import_status SET indexed = %s", (state, ))
74 def log_status(conn, start, event, batchsize=None):
75 """ Write a new status line to the `import_osmosis_log` table.
77 with conn.cursor() as cur:
78 cur.execute("""INSERT INTO import_osmosis_log
79 (batchend, batchseq, batchsize, starttime, endtime, event)
80 SELECT lastimportdate, sequence_id, %s, %s, now(), %s FROM import_status""",
81 (batchsize, start, event))