+
+ echo "Creating indexes\n";
+ $sTemplate = file_get_contents(CONST_BasePath.'/sql/tiger_import_finish.sql');
+ $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
+ $sTemplate = replace_tablespace('{ts:aux-data}',
+ CONST_Tablespace_Aux_Data, $sTemplate);
+ $sTemplate = replace_tablespace('{ts:aux-index}',
+ CONST_Tablespace_Aux_Index, $sTemplate);
+ pgsqlRunScript($sTemplate, false);
+ }
+
+ if ($aCMDResult['calculate-postcodes'] || $aCMDResult['all'])
+ {
+ $bDidSomething = true;
+ $oDB =& getDB();
+ if (!pg_query($oDB->connection, 'DELETE from placex where osm_type=\'P\'')) fail(pg_last_error($oDB->connection));
+ $sSQL = "insert into placex (osm_type,osm_id,class,type,postcode,calculated_country_code,geometry) ";
+ $sSQL .= "select 'P',nextval('seq_postcodes'),'place','postcode',postcode,calculated_country_code,";
+ $sSQL .= "ST_SetSRID(ST_Point(x,y),4326) as geometry from (select calculated_country_code,postcode,";
+ $sSQL .= "avg(st_x(st_centroid(geometry))) as x,avg(st_y(st_centroid(geometry))) as y ";
+ $sSQL .= "from placex where postcode is not null group by calculated_country_code,postcode) as x";
+ if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection));
+
+ if (CONST_Use_Extra_US_Postcodes)
+ {
+ $sSQL = "insert into placex (osm_type,osm_id,class,type,postcode,calculated_country_code,geometry) ";
+ $sSQL .= "select 'P',nextval('seq_postcodes'),'place','postcode',postcode,'us',";
+ $sSQL .= "ST_SetSRID(ST_Point(x,y),4326) as geometry from us_postcode";
+ if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection));
+ }
+ }
+
+ if ($aCMDResult['osmosis-init'] || ($aCMDResult['all'] && !$aCMDResult['drop'])) // no use doing osmosis-init when dropping update tables
+ {
+ $bDidSomething = true;
+ $oDB =& getDB();
+
+ if (!file_exists(CONST_Osmosis_Binary))
+ {
+ echo "Please download osmosis.\nIf it is already installed, check the path in your local settings (settings/local.php) file.\n";
+ if (!$aCMDResult['all'])
+ {
+ fail("osmosis not found in '".CONST_Osmosis_Binary."'");
+ }
+ }
+ else
+ {
+ if (file_exists(CONST_InstallPath.'/settings/configuration.txt'))
+ {
+ echo "settings/configuration.txt already exists\n";
+ }
+ else
+ {
+ passthru(CONST_Osmosis_Binary.' --read-replication-interval-init '.CONST_InstallPath.'/settings');
+ // update osmosis configuration.txt with our settings
+ passthru("sed -i 's!baseUrl=.*!baseUrl=".CONST_Replication_Url."!' ".CONST_InstallPath.'/settings/configuration.txt');
+ passthru("sed -i 's:maxInterval = .*:maxInterval = ".CONST_Replication_MaxInterval.":' ".CONST_InstallPath.'/settings/configuration.txt');
+ }
+
+ // Find the last node in the DB
+ $iLastOSMID = $oDB->getOne("select max(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."/1";
+ $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 so need to sort by date descending
+ $sRepURL = CONST_Replication_Url."/";
+ $sRep = file_get_contents($sRepURL."?C=M;O=D;F=1");
+ // download.geofabrik.de: <a href="000/">000/</a></td><td align="right">26-Feb-2013 11:53 </td>
+ // planet.openstreetmap.org: <a href="273/">273/</a> 2013-03-11 07:41 -
+ preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>\s*([-0-9a-zA-Z]+ [0-9]{2}:[0-9]{2})#', $sRep, $aRepMatches, PREG_SET_ORDER);
+ if ($aRepMatches)
+ {
+ $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."?C=M;O=D;F=1");
+ preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>\s*([-0-9a-zA-Z]+ [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."?C=M;O=D;F=1");
+ preg_match_all('#<a href="[0-9]{3}.state.txt">([0-9]{3}).state.txt</a>\s*([-0-9a-zA-Z]+ [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_InstallPath.'/settings/state.txt', $sStateFile);
+ echo "Updating DB status\n";
+ pg_query($oDB->connection, 'TRUNCATE import_status');
+ $sSQL = "INSERT INTO import_status VALUES('".$aRepMatch[2]."')";
+ pg_query($oDB->connection, $sSQL);
+ }
+ else
+ {
+ if (!$aCMDResult['all'])
+ {
+ fail("Cannot read state file directory.");
+ }
+ }
+ }
+ }
+
+ if ($aCMDResult['index'] || $aCMDResult['all'])
+ {
+ $bDidSomething = true;
+ $sOutputFile = '';
+ $sBaseCmd = CONST_InstallPath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'].' -t '.$iInstances.$sOutputFile;
+ passthruCheckReturn($sBaseCmd.' -R 4');
+ if (!$aCMDResult['index-noanalyse']) pgsqlRunScript('ANALYSE');
+ passthruCheckReturn($sBaseCmd.' -r 5 -R 25');
+ if (!$aCMDResult['index-noanalyse']) pgsqlRunScript('ANALYSE');
+ passthruCheckReturn($sBaseCmd.' -r 26');
+ }
+
+ if ($aCMDResult['create-search-indices'] || $aCMDResult['all'])
+ {
+ echo "Search indices\n";
+ $bDidSomething = true;
+
+ $sTemplate = file_get_contents(CONST_BasePath.'/sql/indices.src.sql');
+ $sTemplate = replace_tablespace('{ts:address-index}',
+ CONST_Tablespace_Address_Index, $sTemplate);
+ $sTemplate = replace_tablespace('{ts:search-index}',
+ CONST_Tablespace_Search_Index, $sTemplate);
+ $sTemplate = replace_tablespace('{ts:aux-index}',
+ CONST_Tablespace_Aux_Index, $sTemplate);
+
+ pgsqlRunScript($sTemplate);
+ }
+
+ if ($aCMDResult['drop'])
+ {
+ // The implementation is potentially a bit dangerous because it uses
+ // a positive selection of tables to keep, and deletes everything else.
+ // Including any tables that the unsuspecting user might have manually
+ // created. USE AT YOUR OWN PERIL.
+ $bDidSomething = true;
+
+ // tables we want to keep. everything else goes.
+ $aKeepTables = array(
+ "*columns",
+ "import_polygon_*",
+ "import_status",
+ "place_addressline",
+ "location_property*",
+ "placex",
+ "search_name",
+ "seq_*",
+ "word",
+ "query_log",
+ "new_query_log",
+ "gb_postcode",
+ "spatial_ref_sys",
+ "country_name",
+ "place_classtype_*"
+ );
+
+ $oDB =& getDB();
+ $aDropTables = array();
+ $aHaveTables = chksql($oDB->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'"));
+
+ foreach($aHaveTables as $sTable)
+ {
+ $bFound = false;
+ foreach ($aKeepTables as $sKeep)
+ {
+ if (fnmatch($sKeep, $sTable))
+ {
+ $bFound = true;
+ break;
+ }
+ }
+ if (!$bFound) array_push($aDropTables, $sTable);
+ }
+
+ foreach ($aDropTables as $sDrop)
+ {
+ if ($aCMDResult['verbose']) echo "dropping table $sDrop\n";
+ @pg_query($oDB->connection, "DROP TABLE $sDrop CASCADE");
+ // ignore warnings/errors as they might be caused by a table having
+ // been deleted already by CASCADE
+ }
+
+ if (!is_null(CONST_Osm2pgsql_Flatnode_File))
+ {
+ if ($aCMDResult['verbose']) echo "deleting ".CONST_Osm2pgsql_Flatnode_File."\n";
+ unlink(CONST_Osm2pgsql_Flatnode_File);
+ }