#!/usr/bin/php -Cq getProcessorCount()) { $iInstances = getProcessorCount(); echo "WARNING: resetting threads to $iInstances\n"; } if ($aCMDResult['create-db'] || $aCMDResult['all']) { $bDidSomething = true; $oDB =& DB::connect(CONST_Database_DSN, false); if (!PEAR::isError($oDB)) { fail('database already exists'); } passthru('createdb nominatim'); } if ($aCMDResult['create-db'] || $aCMDResult['all']) { $bDidSomething = true; // TODO: path detection, detection memory, etc. $oDB =& getDB(); passthru('createlang plpgsql nominatim'); pgsqlRunScriptFile(CONST_Path_Postgresql_Contrib.'/_int.sql'); pgsqlRunScriptFile(CONST_Path_Postgresql_Contrib.'/hstore.sql'); pgsqlRunScriptFile(CONST_Path_Postgresql_Postgis.'/postgis.sql'); pgsqlRunScriptFile(CONST_Path_Postgresql_Postgis.'/spatial_ref_sys.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/country_name.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/country_naturaleathdata.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/country_osm_grid.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/gb_postcode.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/us_statecounty.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/us_state.sql'); pgsqlRunScriptFile(CONST_BasePath.'/data/worldboundaries.sql'); } if ($aCMDResult['import-data'] || $aCMDResult['all']) { $bDidSomething = true; passthru(CONST_BasePath.'/osm2pgsql/osm2pgsql -lsc -O gazetteer -C 10000 --hstore -d nominatim '.$aCMDResult['osm-file']); } if ($aCMDResult['create-functions'] || $aCMDResult['all']) { $bDidSomething = true; if (!file_exists(CONST_BasePath.'/module/nominatim.so')) fail("nominatim module not built"); $sTemplate = file_get_contents(CONST_BasePath.'/sql/functions.sql'); $sTemplate = str_replace('{modulepath}',CONST_BasePath.'/module', $sTemplate); pgsqlRunScript($sTemplate); } if ($aCMDResult['create-tables'] || $aCMDResult['all']) { $bDidSomething = true; pgsqlRunScriptFile(CONST_BasePath.'/sql/tables.sql'); // re-run the functions $sTemplate = file_get_contents(CONST_BasePath.'/sql/functions.sql'); $sTemplate = str_replace('{modulepath}',CONST_BasePath.'/module', $sTemplate); pgsqlRunScript($sTemplate); } if ($aCMDResult['create-partitions'] || $aCMDResult['all']) { $bDidSomething = true; $oDB =& getDB(); $sSQL = 'select partition from country_name order by country_code'; $aPartitions = $oDB->getCol($sSQL); if (PEAR::isError($aPartitions)) { fail($aPartitions->getMessage()); } $aPartitions[] = 0; $sTemplate = file_get_contents(CONST_BasePath.'/sql/partitions.src.sql'); preg_match_all('#^-- start(.*?)^-- end#ms', $sTemplate, $aMatches, PREG_SET_ORDER); foreach($aMatches as $aMatch) { $sResult = ''; foreach($aPartitions as $sPartitionName) { $sResult .= str_replace('-partition-', $sPartitionName, $aMatch[1]); } $sTemplate = str_replace($aMatch[0], $sResult, $sTemplate); } pgsqlRunScript($sTemplate); } if ($aCMDResult['load-data'] || $aCMDResult['all']) { $bDidSomething = true; $oDB =& getDB(); if (!pg_query($oDB->connection, 'TRUNCATE word')) fail(pg_last_error($oDB->connection)); echo '.'; if (!pg_query($oDB->connection, 'TRUNCATE placex')) fail(pg_last_error($oDB->connection)); echo '.'; if (!pg_query($oDB->connection, 'TRUNCATE place_addressline')) fail(pg_last_error($oDB->connection)); echo '.'; if (!pg_query($oDB->connection, 'TRUNCATE place_boundingbox')) fail(pg_last_error($oDB->connection)); echo '.'; if (!pg_query($oDB->connection, 'TRUNCATE location_area')) fail(pg_last_error($oDB->connection)); echo '.'; if (!pg_query($oDB->connection, 'TRUNCATE search_name')) fail(pg_last_error($oDB->connection)); echo '.'; if (!pg_query($oDB->connection, 'TRUNCATE search_name_blank')) fail(pg_last_error($oDB->connection)); echo '.'; if (!pg_query($oDB->connection, 'DROP SEQUENCE seq_place')) fail(pg_last_error($oDB->connection)); echo '.'; if (!pg_query($oDB->connection, 'CREATE SEQUENCE seq_place start 100000')) fail(pg_last_error($oDB->connection)); echo '.'; $aDBInstances = array(); for($i = 0; $i < $iInstances; $i++) { $aDBInstances[$i] =& getDB(true); $sSQL = 'insert into placex (osm_type, osm_id, class, type, name, admin_level, '; $sSQL .= 'housenumber, street, isin, postcode, country_code, extratags, '; $sSQL .= 'geometry) select * from place where osm_id % '.$iInstances.' = '.$i; if ($aCMDResult['verbose']) echo "$sSQL\n"; if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection)); } $bAnyBusy = true; while($bAnyBusy) { $bAnyBusy = false; for($i = 0; $i < $iInstances; $i++) { if (pg_connection_busy($aDBInstances[$i]->connection)) $bAnyBusy = true; } sleep(1); echo '.'; } echo "\n"; } if ($aCMDResult['import-tiger-data'] || $aCMDResult['all']) { $bDidSomething = true; $aDBInstances = array(); for($i = 0; $i < $iInstances; $i++) { $aDBInstances[$i] =& getDB(true); } foreach(glob(CONST_BasePath.'/data/tiger2009/*.sql') as $sFile) { echo $sFile.': '; $hFile = fopen($sFile, "r"); $sSQL = fgets($hFile, 100000); $iLines = 0; while(true) { for($i = 0; $i < $iInstances; $i++) { if (!pg_connection_busy($aDBInstances[$i]->connection)) { while(pg_get_result($aDBInstances[$i]->connection)); $sSQL = fgets($hFile, 100000); if (!$sSQL) break 2; if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection)); $iLines++; if ($iLines == 1000) { echo "."; $iLines = 0; } } } usleep(10); } fclose($hFile); $bAnyBusy = true; while($bAnyBusy) { $bAnyBusy = false; for($i = 0; $i < $iInstances; $i++) { if (pg_connection_busy($aDBInstances[$i]->connection)) $bAnyBusy = true; } usleep(10); } echo "\n"; } } if (!$bDidSomething) { showUsage($aCMDOptions, true); } function pgsqlRunScriptFile($sFilename) { if (!file_exists($sFilename)) fail('unable to find '.$sFilename); // Convert database DSN to psql paramaters $aDSNInfo = DB::parseDSN(CONST_Database_DSN); $sCMD = 'psql -f '.$sFilename.' '.$aDSNInfo['database']; $aDescriptors = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('file', '/dev/null', 'a') ); $ahPipes = null; $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes); if (!is_resource($hProcess)) fail('unable to start pgsql'); fclose($ahPipes[0]); // TODO: error checking while(!feof($ahPipes[1])) { echo fread($ahPipes[1], 4096); } fclose($ahPipes[1]); proc_close($hProcess); } function pgsqlRunScript($sScript) { // Convert database DSN to psql paramaters $aDSNInfo = DB::parseDSN(CONST_Database_DSN); $sCMD = 'psql '.$aDSNInfo['database']; $aDescriptors = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('file', '/dev/null', 'a') ); $ahPipes = null; $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes); if (!is_resource($hProcess)) fail('unable to start pgsql'); fwrite($ahPipes[0], $sScript); fclose($ahPipes[0]); // TODO: error checking while(!feof($ahPipes[1])) { echo fread($ahPipes[1], 4096); } fclose($ahPipes[1]); proc_close($hProcess); }