From ec552fbf755fd73531c672ca3d0d522993e7e5cf Mon Sep 17 00:00:00 2001 From: xzilla Date: Sun, 13 Aug 2006 15:31:13 +0000 Subject: [PATCH] add enable/disable trigger. Patch from John Jay for google soc --- HISTORY | 2 + TODO | 2 +- classes/database/Postgres.php | 6 +- classes/database/Postgres74.php | 4 +- classes/database/Postgres81.php | 34 +++++++++++- lang/english.php | 10 +++- lang/recoded/english.php | 10 +++- triggers.php | 97 ++++++++++++++++++++++++++++++++- 8 files changed, 155 insertions(+), 10 deletions(-) diff --git a/HISTORY b/HISTORY index 62bf3c54..fa824cdb 100644 --- a/HISTORY +++ b/HISTORY @@ -20,6 +20,8 @@ Features * Add Support For IN/OUT Parameters (John Jawed) * Add column level information into the tree browser (ioguix) * Promote column level interaction into its own page (ioguix) +* Add automatic lookup of foreign key values in insert/update fields (John Jawed) +* Add enable/disable trigger Version 4.0 ----------- diff --git a/TODO b/TODO index 161ef8e0..0f2aaf50 100644 --- a/TODO +++ b/TODO @@ -127,7 +127,7 @@ Triggers -------- * Allow functions from other schemas. -* Support ENABLE/DISABLE trigger in 8.1 +* -Support ENABLE/DISABLE trigger in 8.1 (Jawed) Aggregates ---------- diff --git a/classes/database/Postgres.php b/classes/database/Postgres.php index 7283576f..5599f706 100755 --- a/classes/database/Postgres.php +++ b/classes/database/Postgres.php @@ -4,7 +4,7 @@ * A class that implements the DB interface for Postgres * Note: This class uses ADODB and returns RecordSets. * - * $Id: Postgres.php,v 1.288 2006/08/09 21:19:44 xzilla Exp $ + * $Id: Postgres.php,v 1.289 2006/08/13 15:31:13 xzilla Exp $ */ // @@@ THOUGHT: What about inherits? ie. use of ONLY??? @@ -3038,7 +3038,7 @@ class Postgres extends ADODB_base { // We include constraint triggers $sql = "SELECT t.tgname, t.tgisconstraint, t.tgdeferrable, t.tginitdeferred, t.tgtype, - t.tgargs, t.tgnargs, t.tgconstrrelid, + t.tgargs, t.tgnargs, t.tgconstrrelid, (SELECT relname FROM pg_class c2 WHERE c2.oid=t.tgconstrrelid) AS tgconstrrelname, (SELECT proname FROM pg_proc p WHERE t.tgfoid=p.oid) AS tgfname, c.relname, NULL AS tgdef @@ -4633,8 +4633,8 @@ class Postgres extends ADODB_base { function hasAlterSequence() { return false; } function hasLocksView() { return false; } function hasPreparedXacts() { return false; } + function hasDisableTriggers() { return false; } function hasAlterAggregate() { return false; } - } ?> diff --git a/classes/database/Postgres74.php b/classes/database/Postgres74.php index 72427c32..76d4f2f9 100644 --- a/classes/database/Postgres74.php +++ b/classes/database/Postgres74.php @@ -4,7 +4,7 @@ * A class that implements the DB interface for Postgres * Note: This class uses ADODB and returns RecordSets. * - * $Id: Postgres74.php,v 1.53 2006/08/09 21:19:44 xzilla Exp $ + * $Id: Postgres74.php,v 1.54 2006/08/13 15:31:13 xzilla Exp $ */ include_once('./classes/database/Postgres73.php'); @@ -242,7 +242,7 @@ class Postgres74 extends Postgres73 { function getTriggers($table = '') { $this->clean($table); - $sql = "SELECT t.tgname, pg_catalog.pg_get_triggerdef(t.oid) AS tgdef + $sql = "SELECT t.tgname, pg_catalog.pg_get_triggerdef(t.oid) AS tgdef, t.tgenabled FROM pg_catalog.pg_trigger t WHERE t.tgrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}' AND relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$this->_schema}')) diff --git a/classes/database/Postgres81.php b/classes/database/Postgres81.php index b90c187d..1f2afc24 100644 --- a/classes/database/Postgres81.php +++ b/classes/database/Postgres81.php @@ -3,7 +3,7 @@ /** * PostgreSQL 8.1 support * - * $Id: Postgres81.php,v 1.9 2006/07/18 19:01:46 xzilla Exp $ + * $Id: Postgres81.php,v 1.10 2006/08/13 15:31:13 xzilla Exp $ */ include_once('./classes/database/Postgres80.php'); @@ -266,12 +266,44 @@ class Postgres81 extends Postgres80 { return $this->selectSet($sql); } + + /** + * Enables a trigger + * @param $tgname The name of the trigger to enable + * @param $table The table in which to enable the trigger + * @return 0 success + */ + function enableTrigger($tgname, $table) { + $this->fieldClean($tgname); + $this->fieldClean($table); + + $sql = "ALTER TABLE \"{$table}\" ENABLE TRIGGER \"{$tgname}\""; + + return $this->execute($sql); + } + + /** + * Disables a trigger + * @param $tgname The name of the trigger to disable + * @param $table The table in which to disable the trigger + * @return 0 success + */ + function disableTrigger($tgname, $table) { + $this->fieldClean($tgname); + $this->fieldClean($table); + + $sql = "ALTER TABLE \"{$table}\" DISABLE TRIGGER \"{$tgname}\""; + + return $this->execute($sql); + } + // Capabilities function hasServerAdminFuncs() { return true; } function hasRoles() { return true; } function hasAutovacuum() { return true; } function hasPreparedXacts() { return true; } + function hasDisableTriggers() { return true; } } ?> diff --git a/lang/english.php b/lang/english.php index 2d75121e..5eab614d 100755 --- a/lang/english.php +++ b/lang/english.php @@ -4,7 +4,7 @@ * English language file for phpPgAdmin. Use this as a basis * for new translations. * - * $Id: english.php,v 1.194 2006/08/09 21:19:44 xzilla Exp $ + * $Id: english.php,v 1.195 2006/08/13 15:31:13 xzilla Exp $ */ // Language and character set @@ -41,6 +41,8 @@ $lang['strdefinition'] = 'Definition'; $lang['strproperties'] = 'Properties'; $lang['strbrowse'] = 'Browse'; + $lang['strenable'] = 'Enable'; + $lang['strdisable'] = 'Disable'; $lang['strdrop'] = 'Drop'; $lang['strdropped'] = 'Dropped'; $lang['strnull'] = 'Null'; @@ -511,8 +513,14 @@ $lang['strtriggercreated'] = 'Trigger created.'; $lang['strtriggercreatedbad'] = 'Trigger creation failed.'; $lang['strconfdroptrigger'] = 'Are you sure you want to drop the trigger "%s" on "%s"?'; + $lang['strconfenabletrigger'] = 'Are you sure you want to enable the trigger "%s" on "%s"?'; + $lang['strconfdisabletrigger'] = 'Are you sure you want to disable the trigger "%s" on "%s"?'; $lang['strtriggerdropped'] = 'Trigger dropped.'; $lang['strtriggerdroppedbad'] = 'Trigger drop failed.'; + $lang['strtriggerenabled'] = 'Trigger enabled.'; + $lang['strtriggerenabledbad'] = 'Trigger enable failed.'; + $lang['strtriggerdisabled'] = 'Trigger disabled.'; + $lang['strtriggerdisabledbad'] = 'Trigger disable failed.'; $lang['strtriggeraltered'] = 'Trigger altered.'; $lang['strtriggeralteredbad'] = 'Trigger alteration failed.'; $lang['strforeach'] = 'For each'; diff --git a/lang/recoded/english.php b/lang/recoded/english.php index cf917482..7834f9d1 100644 --- a/lang/recoded/english.php +++ b/lang/recoded/english.php @@ -4,7 +4,7 @@ * English language file for phpPgAdmin. Use this as a basis * for new translations. * - * $Id: english.php,v 1.147 2006/08/09 21:19:44 xzilla Exp $ + * $Id: english.php,v 1.148 2006/08/13 15:31:13 xzilla Exp $ */ // Language and character set @@ -41,6 +41,8 @@ $lang['strdefinition'] = 'Definition'; $lang['strproperties'] = 'Properties'; $lang['strbrowse'] = 'Browse'; + $lang['strenable'] = 'Enable'; + $lang['strdisable'] = 'Disable'; $lang['strdrop'] = 'Drop'; $lang['strdropped'] = 'Dropped'; $lang['strnull'] = 'Null'; @@ -511,8 +513,14 @@ $lang['strtriggercreated'] = 'Trigger created.'; $lang['strtriggercreatedbad'] = 'Trigger creation failed.'; $lang['strconfdroptrigger'] = 'Are you sure you want to drop the trigger "%s" on "%s"?'; + $lang['strconfenabletrigger'] = 'Are you sure you want to enable the trigger "%s" on "%s"?'; + $lang['strconfdisabletrigger'] = 'Are you sure you want to disable the trigger "%s" on "%s"?'; $lang['strtriggerdropped'] = 'Trigger dropped.'; $lang['strtriggerdroppedbad'] = 'Trigger drop failed.'; + $lang['strtriggerenabled'] = 'Trigger enabled.'; + $lang['strtriggerenabledbad'] = 'Trigger enable failed.'; + $lang['strtriggerdisabled'] = 'Trigger disabled.'; + $lang['strtriggerdisabledbad'] = 'Trigger disable failed.'; $lang['strtriggeraltered'] = 'Trigger altered.'; $lang['strtriggeralteredbad'] = 'Trigger alteration failed.'; $lang['strforeach'] = 'For each'; diff --git a/triggers.php b/triggers.php index d223ce33..38c88f8b 100644 --- a/triggers.php +++ b/triggers.php @@ -3,7 +3,7 @@ /** * List triggers on a table * - * $Id: triggers.php,v 1.29 2006/06/17 12:57:36 xzilla Exp $ + * $Id: triggers.php,v 1.30 2006/08/13 15:31:13 xzilla Exp $ */ // Include application functions @@ -98,6 +98,72 @@ } + /** + * Show confirmation of enable trigger and perform enabling the trigger + */ + function doEnable($confirm) { + global $data, $misc; + global $PHP_SELF, $lang; + + if ($confirm) { + $misc->printTrail('trigger'); + $misc->printTitle($lang['strenable'],'pg.table.alter'); + + echo "

", sprintf($lang['strconfenabletrigger'], $misc->printVal($_REQUEST['trigger']), + $misc->printVal($_REQUEST['table'])), "

\n"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo $misc->form; + echo "\n"; + echo "\n"; + echo "
\n"; + } + else { + $status = $data->enableTrigger($_POST['trigger'], $_POST['table']); + if ($status == 0) + doDefault($lang['strtriggerenabled']); + else + doDefault($lang['strtriggerenabledbad']); + } + + } + + /** + * Show confirmation of disable trigger and perform disabling the trigger + */ + function doDisable($confirm) { + global $data, $misc; + global $PHP_SELF, $lang; + + if ($confirm) { + $misc->printTrail('trigger'); + $misc->printTitle($lang['strdisable'],'pg.table.alter'); + + echo "

", sprintf($lang['strconfdisabletrigger'], $misc->printVal($_REQUEST['trigger']), + $misc->printVal($_REQUEST['table'])), "

\n"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo $misc->form; + echo "\n"; + echo "\n"; + echo "
\n"; + } + else { + $status = $data->disableTrigger($_POST['trigger'], $_POST['table']); + if ($status == 0) + doDefault($lang['strtriggerdisabled']); + else + doDefault($lang['strtriggerdisabledbad']); + } + + } + /** * Let them create s.th. */ @@ -240,6 +306,21 @@ 'vars' => array('trigger' => 'tgname'), ), ); + if($data->hasDisableTriggers()) { + if(!$data->phpBool($triggers->fields["tgenabled"])) { + $actions['enable'] = array( + 'title' => $lang['strenable'], + 'url' => "{$PHP_SELF}?action=confirm_enable&{$misc->href}&table=".urlencode($_REQUEST['table'])."&", + 'vars' => array('trigger' => 'tgname'), + ); + } else { + $actions['disable'] = array( + 'title' => $lang['strdisable'], + 'url' => "{$PHP_SELF}?action=confirm_disable&{$misc->href}&table=".urlencode($_REQUEST['table'])."&", + 'vars' => array('trigger' => 'tgname'), + ); + } + } if (!$data->hasAlterTrigger()) unset($actions['alter']); @@ -259,6 +340,12 @@ case 'confirm_alter': doAlter(); break; + case 'confirm_enable': + doEnable(true); + break; + case 'confirm_disable': + doDisable(true); + break; case 'save_create': if (isset($_POST['cancel'])) doDefault(); else doSaveCreate(); @@ -273,6 +360,14 @@ case 'confirm_drop': doDrop(true); break; + case 'enable': + if (isset($_POST['yes'])) doEnable(false); + else doDefault(); + break; + case 'disable': + if (isset($_POST['yes'])) doDisable(false); + else doDefault(); + break; default: doDefault(); break; -- 2.39.5