X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/7da5196bac0e1d894dc22e7a0c923bfa809125f9..e24ea7c1bb92c863055c0509c3ccf086aced483d:/lib/setup/SetupClass.php diff --git a/lib/setup/SetupClass.php b/lib/setup/SetupClass.php index dde834f7..e6b07998 100755 --- a/lib/setup/SetupClass.php +++ b/lib/setup/SetupClass.php @@ -2,13 +2,15 @@ namespace Nominatim\Setup; +require_once(CONST_BasePath.'/lib/setup/AddressLevelParser.php'); + class SetupFunctions { protected $iCacheMemory; protected $iInstances; protected $sModulePath; protected $aDSNInfo; - protected $sVerbose; + protected $bVerbose; protected $sIgnoreErrors; protected $bEnableDiffUpdates; protected $bEnableDebugStatements; @@ -44,7 +46,7 @@ class SetupFunctions } // setting member variables based on command line options stored in $aCMDResult - $this->sVerbose = $aCMDResult['verbose']; + $this->bVerbose = $aCMDResult['verbose']; //setting default values which are not set by the update.php array if (isset($aCMDResult['ignore-errors'])) { @@ -150,7 +152,6 @@ class SetupFunctions exit(1); } $this->pgsqlRunScriptFile(CONST_BasePath.'/data/country_name.sql'); - $this->pgsqlRunScriptFile(CONST_BasePath.'/data/country_naturalearthdata.sql'); $this->pgsqlRunScriptFile(CONST_BasePath.'/data/country_osm_grid.sql.gz'); $this->pgsqlRunScriptFile(CONST_BasePath.'/data/gb_postcode_table.sql'); @@ -188,6 +189,8 @@ class SetupFunctions fail("osm2pgsql not found in '$osm2pgsql'"); } + $osm2pgsql .= ' -S '.CONST_Import_Style; + if (!is_null(CONST_Osm2pgsql_Flatnode_File) && CONST_Osm2pgsql_Flatnode_File) { $osm2pgsql .= ' --flat-nodes '.CONST_Osm2pgsql_Flatnode_File; } @@ -230,7 +233,7 @@ class SetupFunctions $this->createSqlFunctions(); } - public function createTables() + public function createTables($bReverseOnly = false) { info('Create Tables'); @@ -268,6 +271,13 @@ class SetupFunctions ); $this->pgsqlRunScript($sTemplate, false); + + if ($bReverseOnly) { + $this->pgExec('DROP TABLE search_name'); + } + + $oAlParser = new AddressLevelParser(CONST_Address_Level_Config); + $oAlParser->createTable($this->oDB, 'address_levels'); } public function createPartitionTables() @@ -356,8 +366,10 @@ class SetupFunctions echo '.'; $this->pgExec('TRUNCATE location_area'); echo '.'; - $this->pgExec('TRUNCATE search_name'); - echo '.'; + if (!$this->dbReverseOnly()) { + $this->pgExec('TRUNCATE search_name'); + echo '.'; + } $this->pgExec('TRUNCATE search_name_blank'); echo '.'; $this->pgExec('DROP SEQUENCE seq_place'); @@ -395,7 +407,7 @@ class SetupFunctions $sSQL .= " and not (class='place' and type='houses' and osm_type='W'"; $sSQL .= " and ST_GeometryType(geometry) = 'ST_LineString')"; $sSQL .= ' and ST_IsValid(geometry)'; - if ($this->sVerbose) echo "$sSQL\n"; + if ($this->bVerbose) echo "$sSQL\n"; if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) { fail(pg_last_error($aDBInstances[$i]->connection)); } @@ -407,7 +419,7 @@ class SetupFunctions $sSQL .= ' (osm_id, address, linegeo)'; $sSQL .= ' SELECT osm_id, address, geometry from place where '; $sSQL .= "class='place' and type='houses' and osm_type='W' and ST_GeometryType(geometry) = 'ST_LineString'"; - if ($this->sVerbose) echo "$sSQL\n"; + if ($this->bVerbose) echo "$sSQL\n"; if (!pg_send_query($aDBInstances[$iLoadThreads]->connection, $sSQL)) { fail(pg_last_error($aDBInstances[$iLoadThreads]->connection)); } @@ -608,6 +620,9 @@ class SetupFunctions info('Create Search indices'); $sTemplate = file_get_contents(CONST_BasePath.'/sql/indices.src.sql'); + if (!$this->dbReverseOnly()) { + $sTemplate .= file_get_contents(CONST_BasePath.'/sql/indices_search.src.sql'); + } $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate); $sTemplate = $this->replaceTablespace( '{ts:address-index}', @@ -677,7 +692,8 @@ class SetupFunctions 'new_query_log', 'spatial_ref_sys', 'country_name', - 'place_classtype_*' + 'place_classtype_*', + 'country_osm_grid' ); $aDropTables = array(); @@ -694,15 +710,17 @@ class SetupFunctions if (!$bFound) array_push($aDropTables, $sTable); } foreach ($aDropTables as $sDrop) { - if ($this->sVerbose) echo "dropping table $sDrop\n"; + if ($this->bVerbose) echo "Dropping table $sDrop\n"; @pg_query($this->oDB->connection, "DROP TABLE $sDrop CASCADE"); // ignore warnings/errors as they might be caused by a table having // been deleted already by CASCADE } if (!is_null(CONST_Osm2pgsql_Flatnode_File) && CONST_Osm2pgsql_Flatnode_File) { - if ($sVerbose) echo 'deleting '.CONST_Osm2pgsql_Flatnode_File."\n"; - unlink(CONST_Osm2pgsql_Flatnode_File); + if (file_exists(CONST_Osm2pgsql_Flatnode_File)) { + if ($this->bVerbose) echo 'Deleting '.CONST_Osm2pgsql_Flatnode_File."\n"; + unlink(CONST_Osm2pgsql_Flatnode_File); + } } } @@ -724,7 +742,7 @@ class SetupFunctions runSQLScript( $sScript, $bfatal, - $this->sVerbose, + $this->bVerbose, $this->sIgnoreErrors ); } @@ -748,6 +766,10 @@ class SetupFunctions if (!CONST_Use_Aux_Location_data) { $sTemplate = str_replace('-- %NOAUXDATA% ', '', $sTemplate); } + + $sReverseOnly = $this->dbReverseOnly() ? 'true' : 'false'; + $sTemplate = str_replace('%REVERSE-ONLY%', $sReverseOnly, $sTemplate); + $this->pgsqlRunScript($sTemplate); } @@ -774,7 +796,7 @@ class SetupFunctions if (!file_exists($sFilename)) fail('unable to find '.$sFilename); $sCMD = 'psql -p '.$this->aDSNInfo['port'].' -d '.$this->aDSNInfo['database']; - if (!$this->sVerbose) { + if (!$this->bVerbose) { $sCMD .= ' -q'; } if (isset($this->aDSNInfo['hostspec'])) { @@ -837,6 +859,10 @@ class SetupFunctions private function runWithPgEnv($sCmd) { + if ($this->bVerbose) { + echo "Execute: $sCmd\n"; + } + $aProcEnv = null; if (isset($this->aDSNInfo['password'])) { @@ -861,4 +887,15 @@ class SetupFunctions fail(pg_last_error($this->oDB->connection)); } } + + /** + * Check if the database is in reverse-only mode. + * + * @return True if there is no search_name table and infrastructure. + */ + private function dbReverseOnly() + { + $sSQL = "SELECT count(*) FROM pg_tables WHERE tablename = 'search_name'"; + return !(chksql($this->oDB->getOne($sSQL))); + } }