Phew. Finally, add foreign key support
authorchriskl <chriskl>
Wed, 23 Apr 2003 08:56:26 +0000 (08:56 +0000)
committerchriskl <chriskl>
Wed, 23 Apr 2003 08:56:26 +0000 (08:56 +0000)
HISTORY
TODO
classes/database/Postgres.php
constraints.php
lang/english.php
lang/recoded/english.php

diff --git a/HISTORY b/HISTORY
index 0e77c4786216132ba5db3c2bd451c4806a35d123..eb36111b958ec20e3feb16e03415223b1b83e551 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -8,6 +8,7 @@ Version 3.0.0-dev-4
 * Slovak translation
 * Reload browser after create/drop of database, schemas and tables
 * Select on views
+* Add foreign key constraint, with actions
 
 Version 3.0.0-dev-3
 -------------------
diff --git a/TODO b/TODO
index 61bc28ef9935fb5129624569abb67b1d94eaffb8..c546b294f13fdad6a40dff626f59965f09c6ca36 100644 (file)
--- a/TODO
+++ b/TODO
@@ -48,8 +48,8 @@ Databases
 * Add alter database for 7.3+
 * -Execute arbitrary SQL (chriskl)
 * Dump database
-* Creating new database should refresh left pane? What about creating schemas
-  and tables - they're in the left pane too?
+* -Creating new database should refresh left pane? What about creating schemas
+  and tables - they're in the left pane too? (chriskl)
 * -Show encoding of databases (chriskl)
 
 Tables
index 0e021a3274fff681a86a0f6076ec9351210f12e1..88b5aedcdb114729492c7b62486d712f7431157b 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.78 2003/04/23 06:27:13 chriskl Exp $
+ * $Id: Postgres.php,v 1.79 2003/04/23 08:56:26 chriskl Exp $
  */
 
 // @@@ THOUGHT: What about inherits? ie. use of ONLY???
@@ -47,7 +47,9 @@ class Postgres extends BaseDB {
                'UPDATE OR DELETE', 'INSERT OR UPDATE OR DELETE');
        // When to execute the trigger  
        var $triggerExecTimes = array('BEFORE', 'AFTER');
-
+       // Foreign key actions
+       var $fkactions = array('NO ACTION', 'RESTRICT', 'CASCADE', 'SET NULL', 'SET DEFAULT');
+       
        // Last oid assigned to a system object
        var $_lastSystemOID = 18539;
        var $_maxNameLen = 31;
@@ -974,11 +976,13 @@ class Postgres extends BaseDB {
         * @param $target The table that contains the target columns
         * @param $sfields (array) An array of source fields over which to add the foreign key
         * @param $tfields (array) An array of target fields over which to add the foreign key
+        * @param $upd_action The action for updates (eg. RESTRICT)
+        * @param $del_action The action for deletes (eg. RESTRICT)
         * @param $name (optional) The name to give the key, otherwise default name is assigned
         * @return 0 success
         * @return -1 no fields given
         */
-       function addForeignKey($table, $target, $sfields, $tfields, $name = '') {
+       function addForeignKey($table, $target, $sfields, $tfields, $upd_action, $del_action, $name = '') {
                if (!is_array($sfields) || sizeof($sfields) == 0 ||
                        !is_array($tfields) || sizeof($tfields) == 0) return -1;
                $this->fieldClean($table);
@@ -991,6 +995,8 @@ class Postgres extends BaseDB {
                if ($name != '') $sql .= "CONSTRAINT \"{$name}\" ";
                $sql .= "FOREIGN KEY (\"" . join('","', $sfields) . "\") ";
                $sql .= "REFERENCES \"{$target}\"(\"" . join('","', $tfields) . "\") ";
+               if ($upd_action != 'NO ACTION') $sql .= " ON UPDATE {$upd_action}";
+               if ($del_action != 'NO ACTION') $sql .= " ON DELETE {$del_action}";
 
                return $this->execute($sql);
        }
index 47550be1a53f96da4a3652fabf1da472bd205beb..c8b51d27348457a3cdd87828c3bb482047db0d7b 100644 (file)
@@ -3,7 +3,7 @@
        /**
         * List constraints on a table
         *
-        * $Id: constraints.php,v 1.13 2003/04/23 06:27:14 chriskl Exp $
+        * $Id: constraints.php,v 1.14 2003/04/23 08:56:26 chriskl Exp $
         */
 
        // Include application functions
                                // Copy the IndexColumnList variable from stage 2
                                if (isset($_REQUEST['IndexColumnList']) && !isset($_REQUEST['SourceColumnList']))
                                        $_REQUEST['SourceColumnList'] = serialize($_REQUEST['IndexColumnList']);
-                                       
+                               
+                               // Initialise variables
+                               if (!isset($_POST['upd_action'])) $_POST['upd_action'] = null;
+                               if (!isset($_POST['del_action'])) $_POST['del_action'] = null;
+                               
                                echo "<h2>", htmlspecialchars($_REQUEST['database']), ": {$lang['strtables']}: ",
                                        htmlspecialchars($_REQUEST['table']), ": {$lang['straddfk']}</h2>\n";
                                $misc->printMsg($msg);
                                echo "<tr><th class=\"data\">{$lang['strtablecolumnlist']}</th><th class=\"data\">&nbsp;</th><th class=data>{$lang['strfkcolumnlist']}</th></tr>\n";
                                echo "<tr><td class=\"data1\">" . $selColumns->fetch() . "</td>\n";
                                echo "<td class=\"data1\" align=\"center\">" . $buttonRemove->fetch() . $buttonAdd->fetch() . "</td>";
-                               echo "<td class=data1>" . $selIndex->fetch() . "</td></tr>\n";
+                               echo "<td class=\"data1\">" . $selIndex->fetch() . "</td></tr>\n";
+                               echo "<tr><th class=\"data\" colspan=\"3\">{$lang['stractions']}</th></tr>";
+                               echo "<tr>";
+                               echo "<td class=\"data1\" colspan=\"3\">\n";                            
+                               // ON SELECT actions
+                               echo "{$lang['stronupdate']} <select name=\"upd_action\">";
+                               foreach ($data->fkactions as $v) {
+                                       echo "<option value=\"{$v}\"", ($_POST['upd_action'] == $v) ? ' selected="selected"' : '', ">{$v}</option>\n";
+                               }
+                               echo "</select><br />\n";
+                               // ON DELETE actions
+                               echo "{$lang['strondelete']} <select name=\"del_action\">";
+                               foreach ($data->fkactions as $v) {
+                                       echo "<option value=\"{$v}\"", ($_POST['del_action'] == $v) ? ' selected="selected"' : '', ">{$v}</option>\n";
+                               }
+                               echo "</select>\n";                             
+                               echo "</td></tr>";
                                echo "</table>\n";
 
                                echo "<p><input type=\"hidden\" name=\"action\" value=\"save_add_foreign_key\">\n";
                                                || !is_array($temp) || sizeof($temp) == 0) addForeignKey(2, $lang['strfkneedscols']);
                                else {
                                        $status = $localData->addForeignKey($_POST['table'], $_POST['target'], unserialize($_POST['SourceColumnList']), 
-                                               $_POST['IndexColumnList'], $_POST['name']);
+                                               $_POST['IndexColumnList'], $_POST['upd_action'], $_POST['del_action'], $_POST['name']);
                                        if ($status == 0)
                                                doDefault($lang['strfkadded']);
                                        else
                                $misc->printMsg($msg);
 
                                $attrs = &$localData->getTableAttributes($_REQUEST['table']);
+                               $tables = &$localData->getTables(true);
 
                                $selColumns = new XHTML_select('TableColumnList', true, 10);
                                $selColumns->set_style('width: 10em;');
                                echo "<td class=data1>" . $selIndex->fetch() . "</td></tr>\n";
                                echo "<tr><th class=\"data\" colspan=\"3\">{$lang['strfktarget']}</th></tr>";
                                echo "<tr>";
-                               echo "<td class=\"data1\" colspan=\"3\"><input type=\"text\" name=\"target\" size=\"32\" maxlength=\"{$data->_maxNameLen}\" /></td></tr>";
+                               echo "<td class=\"data1\" colspan=\"3\"><select name=\"target\">";
+                               while (!$tables->EOF) {
+                                       echo "<option value=\"", htmlspecialchars($tables->f['tablename']), "\">",
+                                               htmlspecialchars($tables->f['tablename']), "</option>\n";
+                                       $tables->moveNext();    
+                               }
+                               echo "</select>\n";
+                               echo "</td></tr>";
                                echo "</table>\n";
 
                                echo "<p><input type=\"hidden\" name=\"action\" value=\"save_add_foreign_key\">\n";
index c23ea4dd09dc183808e675e23a8ed81428384da4..2a6c4a52936d42945fd711011664ed75c99511c1 100755 (executable)
@@ -4,7 +4,7 @@
         * English language file for phpPgAdmin.  Use this as a basis
         * for new translations.
         *
-        * $Id: english.php,v 1.72 2003/04/23 07:01:17 chriskl Exp $
+        * $Id: english.php,v 1.73 2003/04/23 08:56:27 chriskl Exp $
         */
 
        // Language and character set
        $lang['strfkaddedbad'] = 'Failed to add foreign key.';
        $lang['strfktarget'] = 'Target table';
        $lang['strfkcolumnlist'] = 'Columns in key';
+       $lang['strondelete'] = 'ON DELETE';
+       $lang['stronupdate'] = 'ON UPDATE';     
 
        // Functions
        $lang['strfunction'] = 'Function';
index 5347f2842275616198cb652e9c471eb477728e06..de48573e643bd004b296230f7c00f8fd3b160664 100644 (file)
@@ -4,7 +4,7 @@
         * English language file for phpPgAdmin.  Use this as a basis
         * for new translations.
         *
-        * $Id: english.php,v 1.24 2003/04/23 07:01:20 chriskl Exp $
+        * $Id: english.php,v 1.25 2003/04/23 08:56:27 chriskl Exp $
         */
 
        // Language and character set
        $lang['strfkaddedbad'] = 'Failed to add foreign key.';
        $lang['strfktarget'] = 'Target table';
        $lang['strfkcolumnlist'] = 'Columns in key';
+       $lang['strondelete'] = 'ON DELETE';
+       $lang['stronupdate'] = 'ON UPDATE';     
 
        // Functions
        $lang['strfunction'] = 'Function';