Fix cluster creation for Slony 2.0 [Sachin Srivastava]
authordpage <dpage@a7884b65-44f6-0310-8a51-81a127f17b15>
Thu, 1 Oct 2009 12:24:21 +0000 (12:24 +0000)
committerdpage <dpage@a7884b65-44f6-0310-8a51-81a127f17b15>
Thu, 1 Oct 2009 12:24:21 +0000 (12:24 +0000)
git-svn-id: svn://svn.pgadmin.org/trunk/pgadmin3@8056 a7884b65-44f6-0310-8a51-81a127f17b15

CHANGELOG
pgadmin/include/slony/dlgRepCluster.h
pgadmin/slony/dlgRepCluster.cpp

index 41b2c9a6296278c4317d1213ff6a7eb950255190..1d97a9de3e84fba3e82ffa6b6364c87b74c2da67 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -36,6 +36,7 @@ Changes
 
 Date       Dev Ver     Change details
 ---------- --- ------  --------------
+2009-10-01 DP  1.10.1  Fix cluster creation for Slony 2.0 [Sachin Srivastava]
 2009-09-28 GL  1.12.0  Allow the change of database for the lock report on the
                        server status window.
 2009-09-25 GL  1.12.0  Highlight processes according to their activity.
index e10d34f242398555108bb6543a0040432cd73894..10e9bc2107a22bca872c94fcdea9b7d4cca893e9 100644 (file)
@@ -67,6 +67,8 @@ private:
     bool CopyTable(pgConn *from, pgConn *to, const wxString &table);
     sysProcess *process;
 
+    bool SlonyMaximumVersion(const wxString &series, long minor);
+
     wxArrayLong usedNodes;
     wxString clusterBackup;
     wxString slonyVersion;
index d7e25edf6971e96a0eb0406249d1aadd243f3f9c..1d1cf3af9480fd0f41cea2d924efee72eb517622 100644 (file)
@@ -235,6 +235,19 @@ wxString dlgRepCluster::GetHelpPage() const
     return page;
 }
 
+bool dlgRepCluster::SlonyMaximumVersion(const wxString &series, long minor)
+{
+
+    wxString slonySeries;
+    long slonyMinorVersion;
+
+    slonySeries = slonyVersion.BeforeLast('.');  
+    slonyVersion.AfterLast('.').ToLong(&slonyMinorVersion);
+
+    return slonySeries == series && slonyMinorVersion <= minor;
+}
+
+
 
 int dlgRepCluster::Go(bool modal)
 {
@@ -299,27 +312,147 @@ int dlgRepCluster::Go(bool modal)
         // create mode
         cbAdminNode->Hide();
 
+        wxString scriptVersion = wxEmptyString;
+        wxString xxidVersion = wxEmptyString;
+
         txtNodeID->SetValidator(numericValidator);
         txtAdminNodeID->SetValidator(numericValidator);
         txtClusterName->Hide();
 
-               if (connection->BackendMinimumVersion(8, 0))
-               {
-                       if (!AddScript(createScript, wxT("xxid.v80.sql")) || 
-                               !AddScript(createScript, wxT("slony1_base.sql")) || 
-                               !AddScript(createScript, wxT("slony1_funcs.sql")) || 
-                               !AddScript(createScript, wxT("slony1_funcs.v80.sql")))
-                               createScript = wxEmptyString;
-               }
-               else
-               {
-                       if (!AddScript(createScript, wxT("xxid.v74.sql")) || 
-                               !AddScript(createScript, wxT("slony1_base.sql")) || 
-                               !AddScript(createScript, wxT("slony1_funcs.sql")) || 
-                               !AddScript(createScript, wxT("slony1_funcs.v74.sql")))
-                               createScript = wxEmptyString;
-               }
+        //We need to find the exact Slony Version.
+        //NOTE: We are not supporting Slony versions less than 1.2.0
+
+        wxString tempScript;
+        AddScript(tempScript, wxT("slony1_funcs.sql"));
+
+        if (tempScript.Contains(wxT("@MODULEVERSION@")) && slonyVersion.IsEmpty())
+        {
+                this->database->ExecuteVoid(wxT("CREATE OR REPLACE FUNCTION pgadmin_slony_version() returns text as '$libdir/slony1_funcs', '_Slony_I_getModuleVersion' LANGUAGE C"));
+                slonyVersion = this->database->ExecuteScalar(wxT("SELECT pgadmin_slony_version();"));
+                this->database->ExecuteVoid(wxT("DROP FUNCTION pgadmin_slony_version()"));
 
+                if (slonyVersion.IsEmpty())
+                {
+                    wxLogError(_("Couldn't test for the Slony version. Assuming 1.2.0"));
+                    slonyVersion = wxT("1.2.0");
+                }
+        }
+
+        //Here we are finding the exact slony scripts version, which is based on Slony Version and PG Version.
+        // For Slony 1.2.0 to 1.2.17 and 2.0.0 if PG 7.3 script version is v73 
+        // For Slony 1.2.0 to 1.2.17 and 2.0.0 if PG 7.4 script version is v74 
+        // For Slony 1.2.0 to 1.2.6 if PG 8.0+ script version is v80 
+        // For Slony 1.2.7 to 1.2.17 and 2.0.0 if PG 8.0 script version is v80 
+        // For Slony 1.2.7 to 1.2.17 and 2.0.0 if PG 8.1+ script version is v81 
+        // For Slony 2.0.1 and 2.0.2 if PG 8.3+ script version is v83. (These version onwards do not support PG Version less than 8.3) 
+        // For Slony 2.0.3 if PG 8.3 script version is v83.
+        // For Slony 2.0.3 if PG 8.4+ script version is v84.
+
+        //Since both 1.2 and 2.0 series is increasing, the following code needs to be updated with each Slony or PG update.
+          
+
+        if (!tempScript.IsEmpty())
+        {
+                //Set the slony_base and slony_funcs script version.
+                if (SlonyMaximumVersion(wxT("1.2"), 6)) 
+                { 
+                        if (connection->BackendMinimumVersion(8, 0))
+                                scriptVersion = wxT("v80");
+                        else 
+                        {
+                                if (connection->BackendMinimumVersion(7, 4))
+                                        scriptVersion = wxT("v74");
+                                else 
+                                        scriptVersion = wxT("v73");
+                        }
+                }
+                else 
+                {
+                        if (SlonyMaximumVersion(wxT("1.2"), 17) || SlonyMaximumVersion(wxT("2.0"), 0))
+                        {
+                                if (connection->BackendMinimumVersion(8, 1))
+                                        scriptVersion = wxT("v81");
+                                else 
+                                {
+                                        if (connection->BackendMinimumVersion(8, 0))
+                                                scriptVersion = wxT("v80");
+                                        else 
+                                        {
+                                                if (connection->BackendMinimumVersion(7, 4))
+                                                         scriptVersion = wxT("v74");
+                                                else 
+                                                         scriptVersion = wxT("v73");
+                                        }
+                                }
+                        }
+                        else 
+                        {
+                                if (SlonyMaximumVersion(wxT("2.0"), 2))
+                                        scriptVersion = wxT("v83");
+                                else 
+                                {
+                                        if (SlonyMaximumVersion(wxT("2.0"), 3))
+                                        {
+                                                if (connection->BackendMinimumVersion(8, 4))
+                                                        scriptVersion = wxT("v84");
+                                        }
+                                        else
+                                                scriptVersion = wxT("v83");
+                                }
+                        }
+
+               }
+
+               //Set the correct xxid version if applicable
+               // For Slony 1.2.0 to 1.2.17 and 2.0.0 if PG 7.3 xxid version is v73 
+               // For Slony 1.2.1 to 1.2.17 and 2.0.0 if PG 7.4+ xxid version is v74
+               // For Slony 1.2.0 if PG 8.0 xxid version is v80
+               // For Slony 2.0.1+ and PG8.4+ xxid is obsolete. 
+                        
+               if (SlonyMaximumVersion(wxT("1.2"), 0))
+               {
+                       if (connection->BackendMinimumVersion(8, 0))
+                               xxidVersion = wxT("v80");
+                       else
+                       {
+                               if (connection->BackendMinimumVersion(7, 4))
+                                        xxidVersion = wxT("v74");
+                               else
+                                        xxidVersion = wxT("v73"); 
+                       }
+               }
+               else
+               {
+                       if (SlonyMaximumVersion(wxT("1.2"), 17) || SlonyMaximumVersion(wxT("2.0"), 0))
+                       {
+                               if (!connection->BackendMinimumVersion(8, 4))
+                               {
+                                       if (connection->BackendMinimumVersion(7, 4))
+                                               xxidVersion = wxT("v74");
+                                       else
+                                               xxidVersion = wxT("v73");  
+                               }
+                       } 
+               } 
+  
+
+                wxString slonyBaseVersionFilename = wxT("slony1_base.") + scriptVersion + wxT(".sql");
+                wxString slonyFuncsVersionFilename = wxT("slony1_funcs.") + scriptVersion + wxT(".sql");
+
+                wxString xxidVersionFilename;
+                
+                if (!xxidVersion.IsEmpty())
+                        xxidVersionFilename = wxT("xxid.") + xxidVersion + wxT(".sql");
+       
+                if (((!xxidVersion.IsEmpty() && !AddScript(createScript, xxidVersionFilename)) ||
+                    !AddScript(createScript, wxT("slony1_base.sql")) || 
+                    !AddScript(createScript, slonyBaseVersionFilename) ||
+                    !AddScript(createScript, wxT("slony1_funcs.sql")) ||
+                    !AddScript(createScript, slonyFuncsVersionFilename)))
+                        createScript = wxEmptyString;
+                  
+        }
         treeObjectIterator it(mainForm->GetBrowser(), mainForm->GetServerCollection());
         pgServer *s;
         int sel=-1;