mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
simplify connection handling in setup script
- factor out runWithEnv - require explicit connect() call to avoid rechecking for oDB (more for readability than for speed) - clean DSNInfo of empty strings and simplify check for entries
This commit is contained in:
@@ -4,17 +4,16 @@ namespace Nominatim\Setup;
|
|||||||
|
|
||||||
class SetupFunctions
|
class SetupFunctions
|
||||||
{
|
{
|
||||||
protected $iCacheMemory; // set in constructor
|
protected $iCacheMemory;
|
||||||
protected $iInstances; // set in constructor
|
protected $iInstances;
|
||||||
protected $sModulePath; // set in constructor
|
protected $sModulePath;
|
||||||
protected $aDSNInfo; // set in constructor = DB::parseDSN(CONST_Database_DSN);
|
protected $aDSNInfo;
|
||||||
protected $sVerbose; // set in constructor
|
protected $sVerbose;
|
||||||
protected $sIgnoreErrors; // set in constructor
|
protected $sIgnoreErrors;
|
||||||
protected $bEnableDiffUpdates; // set in constructor
|
protected $bEnableDiffUpdates;
|
||||||
protected $bEnableDebugStatements; // set in constructor
|
protected $bEnableDebugStatements;
|
||||||
protected $bNoPartitions; // set in constructor
|
protected $bNoPartitions;
|
||||||
protected $oDB = null; // set in setupDB (earliest) or later in loadData, importData, drop, createSqlFunctions, importTigerData
|
protected $oDB = null;
|
||||||
// pgsqlRunPartitionScript, calculatePostcodes, ..if no already set
|
|
||||||
|
|
||||||
public function __construct(array $aCMDResult)
|
public function __construct(array $aCMDResult)
|
||||||
{
|
{
|
||||||
@@ -38,9 +37,11 @@ class SetupFunctions
|
|||||||
$this->sModulePath = CONST_Database_Module_Path;
|
$this->sModulePath = CONST_Database_Module_Path;
|
||||||
info('module path: ' . $this->sModulePath);
|
info('module path: ' . $this->sModulePath);
|
||||||
|
|
||||||
// prepares DB for import or update, sets the Data Source Name
|
// parse database string
|
||||||
$this->aDSNInfo = \DB::parseDSN(CONST_Database_DSN);
|
$this->aDSNInfo = array_filter(\DB::parseDSN(CONST_Database_DSN));
|
||||||
if (!isset($this->aDSNInfo['port']) || !$this->aDSNInfo['port']) $this->aDSNInfo['port'] = 5432;
|
if (!isset($this->aDSNInfo['port'])) {
|
||||||
|
$this->aDSNInfo['port'] = 5432;
|
||||||
|
}
|
||||||
|
|
||||||
// setting member variables based on command line options stored in $aCMDResult
|
// setting member variables based on command line options stored in $aCMDResult
|
||||||
$this->sVerbose = $aCMDResult['verbose'];
|
$this->sVerbose = $aCMDResult['verbose'];
|
||||||
@@ -77,27 +78,26 @@ class SetupFunctions
|
|||||||
}
|
}
|
||||||
|
|
||||||
$sCreateDBCmd = 'createdb -E UTF-8 -p '.$this->aDSNInfo['port'].' '.$this->aDSNInfo['database'];
|
$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'];
|
$sCreateDBCmd .= ' -U '.$this->aDSNInfo['username'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($this->aDSNInfo['hostspec']) && $this->aDSNInfo['hostspec']) {
|
if (isset($this->aDSNInfo['hostspec'])) {
|
||||||
$sCreateDBCmd .= ' -h '.$this->aDSNInfo['hostspec'];
|
$sCreateDBCmd .= ' -h '.$this->aDSNInfo['hostspec'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$aProcEnv = null;
|
$result = $this->runWithPgEnv($sCreateDBCmd);
|
||||||
if (isset($this->aDSNInfo['password']) && $this->aDSNInfo['password']) {
|
|
||||||
$aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV);
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = runWithEnv($sCreateDBCmd, $aProcEnv);
|
|
||||||
if ($result != 0) fail('Error executing external command: '.$sCreateDBCmd);
|
if ($result != 0) fail('Error executing external command: '.$sCreateDBCmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function connect($sDatabaseDSN)
|
||||||
|
{
|
||||||
|
$this->oDB =& getDB();
|
||||||
|
}
|
||||||
|
|
||||||
public function setupDB()
|
public function setupDB()
|
||||||
{
|
{
|
||||||
info('Setup DB');
|
info('Setup DB');
|
||||||
$this->oDB =& getDB();
|
|
||||||
|
|
||||||
$fPostgresVersion = getPostgresVersion($this->oDB);
|
$fPostgresVersion = getPostgresVersion($this->oDB);
|
||||||
echo 'Postgres version found: '.$fPostgresVersion."\n";
|
echo 'Postgres version found: '.$fPostgresVersion."\n";
|
||||||
@@ -203,19 +203,16 @@ class SetupFunctions
|
|||||||
$osm2pgsql .= ' -lsc -O gazetteer --hstore --number-processes 1';
|
$osm2pgsql .= ' -lsc -O gazetteer --hstore --number-processes 1';
|
||||||
$osm2pgsql .= ' -C '.$this->iCacheMemory;
|
$osm2pgsql .= ' -C '.$this->iCacheMemory;
|
||||||
$osm2pgsql .= ' -P '.$this->aDSNInfo['port'];
|
$osm2pgsql .= ' -P '.$this->aDSNInfo['port'];
|
||||||
if (isset($this->aDSNInfo['username']) && $this->aDSNInfo['username']) {
|
if (isset($this->aDSNInfo['username'])) {
|
||||||
$osm2pgsql .= ' -U '.$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'];
|
$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;
|
$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'))) {
|
if (!$this->sIgnoreErrors && !chksql($this->oDB->getRow('select * from place limit 1'))) {
|
||||||
fail('No Data');
|
fail('No Data');
|
||||||
}
|
}
|
||||||
@@ -347,8 +344,6 @@ class SetupFunctions
|
|||||||
{
|
{
|
||||||
info('Drop old Data');
|
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));
|
if (!pg_query($this->oDB->connection, 'TRUNCATE word')) fail(pg_last_error($this->oDB->connection));
|
||||||
echo '.';
|
echo '.';
|
||||||
if (!pg_query($this->oDB->connection, 'TRUNCATE placex')) fail(pg_last_error($this->oDB->connection));
|
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)
|
public function calculatePostcodes($bCMDResultAll)
|
||||||
{
|
{
|
||||||
info('Calculate Postcodes');
|
info('Calculate Postcodes');
|
||||||
if ($this->oDB == null) $this->oDB =& getDB();
|
|
||||||
if (!pg_query($this->oDB->connection, 'TRUNCATE location_postcode')) {
|
if (!pg_query($this->oDB->connection, 'TRUNCATE location_postcode')) {
|
||||||
fail(pg_last_error($this->oDB->connection));
|
fail(pg_last_error($this->oDB->connection));
|
||||||
}
|
}
|
||||||
@@ -589,36 +583,31 @@ class SetupFunctions
|
|||||||
$sOutputFile = '';
|
$sOutputFile = '';
|
||||||
$sBaseCmd = CONST_InstallPath.'/nominatim/nominatim -i -d '.$this->aDSNInfo['database'].' -P '
|
$sBaseCmd = CONST_InstallPath.'/nominatim/nominatim -i -d '.$this->aDSNInfo['database'].' -P '
|
||||||
.$this->aDSNInfo['port'].' -t '.$this->iInstances.$sOutputFile;
|
.$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'];
|
$sBaseCmd .= ' -H '.$this->aDSNInfo['hostspec'];
|
||||||
}
|
}
|
||||||
if (isset($this->aDSNInfo['username']) && $this->aDSNInfo['username']) {
|
if (isset($this->aDSNInfo['username'])) {
|
||||||
$sBaseCmd .= ' -U '.$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');
|
info('Index ranks 0 - 4');
|
||||||
$iStatus = runWithEnv($sBaseCmd.' -R 4', $aProcEnv);
|
$iStatus = $this->runWithPgEnv($sBaseCmd.' -R 4');
|
||||||
if ($iStatus != 0) {
|
if ($iStatus != 0) {
|
||||||
fail('error status ' . $iStatus . ' running nominatim!');
|
fail('error status ' . $iStatus . ' running nominatim!');
|
||||||
}
|
}
|
||||||
if (!$bIndexNoanalyse) $this->pgsqlRunScript('ANALYSE');
|
if (!$bIndexNoanalyse) $this->pgsqlRunScript('ANALYSE');
|
||||||
info('Index ranks 5 - 25');
|
info('Index ranks 5 - 25');
|
||||||
$iStatus = runWithEnv($sBaseCmd.' -r 5 -R 25', $aProcEnv);
|
$iStatus = $this->runWithPgEnv($sBaseCmd.' -r 5 -R 25');
|
||||||
if ($iStatus != 0) {
|
if ($iStatus != 0) {
|
||||||
fail('error status ' . $iStatus . ' running nominatim!');
|
fail('error status ' . $iStatus . ' running nominatim!');
|
||||||
}
|
}
|
||||||
if (!$bIndexNoanalyse) $this->pgsqlRunScript('ANALYSE');
|
if (!$bIndexNoanalyse) $this->pgsqlRunScript('ANALYSE');
|
||||||
info('Index ranks 26 - 30');
|
info('Index ranks 26 - 30');
|
||||||
$iStatus = runWithEnv($sBaseCmd.' -r 26', $aProcEnv);
|
$iStatus = $this->runWithPgEnv($sBaseCmd.' -r 26');
|
||||||
if ($iStatus != 0) {
|
if ($iStatus != 0) {
|
||||||
fail('error status ' . $iStatus . ' running nominatim!');
|
fail('error status ' . $iStatus . ' running nominatim!');
|
||||||
}
|
}
|
||||||
info('Index postcodes');
|
info('Index postcodes');
|
||||||
if ($this->oDB == null) $this->oDB =& getDB();
|
|
||||||
$sSQL = 'UPDATE location_postcode SET indexed_status = 0';
|
$sSQL = 'UPDATE location_postcode SET indexed_status = 0';
|
||||||
if (!pg_query($this->oDB->connection, $sSQL)) fail(pg_last_error($this->oDB->connection));
|
if (!pg_query($this->oDB->connection, $sSQL)) fail(pg_last_error($this->oDB->connection));
|
||||||
}
|
}
|
||||||
@@ -700,7 +689,6 @@ class SetupFunctions
|
|||||||
'place_classtype_*'
|
'place_classtype_*'
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($this->oDB = null) $this->oDB =& getDB();
|
|
||||||
$aDropTables = array();
|
$aDropTables = array();
|
||||||
$aHaveTables = chksql($this->oDB->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'"));
|
$aHaveTables = chksql($this->oDB->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'"));
|
||||||
|
|
||||||
@@ -729,19 +717,15 @@ class SetupFunctions
|
|||||||
|
|
||||||
private function pgsqlRunDropAndRestore($sDumpFile)
|
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;
|
$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'];
|
$sCMD .= ' -h '.$this->aDSNInfo['hostspec'];
|
||||||
}
|
}
|
||||||
if (isset($this->aDSNInfo['username']) && $this->aDSNInfo['username']) {
|
if (isset($this->aDSNInfo['username'])) {
|
||||||
$sCMD .= ' -U '.$this->aDSNInfo['username'];
|
$sCMD .= ' -U '.$this->aDSNInfo['username'];
|
||||||
}
|
}
|
||||||
$aProcEnv = null;
|
|
||||||
if (isset($this->aDSNInfo['password']) && $this->aDSNInfo['password']) {
|
$this->runWithPgEnv($sCMD);
|
||||||
$aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV);
|
|
||||||
}
|
|
||||||
$iReturn = runWithEnv($sCMD, $aProcEnv); // /lib/cmd.php "function runWithEnv($sCmd, $aEnv)"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function pgsqlRunScript($sScript, $bfatal = true)
|
private function pgsqlRunScript($sScript, $bfatal = true)
|
||||||
@@ -778,8 +762,6 @@ class SetupFunctions
|
|||||||
|
|
||||||
private function pgsqlRunPartitionScript($sTemplate)
|
private function pgsqlRunPartitionScript($sTemplate)
|
||||||
{
|
{
|
||||||
if ($this->oDB == null) $this->oDB =& getDB();
|
|
||||||
|
|
||||||
$sSQL = 'select distinct partition from country_name';
|
$sSQL = 'select distinct partition from country_name';
|
||||||
$aPartitions = chksql($this->oDB->getCol($sSQL));
|
$aPartitions = chksql($this->oDB->getCol($sSQL));
|
||||||
if (!$this->bNoPartitions) $aPartitions[] = 0;
|
if (!$this->bNoPartitions) $aPartitions[] = 0;
|
||||||
@@ -804,14 +786,14 @@ class SetupFunctions
|
|||||||
if (!$this->sVerbose) {
|
if (!$this->sVerbose) {
|
||||||
$sCMD .= ' -q';
|
$sCMD .= ' -q';
|
||||||
}
|
}
|
||||||
if (isset($this->aDSNInfo['hostspec']) && $this->aDSNInfo['hostspec']) {
|
if (isset($this->aDSNInfo['hostspec'])) {
|
||||||
$sCMD .= ' -h '.$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'];
|
$sCMD .= ' -U '.$this->aDSNInfo['username'];
|
||||||
}
|
}
|
||||||
$aProcEnv = null;
|
$aProcEnv = null;
|
||||||
if (isset($this->aDSNInfo['password']) && $this->aDSNInfo['password']) {
|
if (isset($this->aDSNInfo['password'])) {
|
||||||
$aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV);
|
$aProcEnv = array_merge(array('PGPASSWORD' => $this->aDSNInfo['password']), $_ENV);
|
||||||
}
|
}
|
||||||
$ahGzipPipes = null;
|
$ahGzipPipes = null;
|
||||||
@@ -861,4 +843,15 @@ class SetupFunctions
|
|||||||
}
|
}
|
||||||
return $sSql;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,6 +80,8 @@ if ($aCMDResult['create-db'] || $aCMDResult['all']) {
|
|||||||
$oSetup->createDB();
|
$oSetup->createDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$oSetup->connect();
|
||||||
|
|
||||||
if ($aCMDResult['setup-db'] || $aCMDResult['all']) {
|
if ($aCMDResult['setup-db'] || $aCMDResult['all']) {
|
||||||
$bDidSomething = true;
|
$bDidSomething = true;
|
||||||
$oSetup->setupDB();
|
$oSetup->setupDB();
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ if ($aResult['init-updates']) {
|
|||||||
'enable-diff-updates' => true,
|
'enable-diff-updates' => true,
|
||||||
'verbose' => $aResult['verbose']
|
'verbose' => $aResult['verbose']
|
||||||
));
|
));
|
||||||
|
$cSetup->connect();
|
||||||
$cSetup->createFunctions();
|
$cSetup->createFunctions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user