X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/f42e40712e1a20d9e6ca1e497123a0c16c83be82..38c21de0ee17bb0eacd6cc8f0e1ed71cbee0b0c9:/lib/DB.php diff --git a/lib/DB.php b/lib/DB.php index e4aa4349..5915b2e8 100644 --- a/lib/DB.php +++ b/lib/DB.php @@ -241,11 +241,103 @@ class DB } /** - * Since the DSN includes the database name, checks if the connection works. + * Returns a list of table names in the database + * + * @return array[] + */ + public function getListOfTables() + { + return $this->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'"); + } + + /** + * Deletes a table. Returns true on success. Returns true if the table didn't exist. + * + * @param string $sTableName * * @return boolean */ - public function databaseExists() + public function deleteTable($sTableName) + { + return $this->exec('DROP TABLE IF EXISTS '.$sTableName.' CASCADE') == 0; + } + + /** + * Check if an index exists in the database. Optional filtered by tablename + * + * @param string $sTableName + * + * @return boolean + */ + public function indexExists($sIndexName, $sTableName = null) + { + return in_array($sIndexName, $this->getListOfIndices($sTableName)); + } + + /** + * Returns a list of index names in the database, optional filtered by tablename + * + * @param string $sTableName + * + * @return array + */ + public function getListOfIndices($sTableName = null) + { + // table_name | index_name | column_name + // -----------------------+---------------------------------+-------------- + // country_name | idx_country_name_country_code | country_code + // country_osm_grid | idx_country_osm_grid_geometry | geometry + // import_polygon_delete | idx_import_polygon_delete_osmid | osm_id + // import_polygon_delete | idx_import_polygon_delete_osmid | osm_type + // import_polygon_error | idx_import_polygon_error_osmid | osm_id + // import_polygon_error | idx_import_polygon_error_osmid | osm_type + $sSql = <<< END +SELECT + t.relname as table_name, + i.relname as index_name, + a.attname as column_name +FROM + pg_class t, + pg_class i, + pg_index ix, + pg_attribute a +WHERE + t.oid = ix.indrelid + and i.oid = ix.indexrelid + and a.attrelid = t.oid + and a.attnum = ANY(ix.indkey) + and t.relkind = 'r' + and i.relname NOT LIKE 'pg_%' + FILTERS + ORDER BY + t.relname, + i.relname, + a.attname +END; + + $aRows = null; + if ($sTableName) { + $sSql = str_replace('FILTERS', 'and t.relname = :tablename', $sSql); + $aRows = $this->getAll($sSql, array(':tablename' => $sTableName)); + } else { + $sSql = str_replace('FILTERS', '', $sSql); + $aRows = $this->getAll($sSql); + } + + $aIndexNames = array_unique(array_map(function ($aRow) { + return $aRow['index_name']; + }, $aRows)); + sort($aIndexNames); + + return $aIndexNames; + } + + /** + * Tries to connect to the database but on failure doesn't throw an exception. + * + * @return boolean + */ + public function checkConnection() { $bExists = true; try { @@ -280,6 +372,13 @@ class DB return (float) ($aMatches[1].'.'.$aMatches[2]); } + /** + * Returns an associate array of postgresql database connection settings. Keys can + * be 'database', 'hostspec', 'port', 'username', 'password'. + * Returns empty array on failure, thus check if at least 'database' is set. + * + * @return array[] + */ public static function parseDSN($sDSN) { // https://secure.php.net/manual/en/ref.pdo-pgsql.connection.php @@ -295,4 +394,41 @@ class DB } return $aInfo; } + + /** + * Takes an array of settings and return the DNS string. Key names can be + * 'database', 'hostspec', 'port', 'username', 'password' but aliases + * 'dbname', 'host' and 'user' are also supported. + * + * @return string + * + */ + public static function generateDSN($aInfo) + { + $sDSN = 'pgsql:'; + if (isset($aInfo['host'])) { + $sDSN .= 'host=' . $aInfo['host'] . ';'; + } elseif (isset($aInfo['hostspec'])) { + $sDSN .= 'host=' . $aInfo['hostspec'] . ';'; + } + if (isset($aInfo['port'])) { + $sDSN .= 'port=' . $aInfo['port'] . ';'; + } + if (isset($aInfo['dbname'])) { + $sDSN .= 'dbname=' . $aInfo['dbname'] . ';'; + } elseif (isset($aInfo['database'])) { + $sDSN .= 'dbname=' . $aInfo['database'] . ';'; + } + if (isset($aInfo['user'])) { + $sDSN .= 'user=' . $aInfo['user'] . ';'; + } elseif (isset($aInfo['username'])) { + $sDSN .= 'user=' . $aInfo['username'] . ';'; + } + if (isset($aInfo['password'])) { + $sDSN .= 'password=' . $aInfo['password'] . ';'; + } + $sDSN = preg_replace('/;$/', '', $sDSN); + + return $sDSN; + } }