]> git.openstreetmap.org Git - nominatim.git/commitdiff
replace database settings with dotenv variant
authorSarah Hoffmann <lonvia@denofr.de>
Tue, 15 Dec 2020 14:12:28 +0000 (15:12 +0100)
committerSarah Hoffmann <lonvia@denofr.de>
Sat, 19 Dec 2020 13:33:04 +0000 (14:33 +0100)
As we can't refer to the project root dir in the module path, the
module path may now also be a relative directory which is then
taken as being relative to the project root path.

Moves the checkModulePresence() function into the Setup class, so
that it can work on the computed absolute module path.

lib/DB.php
lib/cmd.php
lib/lib.php
lib/setup/SetupClass.php
lib/setup_functions.php
settings/defaults.php
settings/env.defaults [new file with mode: 0644]
utils/check_import_finished.php
utils/specialphrases.php
utils/update.php

index 2b53dba8254dbd230630a1a41ceefb02d4221cff..0454a0ff6190567f57acd6d19f46817759ebf7b4 100644 (file)
@@ -12,9 +12,9 @@ class DB
 {
     protected $connection;
 
-    public function __construct($sDSN = CONST_Database_DSN)
+    public function __construct($sDSN = null)
     {
-        $this->sDSN = $sDSN;
+        $this->sDSN = $sDSN ?? getSetting('DATABASE_DSN');
     }
 
     public function connect($bNew = false, $bPersistent = true)
index b72c1bb41726950b6772ae5ea0157c56331e3e47..7337f814575c2eec3e2b12459dcb4b3c7ba4515c 100644 (file)
@@ -147,7 +147,7 @@ function repeatWarnings()
 function runSQLScript($sScript, $bfatal = true, $bVerbose = false, $bIgnoreErrors = false)
 {
     // Convert database DSN to psql parameters
-    $aDSNInfo = \Nominatim\DB::parseDSN(CONST_Database_DSN);
+    $aDSNInfo = \Nominatim\DB::parseDSN(getSetting('DATABASE_DSN'));
     if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
 
     $oCmd = new \Nominatim\Shell('psql');
index 9861cdd03f69f496b63ca038fadd5d84e89055ad..753159d235690f6974a0d23e0502f1b0c792036a 100644 (file)
@@ -18,6 +18,11 @@ function loadSettings($sProjectDir)
     $dotenv->load(CONST_DataDir.'/settings/env.defaults');
 }
 
+function getSetting($sConfName)
+{
+    return $_ENV['NOMINATIM_'.$sConfName];
+}
+
 function fail($sError, $sUserError = false)
 {
     if (!$sUserError) $sUserError = $sError;
index 6114689fb3bd79feb48d0ff107e49daee06381fd..489ab2ec8672f3036a62d1731294947208683096 100755 (executable)
@@ -42,11 +42,14 @@ class SetupFunctions
             $this->iCacheMemory = getCacheMemoryMB();
         }
 
-        $this->sModulePath = CONST_Database_Module_Path;
+        $this->sModulePath = getSetting('DATABASE_MODULE_PATH');
+        if (strlen($this->sModulePath) == 0 || $this->sModulePath[0] != '/') {
+            $this->sModulePath = CONST_InstallDir.'/'.$this->sModulePath;
+        }
         info('module path: ' . $this->sModulePath);
 
         // parse database string
-        $this->aDSNInfo = \Nominatim\DB::parseDSN(CONST_Database_DSN);
+        $this->aDSNInfo = \Nominatim\DB::parseDSN(getSetting('DATABASE_DSN'));
         if (!isset($this->aDSNInfo['port'])) {
             $this->aDSNInfo['port'] = 5432;
         }
@@ -86,7 +89,7 @@ class SetupFunctions
         $oDB = new \Nominatim\DB;
 
         if ($oDB->checkConnection()) {
-            fail('database already exists ('.CONST_Database_DSN.')');
+            fail('database already exists ('.getSetting('DATABASE_DSN').')');
         }
 
         $oCmd = (new \Nominatim\Shell('createdb'))
@@ -130,15 +133,16 @@ class SetupFunctions
             exit(1);
         }
 
-        $i = $this->db()->getOne("select count(*) from pg_user where usename = '".CONST_Database_Web_User."'");
+        $sPgUser = getSetting('DATABASE_WEBUSER');
+        $i = $this->db()->getOne("select count(*) from pg_user where usename = '$sPgUser'");
         if ($i == 0) {
-            echo "\nERROR: Web user '".CONST_Database_Web_User."' does not exist. Create it with:\n";
-            echo "\n          createuser ".CONST_Database_Web_User."\n\n";
+            echo "\nERROR: Web user '".$sPgUser."' does not exist. Create it with:\n";
+            echo "\n          createuser ".$sPgUser."\n\n";
             exit(1);
         }
 
         // Try accessing the C module, so we know early if something is wrong
-        checkModulePresence(); // raises exception on failure
+        $this->checkModulePresence(); // raises exception on failure
 
         if (!file_exists(CONST_DataDir.'/data/country_osm_grid.sql.gz')) {
             echo 'Error: you need to download the country_osm_grid first:';
@@ -234,7 +238,7 @@ class SetupFunctions
         info('Create Functions');
 
         // Try accessing the C module, so we know early if something is wrong
-        checkModulePresence(); // raises exception on failure
+        $this->checkModulePresence(); // raises exception on failure
 
         $this->createSqlFunctions();
     }
@@ -352,7 +356,7 @@ class SetupFunctions
         $iLoadThreads = max(1, $this->iInstances - 1);
         for ($i = 0; $i < $iLoadThreads; $i++) {
             // https://secure.php.net/manual/en/function.pg-connect.php
-            $DSN = CONST_Database_DSN;
+            $DSN = getSetting('DATABASE_DSN');
             $DSN = preg_replace('/^pgsql:/', '', $DSN);
             $DSN = preg_replace('/;/', ' ', $DSN);
             $aDBInstances[$i] = pg_connect($DSN, PGSQL_CONNECT_FORCE_NEW);
@@ -372,7 +376,7 @@ class SetupFunctions
 
         // last thread for interpolation lines
         // https://secure.php.net/manual/en/function.pg-connect.php
-        $DSN = CONST_Database_DSN;
+        $DSN = getSetting('DATABASE_DSN');
         $DSN = preg_replace('/^pgsql:/', '', $DSN);
         $DSN = preg_replace('/;/', ' ', $DSN);
         $aDBInstances[$iLoadThreads] = pg_connect($DSN, PGSQL_CONNECT_FORCE_NEW);
@@ -442,7 +446,7 @@ class SetupFunctions
         $aDBInstances = array();
         for ($i = 0; $i < $this->iInstances; $i++) {
             // https://secure.php.net/manual/en/function.pg-connect.php
-            $DSN = CONST_Database_DSN;
+            $DSN = getSetting('DATABASE_DSN');
             $DSN = preg_replace('/^pgsql:/', '', $DSN);
             $DSN = preg_replace('/;/', ' ', $DSN);
             $aDBInstances[$i] = pg_connect($DSN, PGSQL_CONNECT_FORCE_NEW | PGSQL_CONNECT_ASYNC);
@@ -542,7 +546,7 @@ class SetupFunctions
 
     public function index($bIndexNoanalyse)
     {
-        checkModulePresence(); // raises exception on failure
+        $this->checkModulePresence(); // raises exception on failure
 
         $oBaseCmd = (new \Nominatim\Shell(CONST_DataDir.'/nominatim/nominatim.py'))
                     ->addParams('--database', $this->aDSNInfo['database'])
@@ -714,7 +718,7 @@ class SetupFunctions
         fwrite($rOutputFile, "<?php
 if (file_exists(getenv('NOMINATIM_SETTINGS'))) require_once(getenv('NOMINATIM_SETTINGS'));
 
-@define('CONST_Database_DSN', '".CONST_Database_DSN."');
+@define('CONST_Database_DSN', '".getSetting('DATABASE_DSN')."');
 @define('CONST_Default_Language', ".(CONST_Default_Language ? ("'".CONST_Default_Language."'") : 'false').");
 @define('CONST_Log_DB', ".(CONST_Log_DB ? 'true' : 'false').");
 @define('CONST_Log_File', ".(CONST_Log_File ? ("'".CONST_Log_File."'")  : 'false').");
@@ -894,7 +898,7 @@ if (file_exists(getenv('NOMINATIM_SETTINGS'))) require_once(getenv('NOMINATIM_SE
 
     private function replaceSqlPatterns($sSql)
     {
-        $sSql = str_replace('{www-user}', CONST_Database_Web_User, $sSql);
+        $sSql = str_replace('{www-user}', getSetting('DATABASE_WEBUSER'), $sSql);
 
         $aPatterns = array(
                       '{ts:address-data}' => CONST_Tablespace_Address_Data,
@@ -938,4 +942,20 @@ if (file_exists(getenv('NOMINATIM_SETTINGS'))) require_once(getenv('NOMINATIM_SE
     {
         return !($this->db()->tableExists('search_name'));
     }
+
+    /**
+     * Try accessing the C module, so we know early if something is wrong.
+     *
+     * Raises Nominatim\DatabaseError on failure
+     */
+    private function checkModulePresence()
+    {
+        $sSQL = "CREATE FUNCTION nominatim_test_import_func(text) RETURNS text AS '";
+        $sSQL .= $this->sModulePath . "/nominatim.so', 'transliteration' LANGUAGE c IMMUTABLE STRICT";
+        $sSQL .= ';DROP FUNCTION nominatim_test_import_func(text);';
+
+        $oDB = new \Nominatim\DB();
+        $oDB->connect();
+        $oDB->exec($sSQL, null, 'Database server failed to load '.$this->sModulePath.'/nominatim.so module');
+    }
 }
index 43f30a090dfff4939f4f511e786e2615d467c1c1..5aa5919b2e63ec5f768c19d24033796b3441ebb8 100755 (executable)
@@ -14,18 +14,3 @@ function checkInFile($sOSMFile)
         fail('osm-file "' . $aCMDResult['osm-file'] . '" not readable');
     }
 }
-
-function checkModulePresence()
-{
-    // Try accessing the C module, so we know early if something is wrong.
-    // Raises Nominatim\DatabaseError on failure
-
-    $sModulePath = CONST_Database_Module_Path;
-    $sSQL = "CREATE FUNCTION nominatim_test_import_func(text) RETURNS text AS '";
-    $sSQL .= $sModulePath . "/nominatim.so', 'transliteration' LANGUAGE c IMMUTABLE STRICT";
-    $sSQL .= ';DROP FUNCTION nominatim_test_import_func(text);';
-
-    $oDB = new \Nominatim\DB();
-    $oDB->connect();
-    $oDB->exec($sSQL, null, 'Database server failed to load '.$sModulePath.'/nominatim.so module');
-}
index 49c2d217732bc37f9de5c974fc5c4eeec51d4227..1f146a4baa21f9affc20f6deb80dd60672afc793 100644 (file)
@@ -2,10 +2,6 @@
 if (file_exists(getenv('NOMINATIM_SETTINGS'))) require_once(getenv('NOMINATIM_SETTINGS'));
 if (file_exists(CONST_InstallDir.'/settings/local.php')) require_once(CONST_InstallDir.'/settings/local.php');
 
-// General settings
-@define('CONST_Database_DSN', 'pgsql:dbname=nominatim'); // or add ;host=...;port=...;user=...;password=...
-@define('CONST_Database_Web_User', 'www-data');
-@define('CONST_Database_Module_Path', CONST_InstallDir.'/module');
 @define('CONST_Max_Word_Frequency', '50000');
 @define('CONST_Limit_Reindexing', true);
 // Restrict search languages.
diff --git a/settings/env.defaults b/settings/env.defaults
new file mode 100644 (file)
index 0000000..45b0fc6
--- /dev/null
@@ -0,0 +1,125 @@
+# .env
+# Default configuration settings for Nominatim
+
+# Database connection string.
+# Add host, port, user etc through additional semicolon-separated attributes.
+# e.g. ;host=...;port=...;user=...;password=...
+NOMINATIM_DATABASE_DSN="pgsql:dbname=nominatim"
+
+# Database web user.
+# Nominatim sets up read-only access for this user during installation.
+NOMINATIM_DATABASE_WEBUSER="www-data"
+
+# Directory where to find the PostgreSQL server module.
+# When a relative path is given, it will be searched relative to the project
+# directory.
+NOMINATIM_DATABASE_MODULE_PATH="module"
+
+#@define('CONST_Max_Word_Frequency', '50000');
+#@define('CONST_Limit_Reindexing', true);
+#// Restrict search languages.
+#// Normally Nominatim will include all language variants of name:XX
+#// in the search index. Set this to a comma separated list of language
+#// codes, to restrict import to a subset of languages.
+#// Currently only affects the import of country names and special phrases.
+#@define('CONST_Languages', false);
+#// Rules for normalizing terms for comparison before doing comparisons.
+#// The default is to remove accents and punctuation and to lower-case the
+#// term. Spaces are kept but collapsed to one standard space.
+#@define('CONST_Term_Normalization_Rules', ":: NFD (); [[:Nonspacing Mark:] [:Cf:]] >;  :: lower (); [[:Punctuation:][:Space:]]+ > ' '; :: NFC ();");
+#
+#/* Set to true after importing Tiger house number data for the US.
+#   Note: The tables must already exist or queries will throw errors.
+#         After changing this setting run ./utils/setup --create-functions
+#         again. */
+#@define('CONST_Use_US_Tiger_Data', false);
+#/* Set to true after importing other external house number data.
+#   Note: the aux tables must already exist or queries will throw errors.
+#        After changing this setting run ./utils/setup --create-functions
+#        again. */
+#@define('CONST_Use_Aux_Location_data', false);
+#
+#// Proxy settings
+#@define('CONST_HTTP_Proxy', false);
+#@define('CONST_HTTP_Proxy_Host', 'proxy.mydomain.com');
+#@define('CONST_HTTP_Proxy_Port', '3128');
+#@define('CONST_HTTP_Proxy_Login', '');
+#@define('CONST_HTTP_Proxy_Password', '');
+#
+#// Paths
+#@define('CONST_ExtraDataPath', CONST_BasePath.'/data');
+#@define('CONST_Osm2pgsql_Binary', CONST_InstallPath.'/osm2pgsql/osm2pgsql');
+#@define('CONST_Pyosmium_Binary', '@PYOSMIUM_PATH@');
+#@define('CONST_Tiger_Data_Path', CONST_ExtraDataPath.'/tiger');
+#@define('CONST_Wikipedia_Data_Path', CONST_ExtraDataPath);
+#@define('CONST_Phrase_Config', CONST_BasePath.'/settings/phrase_settings.php');
+#@define('CONST_Address_Level_Config', CONST_BasePath.'/settings/address-levels.json');
+#@define('CONST_Import_Style', CONST_BasePath.'/settings/import-full.style');
+#
+#// osm2pgsql settings
+#@define('CONST_Osm2pgsql_Flatnode_File', null);
+#
+#// tablespace settings
+#// osm2pgsql caching tables (aka slim mode tables) - update only
+#@define('CONST_Tablespace_Osm2pgsql_Data', false);
+#@define('CONST_Tablespace_Osm2pgsql_Index', false);
+#// osm2pgsql output tables (aka main table) - update only
+#@define('CONST_Tablespace_Place_Data', false);
+#@define('CONST_Tablespace_Place_Index', false);
+#// address computation tables - update only
+#@define('CONST_Tablespace_Address_Data', false);
+#@define('CONST_Tablespace_Address_Index', false);
+#// search tables - needed for lookups
+#@define('CONST_Tablespace_Search_Data', false);
+#@define('CONST_Tablespace_Search_Index', false);
+#// additional data, e.g. TIGER data, type searches - needed for lookups
+#@define('CONST_Tablespace_Aux_Data', false);
+#@define('CONST_Tablespace_Aux_Index', false);
+#
+#//// Replication settings
+#
+#// Base URL of replication service
+#@define('CONST_Replication_Url', 'https://planet.openstreetmap.org/replication/minute');
+#
+#// Maximum size in MB of data to download per batch
+#@define('CONST_Replication_Max_Diff_size', '30');
+#// How long until the service publishes the next diff
+#// (relative to the age of data in the diff).
+#@define('CONST_Replication_Update_Interval', '75');
+#// How long to sleep when no update could be found
+#@define('CONST_Replication_Recheck_Interval', '60');
+#
+#// If true, send CORS headers to allow access
+#@define('CONST_NoAccessControl', true);
+#
+#// Set this to the /mapicon directory of your nominatim-ui to enable returning
+#// icon URLs with the results.
+#@define('CONST_MapIcon_URL', false);
+#// Language to assume when none is supplied with the query.
+#// When set to false, the local language (i.e. the name tag without suffix)
+#// will be used.
+#@define('CONST_Default_Language', false);
+#
+#@define('CONST_Search_AreaPolygons', true);
+#
+#@define('CONST_Search_BatchMode', false);
+#
+#@define('CONST_Search_NameOnlySearchFrequencyThreshold', 500);
+#// If set to true, then reverse order of queries will be tried by default.
+#// When set to false only selected languages allow reverse search.
+#@define('CONST_Search_ReversePlanForAll', true);
+#
+#// Maximum number of OSM ids that may be queried at once
+#// for the places endpoint.
+#@define('CONST_Places_Max_ID_count', 50);
+#
+#// Number of different geometry formats that may be queried in parallel.
+#// Set to zero to disable polygon output.
+#@define('CONST_PolygonOutput_MaximumTypes', 1);
+#
+#// Log settings
+#// Set to true to log into new_query_log table.
+#// You should set up a cron job that regularly clears out this table.
+#@define('CONST_Log_DB', false);
+#// Set to a file name to enable logging to a file.
+#@define('CONST_Log_File', false);
index 1eb012d475182d60ac36dff9aa0f9d8fdcfcd101..570378dd6b7ab8bfc79087285d6f68645ba878dd 100755 (executable)
@@ -35,7 +35,7 @@ if ($oDB->checkConnection()) {
     echo <<< END
     Hints:
     * Is the database server started?
-    * Check the CONST_Database_DSN variable in build/settings/local.php
+    * Check the NOMINATIM_DATABASE_DSN variable in your local .env
     * Try connecting to the database with the same settings
 
 END;
index d2bc7041d449b87af534f1654ffb681a3f4595d4..9e6da265dc0184a2f5f4a1fd2325d8f625476778 100644 (file)
@@ -147,7 +147,7 @@ if ($aCMDResult['wiki-import']) {
             . ";\n",
             pg_escape_string($aPair[0]),
             pg_escape_string($aPair[1]),
-            CONST_Database_Web_User
+            getSetting('DATABASE_WEBUSER');
         );
     }
 
index ff8b0c002465fceb6610c7b6ff9b23e8952ce789..9b68ecdb35a51b586fad7aca0328fa6cfff241eb 100644 (file)
@@ -57,7 +57,7 @@ $oDB = new Nominatim\DB();
 $oDB->connect();
 $fPostgresVersion = $oDB->getPostgresVersion();
 
-$aDSNInfo = Nominatim\DB::parseDSN(CONST_Database_DSN);
+$aDSNInfo = Nominatim\DB::parseDSN(getSetting('DATABASE_DSN'));
 if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
 
 // cache memory to be used by osm2pgsql, should not be more than the available memory