From 737c2bdc0eaf178658d08a79303fd34dc47ddc02 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Wed, 30 Jan 2013 23:40:26 -0800 Subject: [PATCH] Recover original view, trigger, routine if creating fails (bug #3601088) --- adminer/include/editing.inc.php | 57 ++++++++++++++++++++++++++++----- adminer/procedure.inc.php | 45 ++++++++++---------------- adminer/trigger.inc.php | 35 +++++++++----------- adminer/view.inc.php | 37 +++++++++++---------- changes.txt | 1 + 5 files changed, 101 insertions(+), 74 deletions(-) diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 7514b2ed..21de175a 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -338,23 +338,64 @@ function grant($grant, $privileges, $columns, $on) { /** Drop old object and create a new one * @param string drop query * @param string create query +* @param string rollback query * @param string * @param string * @param string * @param string * @param string -* @return bool dropped +* @return null redirect in success */ -function drop_create($drop, $create, $location, $message_drop, $message_alter, $message_create, $name) { +function drop_create($drop, $create, $rollback, $location, $message_drop, $message_alter, $message_create, $name) { if ($_POST["drop"]) { - return query_redirect($drop, $location, $message_drop, true, !$_POST["dropped"]); + query_redirect($drop, $location, $message_drop); + } else { + if ($name != "") { + queries($drop); + } + queries_redirect($location, ($name != "" ? $message_alter : $message_create), queries($create)); + if ($name != "") { + queries($rollback); + } } - $dropped = $name != "" && ($_POST["dropped"] || queries($drop)); - $created = queries($create); - if (!queries_redirect($location, ($name != "" ? $message_alter : $message_create), $created) && $dropped) { - redirect(null, $message_drop); +} + +/** Generate SQL query for creating trigger +* @param string +* @return array result of trigger() +*/ +function create_trigger($on, $row) { + global $jush; + $timing_event = " $row[Timing] $row[Event]"; + return "CREATE TRIGGER " + . idf_escape($row["Trigger"]) + . ($jush == "mssql" ? $on . $timing_event : $timing_event . $on) + . rtrim(" $row[Type]\n$row[Statement]", ";") + . ";"; +} + +/** Generate SQL query for creating routine +* @param string "PROCEDURE" or "FUNCTION" +* @param array result of routine() +* @return string +*/ +function create_routine($routine, $row) { + global $inout; + $set = array(); + $fields = (array) $row["fields"]; + ksort($fields); // enforce fields order + foreach ($fields as $field) { + if ($field["field"] != "") { + $set[] = (ereg("^($inout)\$", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET"); + } } - return $dropped; + return "CREATE $routine " + . idf_escape(trim($row["name"])) + . " (" . implode(", ", $set) . ")" + . (isset($_GET["function"]) ? " RETURNS" . process_type($row["returns"], "CHARACTER SET") : "") + . ($row["language"] ? " LANGUAGE $row[language]" : "") + . rtrim("\n$row[definition]", ";") + . ";"; } /** Remove current user definer from SQL command diff --git a/adminer/procedure.inc.php b/adminer/procedure.inc.php index ef039a36..aa3e8775 100644 --- a/adminer/procedure.inc.php +++ b/adminer/procedure.inc.php @@ -2,41 +2,31 @@ $PROCEDURE = $_GET["procedure"]; $routine = (isset($_GET["function"]) ? "FUNCTION" : "PROCEDURE"); $routine_languages = routine_languages(); +$row = ($PROCEDURE == "" ? array("fields" => array()) : routine($PROCEDURE, $routine)); +$row["name"] = $PROCEDURE; -$dropped = false; -if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) { - $set = array(); - $fields = (array) $_POST["fields"]; - ksort($fields); // enforce fields order - foreach ($fields as $field) { - if ($field["field"] != "") { - $set[] = (ereg("^($inout)\$", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET"); - } +if ($_POST) { + if (!$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) { + drop_create( + "DROP $routine " . idf_escape($PROCEDURE), + create_routine($routine, $_POST), + create_routine($routine, $row), + substr(ME, 0, -1), + lang('Routine has been dropped.'), + lang('Routine has been altered.'), + lang('Routine has been created.'), + $PROCEDURE + ); } - $dropped = drop_create( - "DROP $routine " . idf_escape($PROCEDURE), - "CREATE $routine " . idf_escape(trim($_POST["name"])) . " (" . implode(", ", $set) . ")" . (isset($_GET["function"]) ? " RETURNS" . process_type($_POST["returns"], "CHARACTER SET") : "") . (in_array($_POST["language"], $routine_languages) ? " LANGUAGE $_POST[language]" : "") . rtrim("\n$_POST[definition]", ";") . ";", - substr(ME, 0, -1), - lang('Routine has been dropped.'), - lang('Routine has been altered.'), - lang('Routine has been created.'), - $PROCEDURE - ); + $row = $_POST; + $row["fields"] = (array) $row["fields"]; + process_fields($row["fields"]); } page_header(($PROCEDURE != "" ? (isset($_GET["function"]) ? lang('Alter function') : lang('Alter procedure')) . ": " . h($PROCEDURE) : (isset($_GET["function"]) ? lang('Create function') : lang('Create procedure'))), $error); $collations = get_vals("SHOW CHARACTER SET"); sort($collations); -$row = array("fields" => array()); -if ($_POST) { - $row = $_POST; - $row["fields"] = (array) $row["fields"]; - process_fields($row["fields"]); -} elseif ($PROCEDURE != "") { - $row = routine($PROCEDURE, $routine); - $row["name"] = $PROCEDURE; -} ?>
@@ -55,6 +45,5 @@ if (isset($_GET["function"])) {

> -

diff --git a/adminer/trigger.inc.php b/adminer/trigger.inc.php index 902dad4e..73826962 100644 --- a/adminer/trigger.inc.php +++ b/adminer/trigger.inc.php @@ -2,28 +2,26 @@ $TABLE = $_GET["trigger"]; $trigger_options = trigger_options(); $trigger_event = array("INSERT", "UPDATE", "DELETE"); +$row = (array) trigger($_GET["name"]) + array("Trigger" => $TABLE . "_bi"); -$dropped = false; -if ($_POST && !$error && in_array($_POST["Timing"], $trigger_options["Timing"]) && in_array($_POST["Event"], $trigger_event) && in_array($_POST["Type"], $trigger_options["Type"])) { - $timing_event = " $_POST[Timing] $_POST[Event]"; - $on = " ON " . table($TABLE); - $dropped = drop_create( - "DROP TRIGGER " . idf_escape($_GET["name"]) . ($jush == "pgsql" ? $on : ""), - "CREATE TRIGGER " . idf_escape($_POST["Trigger"]) . ($jush == "mssql" ? $on . $timing_event : $timing_event . $on) . rtrim(" $_POST[Type]\n$_POST[Statement]", ";") . ";", - ME . "table=" . urlencode($TABLE), - lang('Trigger has been dropped.'), - lang('Trigger has been altered.'), - lang('Trigger has been created.'), - $_GET["name"] - ); +if ($_POST) { + if (!$error && in_array($_POST["Timing"], $trigger_options["Timing"]) && in_array($_POST["Event"], $trigger_event) && in_array($_POST["Type"], $trigger_options["Type"])) { + $on = " ON " . table($TABLE); + drop_create( + "DROP TRIGGER " . idf_escape($_GET["name"]) . ($jush == "pgsql" ? $on : ""), + create_trigger($on, $_POST), + create_trigger($on, $row + array("Type" => reset($trigger_options["Type"]))), + ME . "table=" . urlencode($TABLE), + lang('Trigger has been dropped.'), + lang('Trigger has been altered.'), + lang('Trigger has been created.'), + $_GET["name"] + ); + } + $row = $_POST; } page_header(($_GET["name"] != "" ? lang('Alter trigger') . ": " . h($_GET["name"]) : lang('Create trigger')), $error, array("table" => $TABLE)); - -$row = $_POST; -if (!$row) { - $row = trigger($_GET["name"]) + array("Trigger" => $TABLE . "_bi"); -} ?>
@@ -37,6 +35,5 @@ if (!$row) {

> -

diff --git a/adminer/view.inc.php b/adminer/view.inc.php index 8197bab2..8f300ec4 100644 --- a/adminer/view.inc.php +++ b/adminer/view.inc.php @@ -1,33 +1,32 @@ $TABLE), $TABLE); - -$row = $_POST; -if (!$row && $TABLE != "") { - $row = view($TABLE); - $row["name"] = $TABLE; -} ?>

: " maxlength="64" autocapitalize="off">

- > diff --git a/changes.txt b/changes.txt index db9f15f2..e68575f5 100644 --- a/changes.txt +++ b/changes.txt @@ -1,4 +1,5 @@ Adminer 3.6.4-dev: +Recover original view, trigger, routine if creating fails Disable autocapitalize in identifiers Indeterminate state of select all checkboxes