{
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)
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');
$dotenv->load(CONST_DataDir.'/settings/env.defaults');
}
+function getSetting($sConfName)
+{
+ return $_ENV['NOMINATIM_'.$sConfName];
+}
+
function fail($sError, $sUserError = false)
{
if (!$sUserError) $sUserError = $sError;
$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;
}
$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'))
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:';
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();
}
$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);
// 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);
$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);
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'])
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').");
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,
{
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');
+ }
}
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');
-}
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.
--- /dev/null
+# .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);
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;
. ";\n",
pg_escape_string($aPair[0]),
pg_escape_string($aPair[1]),
- CONST_Database_Web_User
+ getSetting('DATABASE_WEBUSER');
);
}
$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