* Create trigger screen doesn't save fields if it fails creating trigger
* XML output can't use field names as tag names...
* Backport findObject to pre-7.3
+* Add db comments everywhere
+* Add owner everywhere
+* Proper use of "opbutton" class everywhere
+* Cancel/OK buttons everywhere
* Find object feature
* Support for domains in 7.3 and domain constraints in 7.4
* Add/drop users to/from groups
+* Alter (rename) triggers
Version 3.0
-----------
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: BaseDB.php,v 1.20 2003/07/29 09:07:09 chriskl Exp $
+ * $Id: BaseDB.php,v 1.21 2003/07/30 07:02:30 chriskl Exp $
*/
include_once('classes/database/ADODB_base.php');
function hasSRFs() { return false; }
function hasDomains() { return false; }
function hasDomainConstraints() { return false; }
+ function hasAlterTrigger() { return false; }
}
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: Postgres73.php,v 1.51 2003/07/29 09:07:09 chriskl Exp $
+ * $Id: Postgres73.php,v 1.52 2003/07/30 07:02:30 chriskl Exp $
*/
// @@@ THOUGHT: What about inherits? ie. use of ONLY???
return $this->selectSet($sql);
}
+ /**
+ * Grabs a single trigger
+ * @param $table The name of a table whose triggers to retrieve
+ * @param $trigger The name of the trigger to retrieve
+ * @return A recordset
+ */
+ function &getTrigger($table, $trigger) {
+ $this->clean($table);
+ $this->clean($trigger);
+
+ $sql = "SELECT * FROM pg_catalog.pg_trigger t, pg_catalog.pg_class c
+ WHERE t.tgrelid=c.oid
+ AND c.relname='{$table}'
+ AND t.tgname='{$trigger}'
+ AND c.relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$this->_schema}')";
+
+ return $this->selectSet($sql);
+ }
+
/**
* Grabs a list of triggers on a table
* @param $table The name of a table whose triggers to retrieve
return $this->selectSet($sql);
}
+
+ /**
+ * Alters a trigger
+ * @param $table The name of the table containing the trigger
+ * @param $trigger The name of the trigger to alter
+ * @param $name The new name for the trigger
+ * @return 0 success
+ */
+ function alterTrigger($table, $trigger, $name) {
+ $this->fieldClean($table);
+ $this->fieldClean($trigger);
+ $this->fieldClean($name);
+
+ $sql = "ALTER TRIGGER \"{$trigger}\" ON \"{$table}\" RENAME TO \"{$name}\"";
+
+ return $this->execute($sql);
+ }
// Function functions
function hasDropBehavior() { return true; }
function hasDropColumn() { return true; }
function hasDomains() { return true; }
+ function hasAlterTrigger() { return true; }
}
* English language file for phpPgAdmin. Use this as a basis
* for new translations.
*
- * $Id: english.php,v 1.87 2003/07/30 03:26:27 chriskl Exp $
+ * $Id: english.php,v 1.88 2003/07/30 07:02:30 chriskl Exp $
*/
// Language and character set
$lang['strconfdroptrigger'] = 'Are you sure you want to drop the trigger "%s" on "%s"?';
$lang['strtriggerdropped'] = 'Trigger dropped.';
$lang['strtriggerdroppedbad'] = 'Trigger drop failed.';
+ $lang['strtriggeraltered'] = 'Trigger altered.';
+ $lang['strtriggeralteredbad'] = 'Trigger alter failed.';
// Types
$lang['strtype'] = 'Type';
* English language file for phpPgAdmin. Use this as a basis
* for new translations.
*
- * $Id: english.php,v 1.39 2003/07/30 03:26:27 chriskl Exp $
+ * $Id: english.php,v 1.40 2003/07/30 07:02:31 chriskl Exp $
*/
// Language and character set
$lang['strconfdroptrigger'] = 'Are you sure you want to drop the trigger "%s" on "%s"?';
$lang['strtriggerdropped'] = 'Trigger dropped.';
$lang['strtriggerdroppedbad'] = 'Trigger drop failed.';
+ $lang['strtriggeraltered'] = 'Trigger altered.';
+ $lang['strtriggeralteredbad'] = 'Trigger alter failed.';
// Types
$lang['strtype'] = 'Type';
/**
* List triggers on a table
*
- * $Id: triggers.php,v 1.15 2003/06/17 00:39:43 chriskl Exp $
+ * $Id: triggers.php,v 1.16 2003/07/30 07:02:29 chriskl Exp $
*/
// Include application functions
$action = (isset($_REQUEST['action'])) ? $_REQUEST['action'] : '';
$PHP_SELF = $_SERVER['PHP_SELF'];
+ /**
+ * Function to save after altering a trigger
+ */
+ function doSaveAlter() {
+ global $localData, $lang;
+
+ $status = $localData->alterTrigger($_POST['table'], $_POST['trigger'], $_POST['name']);
+ if ($status == 0)
+ doDefault($lang['strtriggeraltered']);
+ else
+ doAlter($lang['strtriggeralteredbad']);
+ }
+
+ /**
+ * Function to allow altering of a trigger
+ */
+ function doAlter($msg = '') {
+ global $data, $localData, $misc;
+ global $PHP_SELF, $lang;
+
+ echo "<h2>", $misc->printVal($_REQUEST['database']), ": {$lang['strtriggers']}: ", $misc->printVal($_REQUEST['trigger']), ": {$lang['stralter']}</h2>\n";
+ $misc->printMsg($msg);
+
+ $triggerdata = &$localData->getTrigger($_REQUEST['table'], $_REQUEST['trigger']);
+
+ if ($triggerdata->recordCount() > 0) {
+
+ if (!isset($_POST['name'])) $_POST['name'] = $triggerdata->f[$data->tgFields['tgname']];
+
+ echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
+ echo "<table>\n";
+ echo "<tr><th class=\"data\">{$lang['strname']}</th>\n";
+ echo "<td class=\"data1\">";
+ echo "<input name=\"name\" size=\"32\" maxlength=\"{$data->_maxNameLen}\" value=\"",
+ htmlspecialchars($_POST['name']), "\" />\n";
+ echo "</table>\n";
+ echo "<p><input type=\"hidden\" name=\"action\" value=\"alter\" />\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=\"alter\" value=\"{$lang['strok']}\" />\n";
+ echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" /></p>\n";
+ echo "</form>\n";
+ }
+ else echo "<p>{$lang['strnodata']}</p>\n";
+ }
+
/**
* Show confirmation of drop and perform actual drop
*/
if ($triggers->recordCount() > 0) {
echo "<table>\n";
echo "<tr><th class=\"data\">{$lang['strname']}</th><th class=\"data\">{$lang['strdefinition']}</th>";
- echo "<th class=\"data\">{$lang['stractions']}</th>\n";
+ echo "<th class=\"data\" colspan=\"", ($data->hasAlterTrigger() ? 2 : 1), "\">{$lang['stractions']}</th>\n";
$i = 0;
while (!$triggers->EOF) {
echo $misc->printVal($triggers->f[$data->tgFields['tgdef']]);
else
echo $misc->printVal($localData->getTriggerDef($triggers->f));
- echo "</td>\n<td class=\"data{$id}\">";
- echo "<a href=\"$PHP_SELF?action=confirm_drop&{$misc->href}&trigger=", urlencode( $triggers->f[$data->tgFields['tgname']]),
- "&table=", urlencode($_REQUEST['table']), "\">{$lang['strdrop']}</td></tr>\n";
+ echo "</td>\n";
+ if ($data->hasAlterTrigger()) {
+ echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_alter&{$misc->href}&trigger=", urlencode($triggers->f[$data->tgFields['tgname']]),
+ "&table=", urlencode($_REQUEST['table']), "\">{$lang['stralter']}</td>\n";
+ }
+ echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_drop&{$misc->href}&trigger=", urlencode($triggers->f[$data->tgFields['tgname']]),
+ "&table=", urlencode($_REQUEST['table']), "\">{$lang['strdrop']}</td>\n";
+ echo "</tr>\n";
$triggers->moveNext();
$i++;
$misc->printBody();
switch ($action) {
+ case 'alter':
+ if (isset($_POST['alter'])) doSaveAlter();
+ else doDefault();
+ break;
+ case 'confirm_alter':
+ doAlter();
+ break;
case 'save_create':
doSaveCreate();
break;