X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/f17c5345ec0ec0b85347b6ccb1b50900d645b4b2..982de35051bed16cb57739c7b4acabe4c7f251ac:/utils/setup.php diff --git a/utils/setup.php b/utils/setup.php index 8254b6cc..fb83dd0a 100755 --- a/utils/setup.php +++ b/utils/setup.php @@ -20,17 +20,21 @@ array('import-data', '', 0, 1, 0, 0, 'bool', 'Import a osm file'), array('osm2pgsql-cache', '', 0, 1, 1, 1, 'int', 'Cache size used by osm2pgsql'), array('create-functions', '', 0, 1, 0, 0, 'bool', 'Create functions'), + array('enable-diff-updates', '', 0, 1, 0, 0, 'bool', 'Turn on the code required to make diff updates work'), + array('enable-debug-statements', '', 0, 1, 0, 0, 'bool', 'Include debug warning statements in pgsql commands'), array('create-minimal-tables', '', 0, 1, 0, 0, 'bool', 'Create minimal main tables'), array('create-tables', '', 0, 1, 0, 0, 'bool', 'Create main tables'), array('create-partitions', '', 0, 1, 0, 0, 'bool', 'Create required partition tables and triggers'), array('import-wikipedia-articles', '', 0, 1, 0, 0, 'bool', 'Import wikipedia article dump'), array('load-data', '', 0, 1, 0, 0, 'bool', 'Copy data to live tables from import table'), + array('disable-token-precalc', '', 0, 1, 0, 0, 'bool', 'Disable name precalculation (EXPERT)'), array('import-tiger-data', '', 0, 1, 0, 0, 'bool', 'Import tiger data (not included in \'all\')'), 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'), array('create-search-indices', '', 0, 1, 0, 0, 'bool', 'Create additional indices required for search and update'), array('create-website', '', 0, 1, 1, 1, 'realpath', 'Create symlinks to setup web directory'), @@ -39,7 +43,7 @@ $bDidSomething = false; - // This is a pretty hard core defult - the number of processors in the box - 1 + // This is a pretty hard core default - the number of processors in the box - 1 $iInstances = isset($aCMDResult['threads'])?$aCMDResult['threads']:(getProcessorCount()-1); if ($iInstances < 1) { @@ -117,11 +121,16 @@ $bDidSomething = true; $osm2pgsql = CONST_Osm2pgsql_Binary; - if (!file_exists($osm2pgsql)) fail("please download and build osm2pgsql"); + if (!file_exists($osm2pgsql)) + { + echo "Please download and build osm2pgsql.\nIf it is already installed, check the path in your local settings (settings/local.php) file.\n"; + fail("osm2pgsql not found in '$osm2pgsql'"); + } + $osm2pgsql .= ' --tablespace-slim-index ssd --tablespace-main-index ssd --tablespace-main-data ssd --tablespace-slim-data data'; $osm2pgsql .= ' -lsc -O gazetteer --hstore'; - $osm2pgsql .= ' -C '.$iCacheMemory; + $osm2pgsql .= ' -C 16000'; $osm2pgsql .= ' -d '.$aDSNInfo['database'].' '.$aCMDResult['osm-file']; - passthru($osm2pgsql); + passthruCheckReturn($osm2pgsql); $oDB =& getDB(); $x = $oDB->getRow('select * from place limit 1'); @@ -137,7 +146,9 @@ $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); + $sTemplate = str_replace('{modulepath}', CONST_BasePath.'/module', $sTemplate); + if ($aCMDResult['enable-diff-updates']) $sTemplate = str_replace('RETURN NEW; -- @DIFFUPDATES@', '--', $sTemplate); + if ($aCMDResult['enable-debug-statements']) $sTemplate = str_replace('--DEBUG:', '', $sTemplate); pgsqlRunScript($sTemplate); } @@ -264,13 +275,29 @@ if (!pg_query($oDB->connection, 'CREATE SEQUENCE seq_place start 100000')) fail(pg_last_error($oDB->connection)); echo '.'; + $sSQL = 'select partition from country_name order by country_code'; + $aPartitions = $oDB->getCol($sSQL); + if (PEAR::isError($aPartitions)) + { + fail($aPartitions->getMessage()); + } + $aPartitions[] = 0; + foreach($aPartitions as $sPartition) + { + if (!pg_query($oDB->connection, 'TRUNCATE location_road_'.$sPartition)) fail(pg_last_error($oDB->connection)); + echo '.'; + } + // pre-create the word list - if (!pg_query($oDB->connection, 'select count(make_keywords(v)) from (select distinct svals(name) as v from place) as w where v is not null;')) fail(pg_last_error($oDB->connection)); - echo '.'; - if (!pg_query($oDB->connection, 'select count(make_keywords(v)) from (select distinct postcode as v from place) as w where v is not null;')) fail(pg_last_error($oDB->connection)); - echo '.'; - if (!pg_query($oDB->connection, 'select count(getorcreate_housenumber_id(v)) from (select distinct housenumber as v from place where housenumber is not null) as w;')) fail(pg_last_error($oDB->connection)); - echo '.'; + if (!$aCMDResult['disable-token-precalc']) + { + if (!pg_query($oDB->connection, 'select count(make_keywords(v)) from (select distinct svals(name) as v from place) as w where v is not null;')) fail(pg_last_error($oDB->connection)); + echo '.'; + if (!pg_query($oDB->connection, 'select count(make_keywords(v)) from (select distinct postcode as v from place) as w where v is not null;')) fail(pg_last_error($oDB->connection)); + echo '.'; + if (!pg_query($oDB->connection, 'select count(getorcreate_housenumber_id(v)) from (select distinct housenumber as v from place where housenumber is not null) as w;')) fail(pg_last_error($oDB->connection)); + echo '.'; + } $aDBInstances = array(); for($i = 0; $i < $iInstances; $i++) @@ -294,6 +321,7 @@ echo '.'; } echo "\n"; + pgsqlRunScript('ALTER TABLE place SET TABLESPACE "data"'); echo "Reanalysing database...\n"; pgsqlRunScript('ANALYSE'); } @@ -331,6 +359,8 @@ { $bDidSomething = true; + pgsqlRunScriptFile(CONST_BasePath.'/sql/tiger_import_start.sql'); + $aDBInstances = array(); for($i = 0; $i < $iInstances; $i++) { @@ -379,6 +409,9 @@ } echo "\n"; } + + echo "Creating indexes\n"; + pgsqlRunScriptFile(CONST_BasePath.'/sql/tiger_import_finish.sql'); } if ($aCMDResult['calculate-postcodes'] || $aCMDResult['all']) @@ -431,7 +464,11 @@ $sOutputFile = ''; if (isset($aCMDResult['index-output'])) $sOutputFile = ' -F '.$aCMDResult['index-output']; $sBaseCmd = CONST_BasePath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -t '.$iInstances.$sOutputFile; - passthru($sBaseCmd); + 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']) @@ -466,7 +503,12 @@ { $bDidSomething = true; $sTargetDir = $aCMDResult['create-website']; - if (!is_dir($sTargetDir)) fail('please specify a directory to setup'); + if (!is_dir($sTargetDir)) + { + echo "You must create the website directory before calling this function.\n"; + fail("Target directory does not exist."); + } + @symlink(CONST_BasePath.'/website/details.php', $sTargetDir.'/details.php'); @symlink(CONST_BasePath.'/website/reverse.php', $sTargetDir.'/reverse.php'); @symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/search.php'); @@ -485,7 +527,7 @@ { if (!file_exists($sFilename)) fail('unable to find '.$sFilename); - // Convert database DSN to psql paramaters + // Convert database DSN to psql parameters $aDSNInfo = DB::parseDSN(CONST_Database_DSN); if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432; $sCMD = 'psql -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'].' -f '.$sFilename; @@ -513,7 +555,7 @@ function pgsqlRunScript($sScript) { - // Convert database DSN to psql paramaters + // Convert database DSN to psql parameters $aDSNInfo = DB::parseDSN(CONST_Database_DSN); if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432; $sCMD = 'psql -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database']; @@ -537,7 +579,7 @@ function pgsqlRunRestoreData($sDumpFile) { - // Convert database DSN to psql paramaters + // Convert database DSN to psql parameters $aDSNInfo = DB::parseDSN(CONST_Database_DSN); if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432; $sCMD = 'pg_restore -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'].' -Fc -a '.$sDumpFile; @@ -565,7 +607,7 @@ function pgsqlRunDropAndRestore($sDumpFile) { - // Convert database DSN to psql paramaters + // Convert database DSN to psql parameters $aDSNInfo = DB::parseDSN(CONST_Database_DSN); if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432; $sCMD = 'pg_restore -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'].' -Fc --clean '.$sDumpFile; @@ -590,3 +632,10 @@ proc_close($hProcess); } + + function passthruCheckReturn($cmd) + { + $result = -1; + passthru($cmd, $result); + if ($result != 0) fail('Error executing external command: '.$cmd); + }