Permalink
Browse files

Schema support for PostgreSQL

git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@1521 7c3ca157-0c34-0410-bff1-cbf682f78f5c
  • Loading branch information...
jakubvrana
jakubvrana committed May 5, 2010
1 parent 4809139 commit 6420c5848ca1c0feb8400ef6517906e03d0d1f48
View
@@ -65,7 +65,7 @@
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php
-if (strlen(DB)) {
+if (DB != "") {
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'$confirm>\n";
} elseif (!$_POST["add_x"] && $_GET["db"] == "") {
echo "<input type='image' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n";
View
@@ -36,125 +36,128 @@
queries_redirect(substr(ME, 0, -1), $message, $result);
}
-page_header(lang('Database') . ": " . h(DB), $error, true);
-echo '<p><a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n";
-echo '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n";
-$sums = array("Data_length" => 0, "Index_length" => 0, "Data_free" => 0);
-
-echo "<h3>" . lang('Tables and views') . "</h3>\n";
-$tables_list = tables_list();
-if (!$tables_list) {
- echo "<p class='message'>" . lang('No tables.') . "\n";
-} else {
- echo "<form action='' method='post'>\n";
- echo "<p><input name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
- if ($_POST["search"] && $_POST["query"] != "") {
- $_GET["where"][0]["op"] = "LIKE %%";
- $_GET["where"][0]["val"] = $_POST["query"];
- search_tables();
- }
- echo "<table cellspacing='0' class='nowrap' onclick='tableClick(event);'>\n";
- echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . (support("comment") ? '<td>' . lang('Comment') : '') . "</thead>\n";
- foreach ($tables_list as $name => $type) {
- $view = (isset($type) && !eregi("table", $type));
- echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');");
- echo '<th><a href="' . h(ME) . 'table=' . urlencode($name) . '">' . h($name) . '</a>';
- if ($view) {
- echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '">' . lang('View') . '</a>';
- echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '">?</a>';
- } else {
- echo "<td id='Engine-" . h($name) . "'>&nbsp;<td id='Collation-" . h($name) . "'>&nbsp;";
- foreach (array("Data_length" => "create", "Index_length" => "indexes", "Data_free" => "edit", "Auto_increment" => "auto_increment=1&create", "Rows" => "select") as $key => $link) {
- echo "<td align='right'><a href='" . h(ME . "$link=") . urlencode($name) . "' id='$key-" . h($name) . "'>?</a>";
+page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema') . ": " . h($_GET["ns"])), $error, true);
+echo '<p>' . ($_GET["ns"] == "" ? '<a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n" : "");
+echo (support("scheme") ? "<a href='" . h(ME) . "scheme='>" . ($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema')) . "</a>\n" : "");
+if ($_GET["ns"] !== "") {
+ echo '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n";
+ $sums = array("Data_length" => 0, "Index_length" => 0, "Data_free" => 0);
+
+ echo "<h3>" . lang('Tables and views') . "</h3>\n";
+ $tables_list = tables_list();
+ if (!$tables_list) {
+ echo "<p class='message'>" . lang('No tables.') . "\n";
+ } else {
+ echo "<form action='' method='post'>\n";
+ echo "<p><input name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
+ if ($_POST["search"] && $_POST["query"] != "") {
+ $_GET["where"][0]["op"] = "LIKE %%";
+ $_GET["where"][0]["val"] = $_POST["query"];
+ search_tables();
+ }
+ echo "<table cellspacing='0' class='nowrap' onclick='tableClick(event);'>\n";
+ echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . (support("comment") ? '<td>' . lang('Comment') : '') . "</thead>\n";
+ foreach ($tables_list as $name => $type) {
+ $view = (isset($type) && !eregi("table", $type));
+ echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');");
+ echo '<th><a href="' . h(ME) . 'table=' . urlencode($name) . '">' . h($name) . '</a>';
+ if ($view) {
+ echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '">' . lang('View') . '</a>';
+ echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '">?</a>';
+ } else {
+ echo "<td id='Engine-" . h($name) . "'>&nbsp;<td id='Collation-" . h($name) . "'>&nbsp;";
+ foreach (array("Data_length" => "create", "Index_length" => "indexes", "Data_free" => "edit", "Auto_increment" => "auto_increment=1&create", "Rows" => "select") as $key => $link) {
+ echo "<td align='right'><a href='" . h(ME . "$link=") . urlencode($name) . "' id='$key-" . h($name) . "'>?</a>";
+ }
}
+ echo (support("comment") ? "<td id='Comment-" . h($name) . "'>&nbsp;" : "");
}
- echo (support("comment") ? "<td id='Comment-" . h($name) . "'>&nbsp;" : "");
- }
- echo "<tr><td>&nbsp;<th>" . lang('%d in total', count($tables_list));
- echo "<td>" . $connection->result("SELECT @@storage_engine");
- echo "<td>" . db_collation(DB, collations());
- foreach ($sums as $key => $val) {
- echo "<td align='right' id='sum-$key'>&nbsp;";
- }
- echo "</table>\n";
- if (!information_schema(DB)) {
- echo "<p><input type='hidden' name='token' value='$token'>" . ($driver == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> " : "") . "<input type='submit' name='truncate' value='" . lang('Truncate') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables/) + ')');\"> <input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables|views/) + ')');\">\n";
- $dbs = get_databases();
- if (count($dbs) != 1) {
- $db = (isset($_POST["target"]) ? $_POST["target"] : DB);
- echo "<p>" . lang('Move to other database') . ($dbs ? ": " . html_select("target", $dbs, $db) : ': <input name="target" value="' . h($db) . '">') . " <input type='submit' name='move' value='" . lang('Move') . "'>\n";
- }
- }
- echo "</form>\n";
-}
-
-echo '<p><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
-if (support("view")) {
- echo '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n";
-}
-if (support("routine")) {
- echo "<h3>" . lang('Routines') . "</h3>\n";
- $routines = routines();
- if ($routines) {
- echo "<table cellspacing='0'>\n";
- echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td>&nbsp;</thead>\n";
- odd('');
- foreach ($routines as $row) {
- echo '<tr' . odd() . '>';
- echo '<th><a href="' . h(ME) . ($row["ROUTINE_TYPE"] == "FUNCTION" ? 'callf=' : 'call=') . urlencode($row["ROUTINE_NAME"]) . '">' . h($row["ROUTINE_NAME"]) . '</a>';
- echo '<td>' . h($row["ROUTINE_TYPE"]);
- echo '<td>' . h($row["DTD_IDENTIFIER"]);
- echo '<td><a href="' . h(ME) . ($row["ROUTINE_TYPE"] == "FUNCTION" ? 'function=' : 'procedure=') . urlencode($row["ROUTINE_NAME"]) . '">' . lang('Alter') . "</a>";
+ echo "<tr><td>&nbsp;<th>" . lang('%d in total', count($tables_list));
+ echo "<td>" . $connection->result("SELECT @@storage_engine");
+ echo "<td>" . db_collation(DB, collations());
+ foreach ($sums as $key => $val) {
+ echo "<td align='right' id='sum-$key'>&nbsp;";
}
echo "</table>\n";
+ if (!information_schema(DB)) {
+ echo "<p><input type='hidden' name='token' value='$token'>" . ($driver == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> " : "") . "<input type='submit' name='truncate' value='" . lang('Truncate') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables/) + ')');\"> <input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables|views/) + ')');\">\n";
+ $dbs = get_databases();
+ if (count($dbs) != 1) {
+ $db = (isset($_POST["target"]) ? $_POST["target"] : DB);
+ echo "<p>" . lang('Move to other database') . ($dbs ? ": " . html_select("target", $dbs, $db) : ': <input name="target" value="' . h($db) . '">') . " <input type='submit' name='move' value='" . lang('Move') . "'>\n";
+ }
+ }
+ echo "</form>\n";
}
- echo '<p><a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a> <a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n";
-}
-
-if (support("event")) {
- echo "<h3>" . lang('Events') . "</h3>\n";
- $result = $connection->query("SHOW EVENTS");
- if ($result && $result->num_rows) {
- echo "<table cellspacing='0'>\n";
- echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "</thead>\n";
- while ($row = $result->fetch_assoc()) {
- echo "<tr>";
- echo '<th><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . h($row["Name"]) . "</a>";
- echo "<td>" . ($row["Execute at"] ? lang('At given time') . "<td>" . $row["Execute at"] : lang('Every') . " " . $row["Interval value"] . " " . $row["Interval field"] . "<td>$row[Starts]");
- echo "<td>$row[Ends]";
+
+ echo '<p><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
+ if (support("view")) {
+ echo '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n";
+ }
+ if (support("routine")) {
+ echo "<h3>" . lang('Routines') . "</h3>\n";
+ $routines = routines();
+ if ($routines) {
+ echo "<table cellspacing='0'>\n";
+ echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td>&nbsp;</thead>\n";
+ odd('');
+ foreach ($routines as $row) {
+ echo '<tr' . odd() . '>';
+ echo '<th><a href="' . h(ME) . ($row["ROUTINE_TYPE"] == "FUNCTION" ? 'callf=' : 'call=') . urlencode($row["ROUTINE_NAME"]) . '">' . h($row["ROUTINE_NAME"]) . '</a>';
+ echo '<td>' . h($row["ROUTINE_TYPE"]);
+ echo '<td>' . h($row["DTD_IDENTIFIER"]);
+ echo '<td><a href="' . h(ME) . ($row["ROUTINE_TYPE"] == "FUNCTION" ? 'function=' : 'procedure=') . urlencode($row["ROUTINE_NAME"]) . '">' . lang('Alter') . "</a>";
+ }
+ echo "</table>\n";
}
- echo "</table>\n";
+ echo '<p><a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a> <a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n";
}
- echo '<p><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
-}
-
-page_footer();
-$table_status = table_status();
-if ($table_status) {
- echo "<script type='text/javascript'>\n";
- foreach ($table_status as $row) {
- $id = addcslashes($row["Name"], "\\'/");
- echo "setHtml('Comment-$id', '" . nbsp($row["Comment"]) . "');\n";
- if (!eregi("view", $row["Engine"])) {
- foreach (array("Engine", "Collation") as $key) {
- echo "setHtml('$key-$id', '" . nbsp($row[$key]) . "');\n";
+
+ if (support("event")) {
+ echo "<h3>" . lang('Events') . "</h3>\n";
+ $result = $connection->query("SHOW EVENTS");
+ if ($result && $result->num_rows) {
+ echo "<table cellspacing='0'>\n";
+ echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "</thead>\n";
+ while ($row = $result->fetch_assoc()) {
+ echo "<tr>";
+ echo '<th><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . h($row["Name"]) . "</a>";
+ echo "<td>" . ($row["Execute at"] ? lang('At given time') . "<td>" . $row["Execute at"] : lang('Every') . " " . $row["Interval value"] . " " . $row["Interval field"] . "<td>$row[Starts]");
+ echo "<td>$row[Ends]";
}
- foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) {
- if ($row[$key] != "") {
- $val = number_format($row[$key], 0, '.', lang(','));
- echo "setHtml('$key-$id', '" . ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "');\n";
- if (isset($sums[$key])) {
- $sums[$key] += ($row["Engine"] != "InnoDB" || $key != "Data_free" ? $row[$key] : 0);
+ echo "</table>\n";
+ }
+ echo '<p><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
+ }
+
+ page_footer();
+ $table_status = table_status();
+ if ($table_status) {
+ echo "<script type='text/javascript'>\n";
+ foreach ($table_status as $row) {
+ $id = addcslashes($row["Name"], "\\'/");
+ echo "setHtml('Comment-$id', '" . nbsp($row["Comment"]) . "');\n";
+ if (!eregi("view", $row["Engine"])) {
+ foreach (array("Engine", "Collation") as $key) {
+ echo "setHtml('$key-$id', '" . nbsp($row[$key]) . "');\n";
+ }
+ foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) {
+ if ($row[$key] != "") {
+ $val = number_format($row[$key], 0, '.', lang(','));
+ echo "setHtml('$key-$id', '" . ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "');\n";
+ if (isset($sums[$key])) {
+ $sums[$key] += ($row["Engine"] != "InnoDB" || $key != "Data_free" ? $row[$key] : 0);
+ }
+ } elseif (array_key_exists($key, $row)) {
+ echo "setHtml('$key-$id');\n";
}
- } elseif (array_key_exists($key, $row)) {
- echo "setHtml('$key-$id');\n";
}
}
}
+ foreach ($sums as $key => $val) {
+ echo "setHtml('sum-$key', '" . number_format($val, 0, '.', lang(',')) . "');\n";
+ }
+ echo "</script>\n";
}
- foreach ($sums as $key => $val) {
- echo "setHtml('sum-$key', '" . number_format($val, 0, '.', lang(',')) . "');\n";
- }
- echo "</script>\n";
+ exit; // page_footer() already called
}
-exit; // page_footer() already called
@@ -490,7 +490,7 @@ function show_status() {
}
function support($feature) {
- return ereg('^(trigger|drop_col)$', $feature); //! view|routine|
+ return ereg('^(trigger|drop_col)$', $feature); //! view|routine|scheme|
}
$driver = "mssql";
@@ -755,6 +755,28 @@ function explain($connection, $query) {
return $connection->query("EXPLAIN $query");
}
+ /** Get existing schemas
+ * @return array
+ */
+ function schemas() {
+ return array();
+ }
+
+ /** Get current schema
+ * @return string
+ */
+ function get_schema() {
+ return "";
+ }
+
+ /** Set current schema
+ * @param string
+ * @return bool
+ */
+ function set_schema($schema) {
+ return true;
+ }
+
/** Get SQL command to create table
* @param string
* @return string
@@ -810,7 +832,7 @@ function show_status() {
*/
function support($feature) {
global $connection;
- return ($connection->server_info >= 5.1 || ($connection->server_info >= 5 && !ereg("event|partitioning")) || !ereg("view|routine|trigger"));
+ return !ereg("scheme" . ($connection->server_info < 5.1 ? "|event|partitioning" . ($connection->server_info < 5 ? "|view|routine|trigger" : "") : ""), $feature);
}
$driver = "sql"; ///< @var string JUSH identifier
@@ -452,12 +452,26 @@ function explain($connection, $query) {
return $connection->query("EXPLAIN $query");
}
+ function schemas() {
+ return get_vals("SELECT nspname FROM pg_namespace");
+ }
+
+ function get_schema() {
+ global $connection;
+ return $connection->result("SELECT current_schema()");
+ }
+
+ function set_schema($schema) {
+ global $connection;
+ return $connection->query("SET search_path TO " . idf_escape($schema));
+ }
+
function use_sql($database) {
return "\connect " . idf_escape($database);
}
function support($feature) {
- return ereg('^(comment|view|trigger|drop_col)$', $feature); //! routine|
+ return ereg('^(comment|view|scheme|trigger|drop_col)$', $feature); //! routine|sequence|
}
$driver = "pgsql";
@@ -496,6 +496,18 @@ function explain($connection, $query) {
return $connection->query("EXPLAIN $query");
}
+ function schemas() {
+ return array();
+ }
+
+ function get_schema() {
+ return "";
+ }
+
+ function set_schema($scheme) {
+ return true;
+ }
+
function create_sql($table) {
global $connection;
return $connection->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . $connection->quote($table));
@@ -506,32 +506,40 @@ function navigation($missing) {
<p>
<?php hidden_fields_get(); ?>
<?php echo ($databases ? html_select("db", array("" => "(" . lang('database') . ")") + $databases, DB, "this.form.submit();") : '<input name="db" value="' . h(DB) . '">'); ?>
-<?php if (isset($_GET["sql"])) { ?><input type="hidden" name="sql" value=""><?php } ?>
-<?php if (isset($_GET["schema"])) { ?><input type="hidden" name="schema" value=""><?php } ?>
-<?php if (isset($_GET["dump"])) { ?><input type="hidden" name="dump" value=""><?php } ?>
<input type="submit" value="<?php echo lang('Use'); ?>"<?php echo ($databases ? " class='hidden'" : ""); ?>>
-</p>
-</form>
<?php
if ($missing != "db" && DB != "" && $connection->select_db(DB)) {
- $tables = tables_list();
- if (!$tables) {
- echo "<p class='message'>" . lang('No tables.') . "\n";
- } else {
- $this->tablesPrint($tables);
- $links = array();
- foreach ($tables as $table => $type) {
- $links[] = preg_quote($table, '/');
+ if (support("scheme")) {
+ echo "<br>" . html_select("ns", array("" => "(" . lang('schema') . ")") + schemas(), $_GET["ns"], "this.form.submit();");
+ if ($_GET["ns"] != "") {
+ set_schema($_GET["ns"]);
}
- echo "<script type='text/javascript'>\n";
- echo "var jushLinks = { $driver: [ '" . addcslashes(h(ME), "\\'/") . "table=\$&', /\\b(" . implode("|", $links) . ")\\b/g ] };\n";
- foreach (array("bac", "bra", "sqlite_quo", "mssql_bra") as $val) {
- echo "jushLinks.$val = jushLinks.$driver;\n";
+ }
+ if ($_GET["ns"] !== "") {
+ $tables = tables_list();
+ if (!$tables) {
+ echo "<p class='message'>" . lang('No tables.') . "\n";
+ } else {
+ $this->tablesPrint($tables);
+ $links = array();
+ foreach ($tables as $table => $type) {
+ $links[] = preg_quote($table, '/');
+ }
+ echo "<script type='text/javascript'>\n";
+ echo "var jushLinks = { $driver: [ '" . addcslashes(h(ME), "\\'/") . "table=\$&', /\\b(" . implode("|", $links) . ")\\b/g ] };\n";
+ foreach (array("bac", "bra", "sqlite_quo", "mssql_bra") as $val) {
+ echo "jushLinks.$val = jushLinks.$driver;\n";
+ }
+ echo "</script>\n";
}
- echo "</script>\n";
+ echo '<p><a href="' . h(ME) . 'create=">' . bold(lang('Create new table'), $_GET["create"] === "") . "</a>\n";
}
- echo '<p><a href="' . h(ME) . 'create=">' . bold(lang('Create new table'), $_GET["create"] === "") . "</a>\n";
}
+ echo (isset($_GET["sql"]) ? '<input type="hidden" name="sql" value="">'
+ : (isset($_GET["schema"]) ? '<input type="hidden" name="schema" value="">'
+ : (isset($_GET["dump"]) ? '<input type="hidden" name="dump" value="">'
+ : "")));
+ echo "</form>\n";
}
}
Oops, something went wrong.

0 comments on commit 6420c58

Please sign in to comment.