]> git.openstreetmap.org Git - nominatim.git/commitdiff
Guard against network failures in getDatabaseDate()
authorSarah Hoffmann <lonvia@denofr.de>
Fri, 9 Jun 2017 19:49:31 +0000 (21:49 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Fri, 9 Jun 2017 19:49:31 +0000 (21:49 +0200)
When updating use the date from the diff file instead
as we are guaranteed to get this if the file has been
successfully loaded.

lib/lib.php
utils/osm_file_date.py [new file with mode: 0755]
utils/setup.php
utils/update.php

index 9691f88a371b159cf7d62190674402a392be3ded..cb599ae8b1c46ed758b9f0d52fe3e3a01b571c42 100644 (file)
@@ -38,8 +38,13 @@ function getDatabaseDate(&$oDB)
     // Find the newest node in the DB
     $iLastOSMID = $oDB->getOne("select max(osm_id) from place where osm_type = 'N'");
     // Lookup the timestamp that node was created
-    $sLastNodeURL = 'http://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID."/1";
+    $sLastNodeURL = 'https://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID."/1";
     $sLastNodeXML = file_get_contents($sLastNodeURL);
+
+    if ($sLastNodeXML === false) {
+        return false;
+    }
+
     preg_match('#timestamp="(([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z)"#', $sLastNodeXML, $aLastNodeDate);
 
     return $aLastNodeDate[1];
diff --git a/utils/osm_file_date.py b/utils/osm_file_date.py
new file mode 100755 (executable)
index 0000000..6418efb
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/python
+
+import osmium
+import sys
+import datetime
+
+
+class Datecounter(osmium.SimpleHandler):
+
+    filedate = None
+
+    def date(self, o):
+        ts = o.timestamp
+        if self.filedate is None or ts > self.filedate:
+            self.filedate = ts
+
+    node = date
+    way = date
+    relation = date
+
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        print("Usage: python osm_file_date.py <osmfile>")
+        sys.exit(-1)
+
+    h = Datecounter()
+
+    h.apply_file(sys.argv[1])
+
+    print(h.filedate)
+
+
index eeba0a28e23ac79d1bedae806e6533c6a680ae75..7490d820dd212735b23aa5270a70efd39753a9d6 100755 (executable)
@@ -407,9 +407,13 @@ if ($aCMDResult['load-data'] || $aCMDResult['all']) {
 
     $sDatabaseDate = getDatabaseDate($oDB);
     pg_query($oDB->connection, 'TRUNCATE import_status');
-    $sSQL = "INSERT INTO import_status (lastimportdate) VALUES('".$sDatabaseDate."')";
-    pg_query($oDB->connection, $sSQL);
-    echo "Latest data imported from $sDatabaseDate.\n";
+    if ($sDatabaseDate === false) {
+        echo "WARNING: could not determine database date.\n";
+    } else {
+        $sSQL = "INSERT INTO import_status (lastimportdate) VALUES('".$sDatabaseDate."')";
+        pg_query($oDB->connection, $sSQL);
+        echo "Latest data imported from $sDatabaseDate.\n";
+    }
 }
 
 if ($aCMDResult['import-tiger-data']) {
index 2b72fe821e0e390fa9ea5f5690758d8ec6aaa63f..f47167687a756e1200d628cd763411baa06eb6b9 100755 (executable)
@@ -67,6 +67,9 @@ if ($aResult['init-updates']) {
     }
 
     $sDatabaseDate = getDatabaseDate($oDB);
+    if ($sDatabaseDate === false) {
+        fail("Cannot determine date of database.");
+    }
     $sWindBack = strftime('%Y-%m-%dT%H:%M:%SZ',
                           strtotime($sDatabaseDate) - (3*60*60));
 
@@ -293,7 +296,14 @@ if ($aResult['import-osmosis'] || $aResult['import-osmosis-all']) {
 
             // write the update logs
             $iFileSize = filesize($sImportFile);
-            $sBatchEnd = getDatabaseDate($oDB);
+            // get the newest object from the diff file
+            $sBatchEnd = 0;
+            $iRet = 0;
+            exec(CONST_BasePath.'/utils/osm_file_date.py '.$sImportFile, $sBatchEnd, $iRet);
+            if ($iRet != 0) {
+                fail('Error getting date from diff file.');
+            }
+            $sBatchEnd = $sBatchEnd[0];
             $sSQL = "INSERT INTO import_osmosis_log (batchend, batchseq, batchsize, starttime, endtime, event) values ('$sBatchEnd',$iEndSequence,$iFileSize,'".date('Y-m-d H:i:s', $fCMDStartTime)."','".date('Y-m-d H:i:s')."','import')";
             var_Dump($sSQL);
             chksql($oDB->query($sSQL));