Add lock/unlock replication set. Show locks on sets.
authorchriskl <chriskl>
Sun, 12 Jun 2005 11:18:38 +0000 (11:18 +0000)
committerchriskl <chriskl>
Sun, 12 Jun 2005 11:18:38 +0000 (11:18 +0000)
classes/plugins/Slony.php
lang/recoded/english.php
plugin_slony.php

index 32c78e82e80b7fbee02573e3cabf651e84c6f548..cc284b8cba6e82f6cd2d2ab81f5eecef029648e7 100755 (executable)
@@ -3,7 +3,7 @@
 /**
  * A class that implements the Slony 1.0.x support plugin
  *
- * $Id: Slony.php,v 1.1.2.20 2005/06/11 11:03:59 chriskl Exp $
+ * $Id: Slony.php,v 1.1.2.21 2005/06/12 11:18:39 chriskl Exp $
  */
 
 include_once('./classes/plugins/Plugin.php');
@@ -188,7 +188,7 @@ class Slony extends Plugin {
                $schema = $this->slony_schema;
                $data->fieldClean($schema);
                
-               $sql = "SELECT * FROM \"{$schema}\".sl_set ORDER BY set_id";
+               $sql = "SELECT *, set_locked IS NOT NULL AS is_locked FROM \"{$schema}\".sl_set ORDER BY set_id";
                
                return $data->selectSet($sql);
        }
@@ -203,7 +203,8 @@ class Slony extends Plugin {
                $data->fieldClean($schema);
                $data->clean($set_id);
                
-               $sql = "SELECT *, (SELECT COUNT(*) FROM \"{$schema}\".sl_subscribe ssub WHERE ssub.sub_set=ss.set_id) AS subscriptions
+               $sql = "SELECT *, (SELECT COUNT(*) FROM \"{$schema}\".sl_subscribe ssub WHERE ssub.sub_set=ss.set_id) AS subscriptions,
+                                       set_locked IS NOT NULL AS is_locked
                                        FROM \"{$schema}\".sl_set ss, \"{$schema}\".sl_node sn
                                        WHERE ss.set_origin=sn.no_id
                                        AND set_id='{$set_id}'";
@@ -244,7 +245,26 @@ class Slony extends Plugin {
 
                return $data->execute($sql);
        }       
-       
+
+       /**
+        * Locks or unlocks a set
+        * @param boolean $lock True to lock, false to unlock
+        */
+       function lockReplicationSet($set_id, $lock) {
+               global $data;
+
+               $schema = $this->slony_schema;
+               $data->fieldClean($schema);
+               $data->clean($set_id);
+
+               if ($lock)
+                       $sql = "SELECT \"{$schema}\".lockset('{$set_id}')";
+               else
+                       $sql = "SELECT \"{$schema}\".unlockset('{$set_id}')";           
+
+               return $data->execute($sql);
+       }       
+               
        /**
         * Merges two sets
         */
index daf107a6c05fc871862cc0b95cda84bdfd6690a1..eab08d782a3c86a36ae101e2141407613f3376cc 100644 (file)
@@ -4,7 +4,7 @@
         * English language file for phpPgAdmin.  Use this as a basis
         * for new translations.
         *
-        * $Id: english.php,v 1.128.2.3 2005/06/11 08:20:08 chriskl Exp $
+        * $Id: english.php,v 1.128.2.4 2005/06/12 11:18:39 chriskl Exp $
         */
 
        // Language and character set
        $lang['strconfdropnode'] = 'Are you sure you want to drop node &quot;%s&quot;?';
        $lang['strnodedropped'] = 'Node dropped.';
        $lang['strnodedroppedbad'] = 'Node drop failed';
-
+       $lang['strfailover'] = 'Failover';
+       $lang['strnodefailedover'] = 'Node failed over.';
+       $lang['strnodefailedoverbad'] = 'Node fail over fail.';
+       
        // Slony paths  
        $lang['strpaths'] = 'Paths';
        $lang['strnopaths'] = 'No paths found.';
        $lang['strrepsetmoved'] = 'Replication set moved.';
        $lang['strrepsetmovedbad'] = 'Replication set move failed.';
        $lang['strnewrepset'] = 'New replication set';
+       $lang['strlock'] = 'Lock';
+       $lang['strlocked'] = 'Locked';
+       $lang['strunlock'] = 'Unlock';
+       $lang['strconflockrepset'] = 'Are you sure you want to lock replication set &quot;%s&quot;?';
+       $lang['strrepsetlocked'] = 'Replication set locked.';
+       $lang['strrepsetlockedbad'] = 'Replication set lock failed.';
+       $lang['strconfunlockrepset'] = 'Are you sure you want to unlock replication set &quot;%s&quot;?';
+       $lang['strrepsetunlocked'] = 'Replication set unlocked.';
+       $lang['strrepsetunlockedbad'] = 'Replication set unlock failed.';
 
        // Slony subscriptions
        $lang['strsubscriptions'] = 'Subscriptions';
index c158c342291347efac8690b433ad8e6829dc4ae4..12b4533c12c1d06c857bca167fbcc7b9ee121ffd 100755 (executable)
@@ -3,7 +3,7 @@
        /**
         * Slony database tab plugin
         *
-        * $Id: plugin_slony.php,v 1.1.2.20 2005/06/11 11:03:59 chriskl Exp $
+        * $Id: plugin_slony.php,v 1.1.2.21 2005/06/12 11:18:38 chriskl Exp $
         */
 
        // Include application functions
                                'title' => $lang['strdrop'],
                                'url'   => "plugin_slony.php?{$misc->href}&amp;action=confirm_drop_node&amp;",
                                'vars'  => array('no_id' => 'no_id')
+                       ),
+                       'failover' => array(
+                               'title' => $lang['strfailover'],
+                               'url'   => "plugin_slony.php?{$misc->href}&amp;action=confirm_failover_node&amp;",
+                               'vars'  => array('no_id' => 'no_id')
                        )
                );
                
                }
                else echo "<p>{$lang['strnodata']}</p>\n";
 
-               echo "<p><a class=\"navlink\" href=\"{$PHP_SELF}?action=confirm_drop_node&amp;{$misc->href}&amp;no_id={$_REQUEST['no_id']}\">{$lang['strdrop']}</a></p>\n";
+               echo "<p><a class=\"navlink\" href=\"{$PHP_SELF}?action=confirm_drop_node&amp;{$misc->href}&amp;no_id={$_REQUEST['no_id']}\">{$lang['strdrop']}</a> |\n";
+               echo "<a class=\"navlink\" href=\"{$PHP_SELF}?action=confirm_failover_node&amp;{$misc->href}&amp;no_id={$_REQUEST['no_id']}\">{$lang['strfailover']}</a></p>\n";
        }
 
        /**
                                doNodes($lang['strnodedroppedbad']);
                }
        }
-               
+
+       /**
+        * Show confirmation of failover and perform actual failover of a node
+        */
+       function doFailoverNode($confirm) {
+               global $slony, $misc;
+               global $PHP_SELF, $lang;
+
+               if ($confirm) {
+                       // Fetch all nodes
+                       $nodes = &$slony->getNodes();
+
+                       $misc->printTrail('slony_paths');
+                       $misc->printTitle($lang['strfailover']);
+                       $misc->printMsg($msg);
+       
+                       echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
+                       echo $misc->form;
+                       echo "<table width=\"100%\">\n";
+                       echo "\t<tr>\n\t\t<th class=\"data left required\">{$lang['strfailoverto']}</th>\n";
+                       echo "\t\t<td class=\"data1\">\n\t\t\t<select name=\"pathserver\">\n";
+                       while (!$nodes->EOF) {
+                               echo "\t\t\t\t<option value=\"{$nodes->f['no_id']}\"",
+                                       ($nodes->f['no_id'] == $_POST['pathserver']) ? ' selected="selected"' : '', ">", htmlspecialchars($nodes->f['no_comment']), "</option>\n";
+                               $nodes->moveNext();
+                       }
+                       echo "\t\t\t</select>\n\t\t</td>\n\t\n";                
+                       echo "\t<tr>\n\t\t<th class=\"data left required\">{$lang['strconninfo']}</th>\n";
+                       echo "\t\t<td class=\"data1\"><input name=\"pathconn\" size=\"32\" maxlength=\"{$data->_maxNameLen}\" value=\"",
+                               htmlspecialchars($_POST['pathconn']), "\" /></td>\n\t</tr>\n";
+                       echo "\t<tr>\n\t\t<th class=\"data left required\">{$lang['strconnretry']}</th>\n";
+                       echo "\t\t<td class=\"data1\"><input name=\"pathretry\" size=\"32\" maxlength=\"{$data->_maxNameLen}\" value=\"",
+                               htmlspecialchars($_POST['pathretry']), "\" /></td>\n\t</tr>\n";
+                               
+                       echo "\t</tr>\n";
+                       echo "</table>\n";
+                       echo "<p>\n";
+                       echo "<input type=\"hidden\" name=\"action\" value=\"save_create_path\" />\n";
+                       echo "<input type=\"hidden\" name=\"no_id\" value=\"", htmlspecialchars($_REQUEST['no_id']), "\" />\n";
+                       echo "<input type=\"submit\" value=\"{$lang['strcreate']}\" />\n";
+                       echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" />\n";
+                       echo "</p>\n";
+                       echo "</form>\n";
+               }
+               else {
+                       $status = $slony->failoverNode($_REQUEST['no_id']);
+                       if ($status == 0)
+                               doNodes($lang['strnodefailoverped']);
+                       else
+                               doNodes($lang['strnodefailoverpedbad']);
+               }
+       }
+                       
        // PATHS
 
        /**
                                'url'   => "plugin_slony.php?{$misc->href}&amp;action=confirm_drop_set&amp;",
                                'vars'  => array('set_id' => 'set_id')
                        ),
+                       'lock' => array(
+                               'title' => $lang['strlock'],
+                               'url'   => "plugin_slony.php?{$misc->href}&amp;action=confirm_lock_set&amp;",
+                               'vars'  => array('set_id' => 'set_id')
+                       ),
+                       'unlock' => array(
+                               'title' => $lang['strunlock'],
+                               'url'   => "plugin_slony.php?{$misc->href}&amp;action=confirm_unlock_set&amp;",
+                               'vars'  => array('set_id' => 'set_id')
+                       ),
                        'merge' => array(
                                'title' => $lang['strmerge'],
                                'url'   => "plugin_slony.php?{$misc->href}&amp;action=merge_set&amp;",
                        echo "<td class=\"data1\">", $misc->printVal($set->f['set_comment']), "</td></tr>\n";
                        echo "<tr><th class=\"data left\" width=\"70\">{$lang['strid']}</th>\n";
                        echo "<td class=\"data1\">", $misc->printVal($set->f['set_id']), "</td></tr>\n";
+                       echo "<tr><th class=\"data left\" width=\"70\">{$lang['strlocked']}</th>\n";
+                       echo "<td class=\"data1\">", ($data->phpBool($set->f['is_locked'])) ? $lang['stryes'] : $lang['strno'], "</td></tr>\n";
                        echo "<tr><th class=\"data left\" width=\"70\">Origin ID</th>\n";
                        echo "<td class=\"data1\">", $misc->printVal($set->f['set_origin']), "</td></tr>\n";
                        echo "<tr><th class=\"data left\" width=\"70\">Origin Node</th>\n";
                else echo "<p>{$lang['strnodata']}</p>\n";
 
                echo "<p><a class=\"navlink\" href=\"{$PHP_SELF}?action=confirm_drop_set&amp;{$misc->href}&amp;set_id={$_REQUEST['set_id']}\">{$lang['strdrop']}</a> |\n";
+               echo "<a class=\"navlink\" href=\"{$PHP_SELF}?action=confirm_lock_set&amp;{$misc->href}&amp;set_id={$_REQUEST['set_id']}\">{$lang['strlock']}</a> |\n";
+               echo "<a class=\"navlink\" href=\"{$PHP_SELF}?action=confirm_unlock_set&amp;{$misc->href}&amp;set_id={$_REQUEST['set_id']}\">{$lang['strunlock']}</a> |\n";
                echo "<a class=\"navlink\" href=\"{$PHP_SELF}?action=merge_set&amp;{$misc->href}&amp;set_id={$_REQUEST['set_id']}\">{$lang['strmerge']}</a> |\n";
                echo "<a class=\"navlink\" href=\"{$PHP_SELF}?action=move_set&amp;{$misc->href}&amp;set_id={$_REQUEST['set_id']}\">{$lang['strmove']}</a></p>\n";
        }
                else {
                        $status = $slony->dropReplicationSet($_REQUEST['set_id']);
                        if ($status == 0)
-                               doReplicationSets($lang['strrepsetdropped']);
+                               doReplicationSet($lang['strrepsetdropped']);
                        else
-                               doReplicationSets($lang['strrepsetdroppedbad']);
+                               doReplicationSet($lang['strrepsetdroppedbad']);
                }
        }
 
+       /**
+        * Show confirmation of lock and perform actual lock of a set
+        */
+       function doLockReplicationSet($confirm) {
+               global $slony, $misc;
+               global $PHP_SELF, $lang;
+
+               if ($confirm) {
+                       $misc->printTrail('slony_cluster');
+                       $misc->printTitle($lang['strlock']);
+
+                       echo "<p>", sprintf($lang['strconflockrepset'], $misc->printVal($_REQUEST['set_id'])), "</p>\n";
+
+                       echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
+                       echo "<input type=\"hidden\" name=\"action\" value=\"lock_set\" />\n";
+                       echo "<input type=\"hidden\" name=\"set_id\" value=\"", htmlspecialchars($_REQUEST['set_id']), "\" />\n";
+                       echo $misc->form;
+                       echo "<input type=\"submit\" name=\"lock\" value=\"{$lang['strlock']}\" />\n";
+                       echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" />\n";
+                       echo "</form>\n";
+               }
+               else {
+                       $status = $slony->lockReplicationSet($_REQUEST['set_id'], true);
+                       if ($status == 0)
+                               doReplicationSet($lang['strrepsetlocked']);
+                       else
+                               doReplicationSet($lang['strrepsetlockedbad']);
+               }
+       }
+
+       /**
+        * Show confirmation of unlock and perform actual unlock of a set
+        */
+       function doUnlockReplicationSet($confirm) {
+               global $slony, $misc;
+               global $PHP_SELF, $lang;
+
+               if ($confirm) {
+                       $misc->printTrail('slony_cluster');
+                       $misc->printTitle($lang['strunlock']);
+
+                       echo "<p>", sprintf($lang['strconfunlockrepset'], $misc->printVal($_REQUEST['set_id'])), "</p>\n";
+
+                       echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
+                       echo "<input type=\"hidden\" name=\"action\" value=\"unlock_set\" />\n";
+                       echo "<input type=\"hidden\" name=\"set_id\" value=\"", htmlspecialchars($_REQUEST['set_id']), "\" />\n";
+                       echo $misc->form;
+                       echo "<input type=\"submit\" name=\"unlock\" value=\"{$lang['strunlock']}\" />\n";
+                       echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" />\n";
+                       echo "</form>\n";
+               }
+               else {
+                       $status = $slony->lockReplicationSet($_REQUEST['set_id'], false);
+                       if ($status == 0)
+                               doReplicationSets($lang['strrepsetunlocked']);
+                       else
+                               doReplicationSets($lang['strrepsetunlockedbad']);
+               }
+       }
+       
        /**
         * Displays a screen where they can merge one set into another
         */
                case 'confirm_drop_node':
                        doDropNode(true);
                        break;
+               case 'failover_node':
+                       if (isset($_POST['cancel'])) doNodes();
+                       else doFailoverNode(false);
+                       break;
+               case 'confirm_failover_node':
+                       doFailoverNode(true);
+                       break;
                case 'paths_properties':
                        doPaths();
                        break;
                case 'confirm_drop_set':
                        doDropReplicationSet(true);
                        break;
+               case 'lock_set':
+                       if (isset($_POST['cancel'])) doReplicationSets();
+                       else doLockReplicationSet(false);
+                       break;
+               case 'confirm_lock_set':
+                       doLockReplicationSet(true);
+                       break;
+               case 'unlock_set':
+                       if (isset($_POST['cancel'])) doReplicationSets();
+                       else doUnlockReplicationSet(false);
+                       break;
+               case 'confirm_unlock_set':
+                       doUnlockReplicationSet(true);
+                       break;
                case 'save_merge_set':
                        if (isset($_POST['cancel'])) doReplicationSet();
                        else doMergeReplicationSet(false);