X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/9ccf3899158b8aedfac8d0769e7bb90df2e31a60..bcbba1cb5a4e5a1df3b8f5c79e2a988221adf867:/utils/setup.php diff --git a/utils/setup.php b/utils/setup.php index b5d6767d..45b40fed 100755 --- a/utils/setup.php +++ b/utils/setup.php @@ -32,7 +32,6 @@ array('calculate-postcodes', '', 0, 1, 0, 0, 'bool', 'Calculate postcode centroids'), array('create-roads', '', 0, 1, 0, 0, 'bool', 'Calculate postcode centroids'), array('osmosis-init', '', 0, 1, 0, 0, 'bool', 'Generate default osmosis configuration'), - array('osmosis-init-date', '', 0, 1, 1, 1, 'string', 'Generate default osmosis configuration'), array('index', '', 0, 1, 0, 0, 'bool', 'Index the data'), array('index-noanalyse', '', 0, 1, 0, 0, 'bool', 'Do not perform analyse operations during index (EXPERT)'), array('index-output', '', 0, 1, 1, 1, 'string', 'File to dump index information to'), @@ -84,16 +83,6 @@ echo "WARNING: resetting cache memory to $iCacheMemory\n"; } - if (isset($aCMDResult['osm-file']) && !isset($aCMDResult['osmosis-init-date'])) - { - $sBaseFile = basename($aCMDResult['osm-file']); - if (preg_match('#^planet-([0-9]{2})([0-9]{2})([0-9]{2})[.]#', $sBaseFile, $aMatch)) - { - $iTime = mktime(0, 0, 0, $aMatch[2], $aMatch[3], '20'.$aMatch[1]); - $iTime -= (60*60*24); - $aCMDResult['osmosis-init-date'] = date('Y-m-d', $iTime).'T22:00:00Z'; - } - } $aDSNInfo = DB::parseDSN(CONST_Database_DSN); if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432; @@ -106,7 +95,7 @@ { fail('database already exists ('.CONST_Database_DSN.')'); } - passthru('createdb -E UTF-8 '.$aDSNInfo['database']); + passthruCheckReturn('createdb -E UTF-8 '.$aDSNInfo['database']); } if ($aCMDResult['setup-db'] || $aCMDResult['all']) @@ -116,14 +105,33 @@ // TODO: path detection, detection memory, etc. $oDB =& getDB(); + + $sVersionString = $oDB->getOne('select version()'); + preg_match('#PostgreSQL ([0-9]+)[.]([0-9]+)[.]([0-9]+) #', $sVersionString, $aMatches); + if (CONST_Postgresql_Version != $aMatches[1].'.'.$aMatches[2]) + { + echo "ERROR: PostgreSQL version is not correct. Expected ".CONST_Postgresql_Version." found ".$aMatches[1].'.'.$aMatches[2]."\n"; + exit; + } + passthru('createlang plpgsql '.$aDSNInfo['database']); $pgver = (float) CONST_Postgresql_Version; if ($pgver < 9.1) { pgsqlRunScriptFile(CONST_Path_Postgresql_Contrib.'/hstore.sql'); + pgsqlRunScriptFile(CONST_BasePath.'/sql/hstore_compatability_9_0.sql'); } else { pgsqlRunScript('CREATE EXTENSION hstore'); } + pgsqlRunScriptFile(CONST_Path_Postgresql_Postgis.'/postgis.sql'); + $sVersionString = $oDB->getOne('select postgis_full_version()'); + preg_match('#POSTGIS="([0-9]+)[.]([0-9]+)[.]([0-9]+)( r([0-9]+))?"#', $sVersionString, $aMatches); + if (CONST_Postgis_Version != $aMatches[1].'.'.$aMatches[2]) + { + echo "ERROR: PostGIS version is not correct. Expected ".CONST_Postgis_Version." found ".$aMatches[1].'.'.$aMatches[2]."\n"; + exit; + } + pgsqlRunScriptFile(CONST_Path_Postgresql_Postgis.'/spatial_ref_sys.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/country_name.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/country_naturalearthdata.sql'); @@ -342,7 +350,6 @@ echo '.'; } echo "\n"; - pgsqlRunScript('ALTER TABLE place SET TABLESPACE "data"'); echo "Reanalysing database...\n"; pgsqlRunScript('ANALYSE'); } @@ -453,13 +460,16 @@ if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection)); } - if (($aCMDResult['osmosis-init'] || $aCMDResult['all']) && isset($aCMDResult['osmosis-init-date'])) + if ($aCMDResult['osmosis-init'] || $aCMDResult['all']) { $bDidSomething = true; $oDB =& getDB(); if (!file_exists(CONST_Osmosis_Binary)) fail("please download osmosis"); - if (file_exists(CONST_BasePath.'/settings/configuration.txt')) echo "settings/configuration.txt already exists\n"; + if (file_exists(CONST_BasePath.'/settings/configuration.txt')) + { + echo "settings/configuration.txt already exists\n"; + } else { passthru(CONST_Osmosis_Binary.' --read-replication-interval-init '.CONST_BasePath.'/settings'); @@ -467,21 +477,59 @@ passthru("sed -i 's:minute-replicate:replication/minute:' ".CONST_BasePath.'/settings/configuration.txt'); } - $sDate = $aCMDResult['osmosis-init-date']; - $aDate = date_parse_from_format("Y-m-d\TH-i", $sDate); - $sURL = 'http://toolserver.org/~mazder/replicate-sequences/?'; - $sURL .= 'Y='.$aDate['year'].'&m='.$aDate['month'].'&d='.$aDate['day']; - $sURL .= '&H='.$aDate['hour'].'&i='.$aDate['minute'].'&s=0'; - $sURL .= '&stream=minute'; - echo "Getting state file: $sURL\n"; - $sStateFile = file_get_contents($sURL); + // Find the last node in the DB + $iLastOSMID = $oDB->getOne("select max(osm_id) as osm_id from place where osm_type = 'N'"); + + // Lookup the timestamp that node was created (less 3 hours for margin for changsets to be closed) + $sLastNodeURL = 'http://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID; + $sLastNodeXML = file_get_contents($sLastNodeURL); + 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); + $iLastNodeTimestamp = strtotime($aLastNodeDate[1]) - (3*60*60); + + + // Search for the correct state file - uses file timestamps + $sRepURL = 'http://planet.openstreetmap.org/replication/minute/'; + $sRep = file_get_contents($sRepURL); + preg_match_all('#([0-9]{3}/) *(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER); + $aPrevRepMatch = false; + foreach($aRepMatches as $aRepMatch) + { + if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break; + $aPrevRepMatch = $aRepMatch; + } + if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch; + + $sRepURL .= $aRepMatch[1]; + $sRep = file_get_contents($sRepURL); + preg_match_all('#([0-9]{3}/) *(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER); + $aPrevRepMatch = false; + foreach($aRepMatches as $aRepMatch) + { + if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break; + $aPrevRepMatch = $aRepMatch; + } + if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch; + + $sRepURL .= $aRepMatch[1]; + $sRep = file_get_contents($sRepURL); + preg_match_all('#([0-9]{3}).state.txt *(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER); + $aPrevRepMatch = false; + foreach($aRepMatches as $aRepMatch) + { + if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break; + $aPrevRepMatch = $aRepMatch; + } + if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch; + + $sRepURL .= $aRepMatch[1].'.state.txt'; + echo "Getting state file: $sRepURL\n"; + $sStateFile = file_get_contents($sRepURL); if (!$sStateFile || strlen($sStateFile) > 1000) fail("unable to obtain state file"); file_put_contents(CONST_BasePath.'/settings/state.txt', $sStateFile); echo "Updating DB status\n"; pg_query($oDB->connection, 'TRUNCATE import_status'); - $sSQL = "INSERT INTO import_status VALUES('".$sDate."')"; + $sSQL = "INSERT INTO import_status VALUES('".$aRepMatch[2]."')"; pg_query($oDB->connection, $sSQL); - } if ($aCMDResult['index'] || $aCMDResult['all']) @@ -539,8 +587,11 @@ @symlink(CONST_BasePath.'/website/reverse.php', $sTargetDir.'/reverse.php'); @symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/search.php'); @symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/index.php'); + @symlink(CONST_BasePath.'/website/deletable.php', $sTargetDir.'/deletable.php'); + @symlink(CONST_BasePath.'/website/polygons.php', $sTargetDir.'/polygons.php'); @symlink(CONST_BasePath.'/website/images', $sTargetDir.'/images'); @symlink(CONST_BasePath.'/website/js', $sTargetDir.'/js'); + @symlink(CONST_BasePath.'/website/css', $sTargetDir.'/css'); echo "Symlinks created\n"; }