X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/06d89e1d470c2b95dee7925dca25643a6afc9882..7dfe645b5f2fcfc320264baad73f52c8003e857f:/lib/setup/SetupClass.php diff --git a/lib/setup/SetupClass.php b/lib/setup/SetupClass.php index 850ff297..4e9daaf8 100755 --- a/lib/setup/SetupClass.php +++ b/lib/setup/SetupClass.php @@ -2,14 +2,12 @@ namespace Nominatim\Setup; -require_once(CONST_LibDir.'/setup/AddressLevelParser.php'); require_once(CONST_LibDir.'/Shell.php'); class SetupFunctions { protected $iCacheMemory; protected $iInstances; - protected $sModulePath; protected $aDSNInfo; protected $bQuiet; protected $bVerbose; @@ -19,6 +17,7 @@ class SetupFunctions protected $bNoPartitions; protected $bDrop; protected $oDB = null; + protected $oNominatimCmd; public function __construct(array $aCMDResult) { @@ -42,9 +41,6 @@ class SetupFunctions $this->iCacheMemory = getCacheMemoryMB(); } - $this->sModulePath = getSetting('DATABASE_MODULE_PATH', CONST_InstallDir.'/module'); - info('module path: ' . $this->sModulePath); - // parse database string $this->aDSNInfo = \Nominatim\DB::parseDSN(getSetting('DATABASE_DSN')); if (!isset($this->aDSNInfo['port'])) { @@ -78,6 +74,14 @@ class SetupFunctions } $this->bDrop = isset($aCMDResult['drop']) && $aCMDResult['drop']; + + $this->oNominatimCmd = new \Nominatim\Shell(getSetting('NOMINATIM_TOOL')); + if ($this->bQuiet) { + $this->oNominatimCmd->addParams('--quiet'); + } + if ($this->bVerbose) { + $this->oNominatimCmd->addParams('--verbose'); + } } public function createDB() @@ -138,6 +142,27 @@ class SetupFunctions exit(1); } + if (!getSetting('DATABASE_MODULE_PATH')) { + // If no custom module path is set then copy the module into the + // project directory, but only if it is not the same file already + // (aka we are running from the build dir). + $sDest = CONST_InstallDir.'/module'; + if ($sDest != CONST_Default_ModulePath) { + if (!file_exists($sDest)) { + mkdir($sDest); + } + if (!copy(CONST_Default_ModulePath.'/nominatim.so', $sDest.'/nominatim.so')) { + echo "Failed to copy database module to $sDest."; + exit(1); + } + chmod($sDest.'/nominatim.so', 0755); + info("Database module installed at $sDest."); + } else { + info('Running from build directory. Leaving database module as is.'); + } + } else { + info('Using database module from DATABASE_MODULE_PATH ('.getSetting('DATABASE_MODULE_PATH').').'); + } // Try accessing the C module, so we know early if something is wrong $this->checkModulePresence(); // raises exception on failure @@ -148,22 +173,6 @@ class SetupFunctions } $this->pgsqlRunScriptFile(CONST_DataDir.'/data/country_name.sql'); $this->pgsqlRunScriptFile(CONST_DataDir.'/data/country_osm_grid.sql.gz'); - $this->pgsqlRunScriptFile(CONST_DataDir.'/data/gb_postcode_table.sql'); - $this->pgsqlRunScriptFile(CONST_DataDir.'/data/us_postcode_table.sql'); - - $sPostcodeFilename = CONST_DataDir.'/data/gb_postcode_data.sql.gz'; - if (file_exists($sPostcodeFilename)) { - $this->pgsqlRunScriptFile($sPostcodeFilename); - } else { - warn('optional external GB postcode table file ('.$sPostcodeFilename.') not found. Skipping.'); - } - - $sPostcodeFilename = CONST_DataDir.'/data/us_postcode_data.sql.gz'; - if (file_exists($sPostcodeFilename)) { - $this->pgsqlRunScriptFile($sPostcodeFilename); - } else { - warn('optional external US postcode table file ('.$sPostcodeFilename.') not found. Skipping.'); - } if ($this->bNoPartitions) { $this->pgsqlRunScript('update country_name set partition = 0'); @@ -253,8 +262,7 @@ class SetupFunctions $this->dropTable('search_name'); } - $oAlParser = new AddressLevelParser(getSettingConfig('ADDRESS_LEVEL_CONFIG', 'address-levels.json')); - $oAlParser->createTable($this->db(), 'address_levels'); + (clone($this->oNominatimCmd))->addParams('refresh', '--address-levels')->run(); } public function createTableTriggers() @@ -280,14 +288,12 @@ class SetupFunctions public function createPartitionFunctions() { info('Create Partition Functions'); - - $sTemplate = file_get_contents(CONST_DataDir.'/sql/partition-functions.src.sql'); - $this->pgsqlRunPartitionScript($sTemplate); + $this->createSqlFunctions(); // also create partition functions } public function importWikipediaArticles() { - $sWikiArticlePath = getSetting('WIKIPEDIA_DATA_PATH', CONST_DataDir.'/data'); + $sWikiArticlePath = getSetting('WIKIPEDIA_DATA_PATH', CONST_InstallDir); $sWikiArticlesFile = $sWikiArticlePath.'/wikimedia-importance.sql.gz'; if (file_exists($sWikiArticlesFile)) { info('Importing wikipedia articles and redirects'); @@ -499,6 +505,23 @@ class SetupFunctions public function calculatePostcodes($bCMDResultAll) { info('Calculate Postcodes'); + $this->pgsqlRunScriptFile(CONST_DataDir.'/sql/postcode_tables.sql'); + + $sPostcodeFilename = CONST_InstallDir.'/gb_postcode_data.sql.gz'; + if (file_exists($sPostcodeFilename)) { + $this->pgsqlRunScriptFile($sPostcodeFilename); + } else { + warn('optional external GB postcode table file ('.$sPostcodeFilename.') not found. Skipping.'); + } + + $sPostcodeFilename = CONST_InstallDir.'/us_postcode_data.sql.gz'; + if (file_exists($sPostcodeFilename)) { + $this->pgsqlRunScriptFile($sPostcodeFilename); + } else { + warn('optional external US postcode table file ('.$sPostcodeFilename.') not found. Skipping.'); + } + + $this->db()->exec('TRUNCATE location_postcode'); $sSQL = 'INSERT INTO location_postcode'; @@ -546,30 +569,10 @@ class SetupFunctions { $this->checkModulePresence(); // raises exception on failure - $oBaseCmd = (new \Nominatim\Shell(CONST_DataDir.'/nominatim/nominatim.py')) - ->addParams('--database', $this->aDSNInfo['database']) - ->addParams('--port', $this->aDSNInfo['port']) - ->addParams('--threads', $this->iInstances); - - if (!$this->bQuiet) { - $oBaseCmd->addParams('-v'); - } - if ($this->bVerbose) { - $oBaseCmd->addParams('-v'); - } - if (isset($this->aDSNInfo['hostspec'])) { - $oBaseCmd->addParams('--host', $this->aDSNInfo['hostspec']); - } - if (isset($this->aDSNInfo['username'])) { - $oBaseCmd->addParams('--user', $this->aDSNInfo['username']); - } - if (isset($this->aDSNInfo['password'])) { - $oBaseCmd->addEnvPair('PGPASSWORD', $this->aDSNInfo['password']); - } + $oBaseCmd = (clone $this->oNominatimCmd)->addParams('index'); info('Index ranks 0 - 4'); $oCmd = (clone $oBaseCmd)->addParams('--maxrank', 4); - echo $oCmd->escapedCmd(); $iStatus = $oCmd->run(); if ($iStatus != 0) { @@ -578,14 +581,14 @@ class SetupFunctions if (!$bIndexNoanalyse) $this->pgsqlRunScript('ANALYSE'); info('Index administrative boundaries'); - $oCmd = (clone $oBaseCmd)->addParams('-b'); + $oCmd = (clone $oBaseCmd)->addParams('--boundaries-only'); $iStatus = $oCmd->run(); if ($iStatus != 0) { fail('error status ' . $iStatus . ' running nominatim!'); } info('Index ranks 5 - 25'); - $oCmd = (clone $oBaseCmd)->addParams('--minrank', 5, '--maxrank', 25); + $oCmd = (clone $oBaseCmd)->addParams('--no-boundaries', '--minrank', 5, '--maxrank', 25); $iStatus = $oCmd->run(); if ($iStatus != 0) { fail('error status ' . $iStatus . ' running nominatim!'); @@ -594,7 +597,7 @@ class SetupFunctions if (!$bIndexNoanalyse) $this->pgsqlRunScript('ANALYSE'); info('Index ranks 26 - 30'); - $oCmd = (clone $oBaseCmd)->addParams('--minrank', 26); + $oCmd = (clone $oBaseCmd)->addParams('--no-boundaries', '--minrank', 26); $iStatus = $oCmd->run(); if ($iStatus != 0) { fail('error status ' . $iStatus . ' running nominatim!'); @@ -706,31 +709,57 @@ class SetupFunctions } /** - * Setup settings-frontend.php in the build/website directory + * Setup the directory for the API scripts. * * @return null */ public function setupWebsite() { - $rOutputFile = fopen(CONST_InstallDir.'/settings/settings-frontend.php', 'w'); - - fwrite($rOutputFile, "db()->tableExists('place')) { - $sTemplate .= file_get_contents($sBasePath.'place_triggers.sql'); - } - if ($this->db()->tableExists('placex')) { - $sTemplate .= file_get_contents($sBasePath.'placex_triggers.sql'); - } - if ($this->db()->tableExists('location_postcode')) { - $sTemplate .= file_get_contents($sBasePath.'postcode_triggers.sql'); - } - $sTemplate = str_replace('{modulepath}', $this->sModulePath, $sTemplate); - if ($this->bEnableDiffUpdates) { - $sTemplate = str_replace('RETURN NEW; -- %DIFFUPDATES%', '--', $sTemplate); + $oCmd = (clone($this->oNominatimCmd)) + ->addParams('refresh', '--functions'); + + if (!$this->bEnableDiffUpdates) { + $oCmd->addParams('--no-diff-updates'); } + if ($this->bEnableDebugStatements) { - $sTemplate = str_replace('--DEBUG:', '', $sTemplate); - } - if (getSettingBool('LIMIT_REINDEXING')) { - $sTemplate = str_replace('--LIMIT INDEXING:', '', $sTemplate); - } - if (!getSettingBool('USE_US_TIGER_DATA')) { - $sTemplate = str_replace('-- %NOTIGERDATA% ', '', $sTemplate); - } - if (!getSettingBool('USE_AUX_LOCATION_DATA')) { - $sTemplate = str_replace('-- %NOAUXDATA% ', '', $sTemplate); + $oCmd->addParams('--enable-debug-statements'); } - $sReverseOnly = $this->dbReverseOnly() ? 'true' : 'false'; - $sTemplate = str_replace('%REVERSE-ONLY%', $sReverseOnly, $sTemplate); - - $this->pgsqlRunScript($sTemplate); + $oCmd->run(); } private function pgsqlRunPartitionScript($sTemplate) @@ -944,12 +948,13 @@ class SetupFunctions */ private function checkModulePresence() { + $sModulePath = getSetting('DATABASE_MODULE_PATH', CONST_InstallDir.'/module'); $sSQL = "CREATE FUNCTION nominatim_test_import_func(text) RETURNS text AS '"; - $sSQL .= $this->sModulePath . "/nominatim.so', 'transliteration' LANGUAGE c IMMUTABLE STRICT"; + $sSQL .= $sModulePath . "/nominatim.so', 'transliteration' LANGUAGE c IMMUTABLE STRICT"; $sSQL .= ';DROP FUNCTION nominatim_test_import_func(text);'; $oDB = new \Nominatim\DB(); $oDB->connect(); - $oDB->exec($sSQL, null, 'Database server failed to load '.$this->sModulePath.'/nominatim.so module'); + $oDB->exec($sSQL, null, 'Database server failed to load '.$sModulePath.'/nominatim.so module'); } }