From: Sarah Hoffmann Date: Tue, 20 Nov 2018 22:07:55 +0000 (+0100) Subject: Merge pull request #1238 from lonvia/simplify-version-check X-Git-Tag: v3.3.0~65 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/7fd40cb0e66919bbdd18715e92507a8a49be3e39?hp=9cf85f90fb822a54bc7b33d91a67bdbf0397c487 Merge pull request #1238 from lonvia/simplify-version-check Simplify parsing of postgres and postgis versions --- diff --git a/lib/Result.php b/lib/Result.php index 5c39f473..a67c2fe4 100644 --- a/lib/Result.php +++ b/lib/Result.php @@ -72,7 +72,7 @@ class Result /** * Split a result array into highest ranked result and the rest * - * @param object[] $aResults List of results to split. + * @param object[] $aResults List of results to split. * * @return array[] */ diff --git a/lib/setup/SetupClass.php b/lib/setup/SetupClass.php index 4c7c0fdd..5191d87c 100755 --- a/lib/setup/SetupClass.php +++ b/lib/setup/SetupClass.php @@ -4,17 +4,16 @@ namespace Nominatim\Setup; class SetupFunctions { - protected $iCacheMemory; // set in constructor - protected $iInstances; // set in constructor - protected $sModulePath; // set in constructor - protected $aDSNInfo; // set in constructor = DB::parseDSN(CONST_Database_DSN); - protected $sVerbose; // set in constructor - protected $sIgnoreErrors; // set in constructor - protected $bEnableDiffUpdates; // set in constructor - protected $bEnableDebugStatements; // set in constructor - protected $bNoPartitions; // set in constructor - protected $oDB = null; // set in setupDB (earliest) or later in loadData, importData, drop, createSqlFunctions, importTigerData - // pgsqlRunPartitionScript, calculatePostcodes, ..if no already set + protected $iCacheMemory; + protected $iInstances; + protected $sModulePath; + protected $aDSNInfo; + protected $sVerbose; + protected $sIgnoreErrors; + protected $bEnableDiffUpdates; + protected $bEnableDebugStatements; + protected $bNoPartitions; + protected $oDB = null; public function __construct(array $aCMDResult) { @@ -38,9 +37,11 @@ class SetupFunctions $this->sModulePath = CONST_Database_Module_Path; info('module path: ' . $this->sModulePath); - // prepares DB for import or update, sets the Data Source Name - $this->aDSNInfo = \DB::parseDSN(CONST_Database_DSN); - if (!isset($this->aDSNInfo['port']) || !$this->aDSNInfo['port']) $this->aDSNInfo['port'] = 5432; + // parse database string + $this->aDSNInfo = array_filter(\DB::parseDSN(CONST_Database_DSN)); + if (!isset($this->aDSNInfo['port'])) { + $this->aDSNInfo['port'] = 5432; + } // setting member variables based on command line options stored in $aCMDResult $this->sVerbose = $aCMDResult['verbose']; @@ -77,27 +78,26 @@ class SetupFunctions } $sCreateDBCmd = 'createdb -E UTF-8 -p '.$this->aDSNInfo['port'].' '.$this->aDSNInfo['database']; - if (isset($this->aDSNInfo['username']) && $this->aDSNInfo['username']) { + if (isset($this->aDSNInfo['username'])) { $sCreateDBCmd .= ' -U '.$this->aDSNInfo['username']; } - if (isset($this->aDSNInfo['hostspec']) && $this->aDSNInfo['hostspec']) { + if (isset($this->aDSNInfo['hostspec'])) { $sCreateDBCmd .= ' -h '.$this->aDSNInfo['hostspec']; } - $aProcEnv = null; - if (isset($this->aDSNInfo['password']) && $this->aDSNInfo['password']) { - $aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV); - } - - $result = runWithEnv($sCreateDBCmd, $aProcEnv); + $result = $this->runWithPgEnv($sCreateDBCmd); if ($result != 0) fail('Error executing external command: '.$sCreateDBCmd); } + public function connect($sDatabaseDSN) + { + $this->oDB =& getDB(); + } + public function setupDB() { info('Setup DB'); - $this->oDB =& getDB(); $fPostgresVersion = getPostgresVersion($this->oDB); echo 'Postgres version found: '.$fPostgresVersion."\n"; @@ -203,19 +203,16 @@ class SetupFunctions $osm2pgsql .= ' -lsc -O gazetteer --hstore --number-processes 1'; $osm2pgsql .= ' -C '.$this->iCacheMemory; $osm2pgsql .= ' -P '.$this->aDSNInfo['port']; - if (isset($this->aDSNInfo['username']) && $this->aDSNInfo['username']) { + if (isset($this->aDSNInfo['username'])) { $osm2pgsql .= ' -U '.$this->aDSNInfo['username']; } - if (isset($this->aDSNInfo['hostspec']) && $this->aDSNInfo['hostspec']) { + if (isset($this->aDSNInfo['hostspec'])) { $osm2pgsql .= ' -H '.$this->aDSNInfo['hostspec']; } - $aProcEnv = null; - if (isset($this->aDSNInfo['password']) && $this->aDSNInfo['password']) { - $aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV); - } $osm2pgsql .= ' -d '.$this->aDSNInfo['database'].' '.$sOSMFile; - runWithEnv($osm2pgsql, $aProcEnv); - if ($this->oDB == null) $this->oDB =& getDB(); + + $this->runWithPgEnv($osm2pgsql); + if (!$this->sIgnoreErrors && !chksql($this->oDB->getRow('select * from place limit 1'))) { fail('No Data'); } @@ -347,8 +344,6 @@ class SetupFunctions { info('Drop old Data'); - if ($this->oDB == null) $this->oDB =& getDB(); - if (!pg_query($this->oDB->connection, 'TRUNCATE word')) fail(pg_last_error($this->oDB->connection)); echo '.'; if (!pg_query($this->oDB->connection, 'TRUNCATE placex')) fail(pg_last_error($this->oDB->connection)); @@ -528,7 +523,6 @@ class SetupFunctions public function calculatePostcodes($bCMDResultAll) { info('Calculate Postcodes'); - if ($this->oDB == null) $this->oDB =& getDB(); if (!pg_query($this->oDB->connection, 'TRUNCATE location_postcode')) { fail(pg_last_error($this->oDB->connection)); } @@ -589,36 +583,31 @@ class SetupFunctions $sOutputFile = ''; $sBaseCmd = CONST_InstallPath.'/nominatim/nominatim -i -d '.$this->aDSNInfo['database'].' -P ' .$this->aDSNInfo['port'].' -t '.$this->iInstances.$sOutputFile; - if (isset($this->aDSNInfo['hostspec']) && $this->aDSNInfo['hostspec']) { + if (isset($this->aDSNInfo['hostspec'])) { $sBaseCmd .= ' -H '.$this->aDSNInfo['hostspec']; } - if (isset($this->aDSNInfo['username']) && $this->aDSNInfo['username']) { + if (isset($this->aDSNInfo['username'])) { $sBaseCmd .= ' -U '.$this->aDSNInfo['username']; } - $aProcEnv = null; - if (isset($this->aDSNInfo['password']) && $this->aDSNInfo['password']) { - $aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV); - } info('Index ranks 0 - 4'); - $iStatus = runWithEnv($sBaseCmd.' -R 4', $aProcEnv); + $iStatus = $this->runWithPgEnv($sBaseCmd.' -R 4'); if ($iStatus != 0) { fail('error status ' . $iStatus . ' running nominatim!'); } if (!$bIndexNoanalyse) $this->pgsqlRunScript('ANALYSE'); info('Index ranks 5 - 25'); - $iStatus = runWithEnv($sBaseCmd.' -r 5 -R 25', $aProcEnv); + $iStatus = $this->runWithPgEnv($sBaseCmd.' -r 5 -R 25'); if ($iStatus != 0) { fail('error status ' . $iStatus . ' running nominatim!'); } if (!$bIndexNoanalyse) $this->pgsqlRunScript('ANALYSE'); info('Index ranks 26 - 30'); - $iStatus = runWithEnv($sBaseCmd.' -r 26', $aProcEnv); + $iStatus = $this->runWithPgEnv($sBaseCmd.' -r 26'); if ($iStatus != 0) { fail('error status ' . $iStatus . ' running nominatim!'); } info('Index postcodes'); - if ($this->oDB == null) $this->oDB =& getDB(); $sSQL = 'UPDATE location_postcode SET indexed_status = 0'; if (!pg_query($this->oDB->connection, $sSQL)) fail(pg_last_error($this->oDB->connection)); } @@ -700,7 +689,6 @@ class SetupFunctions 'place_classtype_*' ); - if ($this->oDB = null) $this->oDB =& getDB(); $aDropTables = array(); $aHaveTables = chksql($this->oDB->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'")); @@ -729,19 +717,15 @@ class SetupFunctions private function pgsqlRunDropAndRestore($sDumpFile) { - if (!isset($this->aDSNInfo['port']) || !$this->aDSNInfo['port']) $this->aDSNInfo['port'] = 5432; $sCMD = 'pg_restore -p '.$this->aDSNInfo['port'].' -d '.$this->aDSNInfo['database'].' -Fc --clean '.$sDumpFile; - if (isset($this->aDSNInfo['hostspec']) && $this->aDSNInfo['hostspec']) { + if (isset($this->aDSNInfo['hostspec'])) { $sCMD .= ' -h '.$this->aDSNInfo['hostspec']; } - if (isset($this->aDSNInfo['username']) && $this->aDSNInfo['username']) { + if (isset($this->aDSNInfo['username'])) { $sCMD .= ' -U '.$this->aDSNInfo['username']; } - $aProcEnv = null; - if (isset($this->aDSNInfo['password']) && $this->aDSNInfo['password']) { - $aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV); - } - $iReturn = runWithEnv($sCMD, $aProcEnv); // /lib/cmd.php "function runWithEnv($sCmd, $aEnv)" + + $this->runWithPgEnv($sCMD); } private function pgsqlRunScript($sScript, $bfatal = true) @@ -778,8 +762,6 @@ class SetupFunctions private function pgsqlRunPartitionScript($sTemplate) { - if ($this->oDB == null) $this->oDB =& getDB(); - $sSQL = 'select distinct partition from country_name'; $aPartitions = chksql($this->oDB->getCol($sSQL)); if (!$this->bNoPartitions) $aPartitions[] = 0; @@ -804,14 +786,14 @@ class SetupFunctions if (!$this->sVerbose) { $sCMD .= ' -q'; } - if (isset($this->aDSNInfo['hostspec']) && $this->aDSNInfo['hostspec']) { + if (isset($this->aDSNInfo['hostspec'])) { $sCMD .= ' -h '.$this->aDSNInfo['hostspec']; } - if (isset($this->aDSNInfo['username']) && $this->aDSNInfo['username']) { + if (isset($this->aDSNInfo['username'])) { $sCMD .= ' -U '.$this->aDSNInfo['username']; } $aProcEnv = null; - if (isset($this->aDSNInfo['password']) && $this->aDSNInfo['password']) { + if (isset($this->aDSNInfo['password'])) { $aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV); } $ahGzipPipes = null; @@ -861,4 +843,15 @@ class SetupFunctions } return $sSql; } + + private function runWithPgEnv($sCmd) + { + $aProcEnv = null; + + if (isset($this->aDSNInfo['password'])) { + $aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV); + } + + return runWithEnv($sCmd, $aProcEnv); + } } diff --git a/lib/template/error-json.php b/lib/template/error-json.php index 81caa71d..67297dd1 100644 --- a/lib/template/error-json.php +++ b/lib/template/error-json.php @@ -2,7 +2,7 @@ $error = array( 'code' => $exception->getCode(), 'message' => $exception->getMessage() - ); + ); if (CONST_Debug) { $error['details'] = $exception->getFile() . '('. $exception->getLine() . ')'; diff --git a/utils/setup.php b/utils/setup.php index ea3e14a3..39855150 100755 --- a/utils/setup.php +++ b/utils/setup.php @@ -71,18 +71,20 @@ if ($aCMDResult['osmosis-init']) { // ****************************************************** // instantiate Setup class -$cSetup = new SetupFunctions($aCMDResult); +$oSetup = new SetupFunctions($aCMDResult); // ******************************************************* // go through complete process if 'all' is selected or start selected functions if ($aCMDResult['create-db'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->createDB(); + $oSetup->createDB(); } +$oSetup->connect(); + if ($aCMDResult['setup-db'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->setupDB(); + $oSetup->setupDB(); } // Try accessing the C module, so we know early if something is wrong @@ -92,68 +94,68 @@ if (!checkModulePresence()) { if ($aCMDResult['import-data'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->importData($aCMDResult['osm-file']); + $oSetup->importData($aCMDResult['osm-file']); } if ($aCMDResult['create-functions'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->createFunctions(); + $oSetup->createFunctions(); } if ($aCMDResult['create-tables'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->createTables(); - $cSetup->createFunctions(); + $oSetup->createTables(); + $oSetup->createFunctions(); } if ($aCMDResult['create-partition-tables'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->createPartitionTables(); + $oSetup->createPartitionTables(); } if ($aCMDResult['create-partition-functions'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->createPartitionFunctions(); + $oSetup->createPartitionFunctions(); } if ($aCMDResult['import-wikipedia-articles'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->importWikipediaArticles(); + $oSetup->importWikipediaArticles(); } if ($aCMDResult['load-data'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->loadData($aCMDResult['disable-token-precalc']); + $oSetup->loadData($aCMDResult['disable-token-precalc']); } if ($aCMDResult['import-tiger-data']) { $bDidSomething = true; - $cSetup->importTigerData(); + $oSetup->importTigerData(); } if ($aCMDResult['calculate-postcodes'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->calculatePostcodes($aCMDResult['all']); + $oSetup->calculatePostcodes($aCMDResult['all']); } if ($aCMDResult['index'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->index($aCMDResult['index-noanalyse']); + $oSetup->index($aCMDResult['index-noanalyse']); } if ($aCMDResult['create-search-indices'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->createSearchIndices(); + $oSetup->createSearchIndices(); } if ($aCMDResult['create-country-names'] || $aCMDResult['all']) { $bDidSomething = true; - $cSetup->createCountryNames($aCMDResult); + $oSetup->createCountryNames($aCMDResult); } if ($aCMDResult['drop']) { $bDidSomething = true; - $cSetup->drop($aCMDResult); + $oSetup->drop($aCMDResult); } // ****************************************************** diff --git a/utils/update.php b/utils/update.php index 31f32f60..8756f2e5 100755 --- a/utils/update.php +++ b/utils/update.php @@ -110,6 +110,7 @@ if ($aResult['init-updates']) { 'enable-diff-updates' => true, 'verbose' => $aResult['verbose'] )); + $cSetup->connect(); $cSetup->createFunctions(); }