X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/3257c04d94e70d2cf189e8fe986d3907b822c059..eda837a9e5dae51fbe39fbbde3c7f415af5b2a1c:/utils/setup.php diff --git a/utils/setup.php b/utils/setup.php index b49813a8..01bf1134 100755 --- a/utils/setup.php +++ b/utils/setup.php @@ -39,6 +39,7 @@ 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'), + array('drop', '', 0, 1, 0, 0, 'bool', 'Drop tables needed for updates, making the database readonly (EXPERIMENTAL)'), ); getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true); @@ -78,11 +79,13 @@ } // Assume we can steal all the cache memory in the box (unless told otherwise) - $iCacheMemory = (isset($aCMDResult['osm2pgsql-cache'])?$aCMDResult['osm2pgsql-cache']:getCacheMemoryMB()); - if ($iCacheMemory > getTotalMemoryMB()) + if (isset($aCMDResult['osm2pgsql-cache'])) + { + $iCacheMemory = $aCMDResult['osm2pgsql-cache']; + } + else { $iCacheMemory = getCacheMemoryMB(); - echo "WARNING: resetting cache memory to $iCacheMemory\n"; } $aDSNInfo = DB::parseDSN(CONST_Database_DSN); @@ -131,7 +134,7 @@ pgsqlRunScriptFile(CONST_Path_Postgresql_Postgis.'/postgis.sql'); pgsqlRunScriptFile(CONST_Path_Postgresql_Postgis.'/spatial_ref_sys.sql'); } else { - pgsqlRunScript('CREATE EXTENSION postgis'); + pgsqlRunScript('CREATE EXTENSION IF NOT EXISTS postgis'); } if ($fPostgisVersion < 2.1) { // Function was renamed in 2.1 and throws an annoying deprecation warning @@ -198,8 +201,8 @@ $osm2pgsql .= ' --tablespace-main-data '.CONST_Tablespace_Place_Data; if (CONST_Tablespace_Place_Index) $osm2pgsql .= ' --tablespace-main-index '.CONST_Tablespace_Place_Index; - $osm2pgsql .= ' -lsc -O gazetteer --hstore'; - $osm2pgsql .= ' -C '.$iCacheMemory; + $osm2pgsql .= ' -lsc -O gazetteer --hstore --number-processes 1'; + $osm2pgsql .= ' -C 25000'; $osm2pgsql .= ' -P '.$aDSNInfo['port']; $osm2pgsql .= ' -d '.$aDSNInfo['database'].' '.$aCMDResult['osm-file']; passthruCheckReturn($osm2pgsql); @@ -546,7 +549,7 @@ $sSQL .= "select 'P',nextval('seq_postcodes'),'place','postcode',postcode,calculated_country_code,"; $sSQL .= "ST_SetSRID(ST_Point(x,y),4326) as geometry from (select calculated_country_code,postcode,"; $sSQL .= "avg(st_x(st_centroid(geometry))) as x,avg(st_y(st_centroid(geometry))) as y "; - $sSQL .= "from placex where postcode is not null group by calculated_country_code,postcode) as x"; + $sSQL .= "from placex where postcode is not null and calculated_country_code not in ('ie') group by calculated_country_code,postcode) as x"; if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection)); $sSQL = "insert into placex (osm_type,osm_id,class,type,postcode,calculated_country_code,geometry) "; @@ -555,7 +558,7 @@ if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection)); } - if ($aCMDResult['osmosis-init'] || $aCMDResult['all']) + if ($aCMDResult['osmosis-init'] || ($aCMDResult['all'] && !$aCMDResult['drop'])) // no use doing osmosis-init when dropping update tables { $bDidSomething = true; $oDB =& getDB(); @@ -710,6 +713,7 @@ @symlink(CONST_BasePath.'/website/reverse.php', $sTargetDir.'/reverse.php'); @symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/search.php'); @symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/index.php'); + @symlink(CONST_BasePath.'/website/lookup.php', $sTargetDir.'/lookup.php'); @symlink(CONST_BasePath.'/website/deletable.php', $sTargetDir.'/deletable.php'); @symlink(CONST_BasePath.'/website/polygons.php', $sTargetDir.'/polygons.php'); @symlink(CONST_BasePath.'/website/status.php', $sTargetDir.'/status.php'); @@ -726,6 +730,69 @@ } } + if ($aCMDResult['drop']) + { + // The implementation is potentially a bit dangerous because it uses + // a positive selection of tables to keep, and deletes everything else. + // Including any tables that the unsuspecting user might have manually + // created. USE AT YOUR OWN PERIL. + $bDidSomething = true; + + // tables we want to keep. everything else goes. + $aKeepTables = array( + "*columns", + "import_polygon_*", + "import_status", + "place_addressline", + "location_property*", + "placex", + "search_name", + "seq_*", + "word", + "query_log", + "new_query_log", + "gb_postcode", + "spatial_ref_sys", + "country_name", + "place_classtype_*" + ); + + $oDB =& getDB(); + $aDropTables = array(); + $aHaveTables = $oDB->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'"); + if (PEAR::isError($aHaveTables)) + { + fail($aPartitions->getMessage()); + } + foreach($aHaveTables as $sTable) + { + $bFound = false; + foreach ($aKeepTables as $sKeep) + { + if (fnmatch($sKeep, $sTable)) + { + $bFound = true; + break; + } + } + if (!$bFound) array_push($aDropTables, $sTable); + } + + foreach ($aDropTables as $sDrop) + { + if ($aCMDResult['verbose']) echo "dropping table $sDrop\n"; + @pg_query($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)) + { + if ($aCMDResult['verbose']) echo "deleting ".CONST_Osm2pgsql_Flatnode_File."\n"; + unlink(CONST_Osm2pgsql_Flatnode_File); + } + } + if (!$bDidSomething) { showUsage($aCMDOptions, true);