diff --git a/adminer/drivers/mssql.inc.php b/adminer/drivers/mssql.inc.php index ab19737c..c0b6268e 100644 --- a/adminer/drivers/mssql.inc.php +++ b/adminer/drivers/mssql.inc.php @@ -567,6 +567,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table) function trigger_options() { return array( "Timing" => array("AFTER", "INSTEAD OF"), + "Event" => array("INSERT", "UPDATE", "DELETE"), "Type" => array("AS"), ); } diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 1357fd0d..7068ac0d 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -755,7 +755,7 @@ if (!defined("DRIVER")) { /** Get information about trigger * @param string trigger name - * @return array array("Trigger" => , "Timing" => , "Event" => , "Type" => , "Statement" => ) + * @return array array("Trigger" => , "Timing" => , "Event" => , "Of" => , "Type" => , "Statement" => ) */ function trigger($name) { if ($name == "") { @@ -778,12 +778,12 @@ if (!defined("DRIVER")) { } /** Get trigger options - * @return array ("Timing" => array(), "Type" => array()) + * @return array ("Timing" => array(), "Event" => array(), "Type" => array()) */ function trigger_options() { return array( "Timing" => array("BEFORE", "AFTER"), - // Event is always INSERT, UPDATE, DELETE + "Event" => array("INSERT", "UPDATE", "DELETE"), "Type" => array("FOR EACH ROW"), ); } diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 637d0ad9..abd0c578 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -507,6 +507,7 @@ ORDER BY conkey, conname") as $row) { function trigger_options() { return array( "Timing" => array("BEFORE", "AFTER"), + "Event" => array("INSERT", "UPDATE", "DELETE"), "Type" => array("FOR EACH ROW", "FOR EACH STATEMENT"), ); } diff --git a/adminer/drivers/sqlite.inc.php b/adminer/drivers/sqlite.inc.php index 6f63d4cc..428d3e5f 100644 --- a/adminer/drivers/sqlite.inc.php +++ b/adminer/drivers/sqlite.inc.php @@ -634,18 +634,21 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { if ($name == "") { return array("Statement" => "BEGIN\n\t;\nEND"); } + $idf = '(?:[^`"\\s]+|`[^`]*`|"[^"]*")+'; + $trigger_options = trigger_options(); preg_match( - '~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(BEFORE|AFTER|INSTEAD\\s+OF)\\s+([a-z]+)\\s+ON\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(?:FOR\\s*EACH\\s*ROW\\s)?(.*)~is', + "~^CREATE\\s+TRIGGER\\s*$idf\\s*(" . implode("|", $trigger_options["Timing"]) . ")\\s+([a-z]+)(?:\\s+OF\\s+($idf))?\\s+ON\\s*$idf\\s*(?:FOR\\s+EACH\\s+ROW\\s)?(.*)~is", $connection->result("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = " . q($name)), $match ); - return array("Timing" => strtoupper($match[1]), "Event" => strtoupper($match[2]), "Trigger" => $name, "Statement" => $match[3]); + return array("Timing" => strtoupper($match[1]), "Event" => strtoupper($match[2]), "Of" => $match[3], "Trigger" => $name, "Statement" => $match[4]); } function triggers($table) { $return = array(); + $trigger_options = trigger_options(); foreach (get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)) as $row) { - preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*([a-z]+)\\s*([a-z]+)~i', $row["sql"], $match); + preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(' . implode("|", $trigger_options["Timing"]) . ')\\s*(.*)\\s+ON\\b~iU', $row["sql"], $match); $return[$row["name"]] = array($match[1], $match[2]); } return $return; @@ -654,6 +657,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { function trigger_options() { return array( "Timing" => array("BEFORE", "AFTER", "INSTEAD OF"), + "Event" => array("INSERT", "UPDATE", "UPDATE OF", "DELETE"), "Type" => array("FOR EACH ROW"), ); } diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 4da94da2..6f16373f 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -394,7 +394,7 @@ function drop_create($drop, $create, $drop_created, $test, $drop_test, $location */ function create_trigger($on, $row) { global $jush; - $timing_event = " $row[Timing] $row[Event]"; + $timing_event = " $row[Timing] $row[Event]" . ($row["Event"] == "UPDATE OF" ? " " . idf_escape($row["Of"]) : ""); return "CREATE TRIGGER " . idf_escape($row["Trigger"]) . ($jush == "mssql" ? $on . $timing_event : $timing_event . $on) diff --git a/adminer/static/editing.js b/adminer/static/editing.js index ac5a08b2..55628622 100644 --- a/adminer/static/editing.js +++ b/adminer/static/editing.js @@ -488,6 +488,21 @@ function indexesAddColumn(field, prefix) { +/** Handle changing trigger time or event +* @param RegExp +* @param string +* @param HTMLFormElement +*/ +function triggerChange(tableRe, table, form) { + var formEvent = selectValue(form['Event']); + if (tableRe.test(form['Trigger'].value)) { + form['Trigger'].value = table + '_' + (selectValue(form['Timing']).charAt(0) + formEvent.charAt(0)).toLowerCase(); + } + alterClass(form['Of'], 'hidden', formEvent != 'UPDATE OF'); +} + + + var that, x, y; // em and tablePos defined in schema.inc.php /** Get mouse position @@ -565,6 +580,8 @@ function schemaMouseup(ev, db) { } } + + var helpOpen, helpIgnore; // when mouse outs