]> git.openstreetmap.org Git - nominatim.git/blobdiff - utils/setup.php
Allow for postgis being in the default template - not an error if it already is installed
[nominatim.git] / utils / setup.php
index be385698e80afa963484573b1cdc1df156002215..eff7b71b447fef7fd36bab87e3db8569fef84231 100755 (executable)
                array('disable-token-precalc', '', 0, 1, 0, 0, 'bool', 'Disable name precalculation (EXPERT)'),
                array('import-tiger-data', '', 0, 1, 0, 0, 'bool', 'Import tiger data (not included in \'all\')'),
                array('calculate-postcodes', '', 0, 1, 0, 0, 'bool', 'Calculate postcode centroids'),
-               array('create-roads', '', 0, 1, 0, 0, 'bool', ''),
                array('osmosis-init', '', 0, 1, 0, 0, 'bool', 'Generate default osmosis configuration'),
                array('index', '', 0, 1, 0, 0, 'bool', 'Index the data'),
                array('index-noanalyse', '', 0, 1, 0, 0, 'bool', 'Do not perform analyse operations during index (EXPERT)'),
                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);
                        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
                        $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'];
                pgsqlRunScript('ANALYSE');
        }
 
-       if ($aCMDResult['create-roads'])
-       {
-               $bDidSomething = true;
-
-               $oDB =& getDB();
-               $aDBInstances = array();
-               for($i = 0; $i < $iInstances; $i++)
-               {
-                       $aDBInstances[$i] =& getDB(true);
-                       if (!pg_query($aDBInstances[$i]->connection, 'set enable_bitmapscan = off')) fail(pg_last_error($oDB->connection));
-                       $sSQL = 'select count(*) from (select insertLocationRoad(partition, place_id, calculated_country_code, geometry) from ';
-                       $sSQL .= 'placex where osm_id % '.$iInstances.' = '.$i.' and rank_search between 26 and 27 and class = \'highway\') as x ';
-                       if ($aCMDResult['verbose']) echo "$sSQL\n";
-                       if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
-               }
-               $bAnyBusy = true;
-               while($bAnyBusy)
-               {
-                       $bAnyBusy = false;
-                       for($i = 0; $i < $iInstances; $i++)
-                       {
-                               if (pg_connection_busy($aDBInstances[$i]->connection)) $bAnyBusy = true;
-                       }
-                       sleep(1);
-                       echo '.';
-               }
-               echo "\n";
-       }
-
        if ($aCMDResult['import-tiger-data'])
        {
                $bDidSomething = true;
                        $aDBInstances[$i] =& getDB(true);
                }
 
-               foreach(glob(CONST_BasePath.'/data/tiger2011/*.sql') as $sFile)
+               foreach(glob(CONST_Tiger_Data_Path.'/*.sql') as $sFile)
                {
                        echo $sFile.': ';
                        $hFile = fopen($sFile, "r");
                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();
                        }
 
                        // Find the last node in the DB
-                       $iLastOSMID = $oDB->getOne("select max(id) from planet_osm_nodes");
+                       $iLastOSMID = $oDB->getOne("select max(osm_id) from place where osm_type = 'N'");
 
                        // Lookup the timestamp that node was created (less 3 hours for margin for changsets to be closed)
                        $sLastNodeURL = 'http://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID."/1";
                @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 ($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);