]> git.openstreetmap.org Git - nominatim.git/blobdiff - utils/setup.php
add more tables and an experimental warning to new --drop function
[nominatim.git] / utils / setup.php
index b49813a8ab7f056603e469b8fd8e7fcdfd2c1258..07b929a12344e5775426f8a8a5c4f0327f474ae8 100755 (executable)
@@ -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);
 
        }
 
        // 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);
                        $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 .= ' -lsc -O gazetteer --hstore --number-processes 1';
                $osm2pgsql .= ' -C '.$iCacheMemory;
                $osm2pgsql .= ' -P '.$aDSNInfo['port'];
                $osm2pgsql .= ' -d '.$aDSNInfo['database'].' '.$aCMDResult['osm-file'];
                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();
                @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');
                }
        }
 
+       if (isset($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);