add enable/disable trigger. Patch from John Jay for google soc
authorxzilla <xzilla>
Sun, 13 Aug 2006 15:31:13 +0000 (15:31 +0000)
committerxzilla <xzilla>
Sun, 13 Aug 2006 15:31:13 +0000 (15:31 +0000)
HISTORY
TODO
classes/database/Postgres.php
classes/database/Postgres74.php
classes/database/Postgres81.php
lang/english.php
lang/recoded/english.php
triggers.php

diff --git a/HISTORY b/HISTORY
index 62bf3c544ccd30d8704321284d74cdfc67d75ae3..fa824cdb3900a6519074bab9e62aa142edb03314 100644 (file)
--- 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 161ef8e07fef40c4eca7f51101d6b36f57340808..0f2aaf5045193d10f266ba418dc7999bfee49f34 100644 (file)
--- 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
 ----------
index 7283576f8c433d3532f97c27784d4acec9c33902..5599f7062bd07c33e5d9aa408c9cb638db62b6de 100755 (executable)
@@ -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; }
-
 }
 
 ?>
index 72427c32d5195b9dd9aa871cd79e56ed357487ea..76d4f2f9a0841d3d51a2698e2a1392e4ee08b412 100644 (file)
@@ -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}'))
index b90c187d5ece6f0f5fb6dbb3010492310c5a58e4..1f2afc24c0883549a4c934ca57f1fe59646f0512 100644 (file)
@@ -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; }
 }
 
 ?>
index 2d75121e5eaa960f19a968401edf04e5a7741561..5eab614db64e90c409834872f763db4640b25919 100755 (executable)
@@ -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';
        $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';
index cf917482d5a4a69cbd6cc9e39397bb9e39d6546f..7834f9d14671259d72c4ebe9f280f87b648a1d07 100644 (file)
@@ -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';
        $lang['strtriggercreated'] = 'Trigger created.';
        $lang['strtriggercreatedbad'] = 'Trigger creation failed.';
        $lang['strconfdroptrigger'] = 'Are you sure you want to drop the trigger &quot;%s&quot; on &quot;%s&quot;?';
+       $lang['strconfenabletrigger'] = 'Are you sure you want to enable the trigger &quot;%s&quot; on &quot;%s&quot;?';
+       $lang['strconfdisabletrigger'] = 'Are you sure you want to disable the trigger &quot;%s&quot; on &quot;%s&quot;?';
        $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';
index d223ce33221a31eb5c1ead1888709b59081b31ff..38c88f8b0159a4d53f3a337e4a5a8ca112ae999b 100644 (file)
@@ -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
 
        }
 
+       /**
+        * 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 "<p>", sprintf($lang['strconfenabletrigger'], $misc->printVal($_REQUEST['trigger']),
+                               $misc->printVal($_REQUEST['table'])), "</p>\n";
+
+                       echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
+                       echo "<input type=\"hidden\" name=\"action\" value=\"enable\" />\n";
+                       echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
+                       echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
+                       echo $misc->form;
+                       echo "<input type=\"submit\" name=\"yes\" value=\"{$lang['stryes']}\" />\n";
+                       echo "<input type=\"submit\" name=\"no\" value=\"{$lang['strno']}\" />\n";
+                       echo "</form>\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 "<p>", sprintf($lang['strconfdisabletrigger'], $misc->printVal($_REQUEST['trigger']),
+                               $misc->printVal($_REQUEST['table'])), "</p>\n";
+
+                       echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
+                       echo "<input type=\"hidden\" name=\"action\" value=\"disable\" />\n";
+                       echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
+                       echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
+                       echo $misc->form;
+                       echo "<input type=\"submit\" name=\"yes\" value=\"{$lang['stryes']}\" />\n";
+                       echo "<input type=\"submit\" name=\"no\" value=\"{$lang['strno']}\" />\n";
+                       echo "</form>\n";
+               }
+               else {
+                       $status = $data->disableTrigger($_POST['trigger'], $_POST['table']);
+                       if ($status == 0)
+                               doDefault($lang['strtriggerdisabled']);
+                       else
+                               doDefault($lang['strtriggerdisabledbad']);
+               }
+
+       }
+
        /**
         * Let them create s.th.
         */
                                '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&amp;{$misc->href}&amp;table=".urlencode($_REQUEST['table'])."&amp;",
+                                       'vars'  => array('trigger' => 'tgname'),
+                               );
+                       } else {
+                               $actions['disable'] = array(
+                                       'title' => $lang['strdisable'],
+                                       'url'   => "{$PHP_SELF}?action=confirm_disable&amp;{$misc->href}&amp;table=".urlencode($_REQUEST['table'])."&amp;",
+                                       'vars'  => array('trigger' => 'tgname'),
+                               );
+                       }
+               }
 
                if (!$data->hasAlterTrigger()) unset($actions['alter']);
                
                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();
                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;