2 Access and helper functions for the status and status log table.
 
   8 from ..tools.exec_utils import get_url
 
   9 from ..errors import UsageError
 
  11 LOG = logging.getLogger()
 
  13 def compute_database_date(conn):
 
  14     """ Determine the date of the database from the newest object in the
 
  17     # First, find the node with the highest ID in the database
 
  18     with conn.cursor() as cur:
 
  19         osmid = cur.scalar("SELECT max(osm_id) FROM place WHERE osm_type='N'")
 
  22             LOG.fatal("No data found in the database.")
 
  23             raise UsageError("No data found in the database.")
 
  25     LOG.info("Using node id %d for timestamp lookup", osmid)
 
  26     # Get the node from the API to find the timestamp when it was created.
 
  27     node_url = 'https://www.openstreetmap.org/api/0.6/node/{}/1'.format(osmid)
 
  28     data = get_url(node_url)
 
  30     match = re.search(r'timestamp="((\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}))Z"', data)
 
  33         LOG.fatal("The node data downloaded from the API does not contain valid data.\n"
 
  34                   "URL used: %s", node_url)
 
  35         raise UsageError("Bad API data.")
 
  37     LOG.debug("Found timestamp %s", match[1])
 
  39     return dt.datetime.fromisoformat(match[1]).replace(tzinfo=dt.timezone.utc)
 
  42 def set_status(conn, date, seq=None, indexed=True):
 
  43     """ Replace the current status with the given status. If date is `None`
 
  44         then only sequence and indexed will be updated as given. Otherwise
 
  45         the whole status is replaced.
 
  47     assert date is None or date.tzinfo == dt.timezone.utc
 
  48     with conn.cursor() as cur:
 
  50             cur.execute("UPDATE import_status set sequence_id = %s, indexed = %s",
 
  53             cur.execute("TRUNCATE TABLE import_status")
 
  54             cur.execute("""INSERT INTO import_status (lastimportdate, sequence_id, indexed)
 
  55                            VALUES (%s, %s, %s)""", (date, seq, indexed))
 
  61     """ Return the current status as a triple of (date, sequence, indexed).
 
  62         If status has not been set up yet, a triple of None is returned.
 
  64     with conn.cursor() as cur:
 
  65         cur.execute("SELECT * FROM import_status LIMIT 1")
 
  67             return None, None, None
 
  70         return row['lastimportdate'], row['sequence_id'], row['indexed']
 
  73 def set_indexed(conn, state):
 
  74     """ Set the indexed flag in the status table to the given state.
 
  76     with conn.cursor() as cur:
 
  77         cur.execute("UPDATE import_status SET indexed = %s", (state, ))
 
  81 def log_status(conn, start, event, batchsize=None):
 
  82     """ Write a new status line to the `import_osmosis_log` table.
 
  84     with conn.cursor() as cur:
 
  85         cur.execute("""INSERT INTO import_osmosis_log
 
  86                        (batchend, batchseq, batchsize, starttime, endtime, event)
 
  87                        SELECT lastimportdate, sequence_id, %s, %s, now(), %s FROM import_status""",
 
  88                     (batchsize, start, event))