Date: Thursday, February 9, 2006 @ 15:50:12
  Author: gilles
    Path: /cvsroot/carob/carob

Modified: include/Connection.hpp (1.53 -> 1.54) src/Connection.cpp (1.59
          -> 1.60)

Remember connection parameters
Replaced (int) by static_cast
Added reconnect() declaration and started implem (only reconnects to the same 
controller for now)


------------------------+
 include/Connection.hpp |   20 ++++++++++---
 src/Connection.cpp     |   68 ++++++++++++++++++++++++++++++++++-------------
 2 files changed, 65 insertions(+), 23 deletions(-)


Index: carob/include/Connection.hpp
diff -u carob/include/Connection.hpp:1.53 carob/include/Connection.hpp:1.54
--- carob/include/Connection.hpp:1.53   Wed Jan 25 17:00:50 2006
+++ carob/include/Connection.hpp        Thu Feb  9 15:50:12 2006
@@ -22,6 +22,7 @@
 #ifndef _CONNECTION_H_
 #define _CONNECTION_H_
 
+#include "ConnectionParameters.hpp"
 #include "DriverResultSet.hpp"
 
 #include "CriticalSection.hpp"
@@ -312,7 +313,6 @@
    * Warning: this function only sends the connection infos, but there is no
    * guaranty that we are connected afterwards. [EMAIL PROTECTED] 
#finalizeConnect()} will
    * do the job of checking and finishing connection establishment.
-   * @param cp parameters of the connection
    * @return true if the connection initialization succeeds
    * @throw DriverException if the connect policy is NULL
    * @throw ConnectionException if the requested controller could not be
@@ -321,12 +321,12 @@
    *        IO exception occured during authentication (premature close of
    *        connection)
    */
-  bool                initConnection(const ConnectionParameters& cp)
+  bool                initConnection()
                           throw (DriverException, ConnectionException,
                           AuthenticationException, UnexpectedException);
   /**
    * Reads the controller acknowledgements and misc parameters that finish 
-   * connection. [EMAIL PROTECTED] #initConnection(const 
ConnectionParameters&)} must be 
+   * connection. [EMAIL PROTECTED] #initConnection()} must be 
    * called before this
    * @return true upon successfull connection
    * @throw ConnectionException if the virtual database is not available on the
@@ -399,9 +399,10 @@
 
   /** Persistent connection identifier if persistentConnection is true */
   int64_t             persistent_connection_id;
-  /**
-   * Controller connection policy used for this connection */
+  /** Controller connection policy used for this connection */
   AbstractControllerConnectPolicy* connect_policy_ptr;
+  /** The parameters of this connection */
+  ConnectionParameters parameters;
   /**
    * List of pointers to the [parameter]statements created by this connection.
    * Kept in order to destroy them when closing connection
@@ -534,6 +535,15 @@
                           ControllerException, ProtocolException,
                           UnexpectedException);
   /**
+   * Tries first to reconnect to the same controller. If unsuccessfull, 
notifies
+   * the suspicion of failure for the current controller and reconnects to a
+   * controller chosen using the policy specified in the connection parameters
+   * of this connection.
+   * 
+   * @throw //TODO
+   */
+  void reconnect() throw (UnexpectedException);
+  /**
    * Forbids Connection creation that would lead to unexpected state.
    * A connection is either created, ie. connected to a controller or destroyed
    * @see #Connection(const ConnectionParameters&)
Index: carob/src/Connection.cpp
diff -u carob/src/Connection.cpp:1.59 carob/src/Connection.cpp:1.60
--- carob/src/Connection.cpp:1.59       Tue Jan 24 18:54:51 2006
+++ carob/src/Connection.cpp    Thu Feb  9 15:50:12 2006
@@ -45,23 +45,24 @@
   writeExecutedInTransaction(false),
   mustBeginTransaction(false),
   persistent_connection(false),
-  connect_policy_ptr(NULL)
+  connect_policy_ptr(NULL),
+  parameters(prms)
 {
   wstring fctName(L"Connection::Connection");
-  switch (prms.getConnectPolicy())
+  switch (parameters.getConnectPolicy())
   {
     case ROUND_ROBIN:
-      connect_policy_ptr = new 
RoundRobinConnectPolicy(prms.getControllerList(),
-                                                       
prms.getRetryInterval());
+      connect_policy_ptr = new 
RoundRobinConnectPolicy(parameters.getControllerList(),
+                                                       
parameters.getRetryInterval());
     break;
     default:
-      throw DriverException(L"Unsupported connection policy #" + 
toWString(prms.getConnectPolicy()));
+      throw DriverException(L"Unsupported connection policy #" + 
toWString(parameters.getConnectPolicy()));
   }
-  persistent_connection = prms.getPersistentConnection();
+  persistent_connection = parameters.getPersistentConnection();
   try
   {
     //Do the authentication stuff, then receive ack and other params
-    if (initConnection(prms) && finalizeConnect())
+    if (initConnection() && finalizeConnect())
     {
       if (isInfoEnabled())
         logInfo(fctName, L"Connection succeded");
@@ -98,7 +99,7 @@
   socket<<(int32_t)command;
 }
 
-bool Connection::initConnection(const ConnectionParameters& prms)
+bool Connection::initConnection()
     throw (DriverException, ConnectionException, AuthenticationException,
         UnexpectedException)
 {
@@ -114,7 +115,7 @@
   {
     wstring msg = L"Authenticating with controller "
                       + controller.getHostName() + L":"
-                      + toWString((int)controller.getHostPort());
+                      + toWString(static_cast<int>(controller.getHostPort()));
     if (isInfoEnabled())
       logInfo(fctName, msg);
   }
@@ -123,24 +124,25 @@
     //Here is the connection protocol...
     // 1. connect to the controller
     driverSocketPtr = new DriverSocket(controller.getHostName(),
-                                          controller.getHostPort());
+                                       controller.getHostPort());
     // 2. sent the Protocol version information
     *driverSocketPtr<<ProtocolVersion;
     protocolVersionSend = true;
     // 3. send the database name
-    *driverSocketPtr<<prms.getDatabaseName();
+    *driverSocketPtr<<parameters.getDatabaseName();
     dbNameSend = true;
     //TODO: See if we need a fflush here...
     // 4. send user/pass
-    *driverSocketPtr<<prms.getUserName();
+    *driverSocketPtr<<parameters.getUserName();
     userNameSend = true;
-    *driverSocketPtr<<prms.getUserPass();
+    *driverSocketPtr<<parameters.getUserPass();
     userPassSend = true;
   }
   catch (ConnectionException connExcpt)
   {
-    wstring msg = L"Unable to connect to controller on " + 
controller.getHostName()
-                  + L":" + toWString((int)controller.getHostPort())
+    wstring msg = L"Unable to connect to controller on "
+                  + controller.getHostName()
+                  + L":" + 
toWString(static_cast<int>(controller.getHostPort()))
                   + L" (" + connExcpt.description() + L").";
     if (isErrorEnabled())
       logError(fctName, msg);
@@ -150,7 +152,7 @@
   catch (SocketIOException sockIOExcpt)
   {
     wstring msg = L"Could not authentify to " + controller.getHostName()
-                  + L":" + toWString((int)controller.getHostPort());
+                  + L":" + 
toWString(static_cast<int>(controller.getHostPort()));
     if (!protocolVersionSend)
     {
       msg+=L". Error while sending protocol version ("
@@ -626,7 +628,7 @@
     writeRequestOnStream(request);
     request.setId(receiveLongOrException());
     requestIdIsSet = true;
-    controllerResponse = (int)receiveIntOrException();
+    controllerResponse = static_cast<int>(receiveIntOrException());
   }
   catch (SocketIOException sioe)
   {
@@ -900,7 +902,7 @@
 {
   sendCommand(*driverSocketPtr, RetrieveExecuteUpdateResult);
   *driverSocketPtr << request.getId();
-  return (int)receiveIntOrException();
+  return static_cast<int>(receiveIntOrException());
 }
 std::list<ResultSetOrUpdateCount> Connection::retrieveExecuteResult(const 
Request &request)
     throw (SocketIOException, BackendException, ControllerException,
@@ -944,3 +946,33 @@
   while (hasResult || resultReceived.updateCount != -1);
   return results;
 }
+
+void Connection::reconnect() throw (UnexpectedException)
+{
+  wstring fctName(L"Connection::reconnect");
+  //Wait until other methods/Commands are done
+  LockScope ls(&connectionCS);
+
+  // close everything
+  close();
+  // try to reconnect to the same controller
+  try
+  {
+    if (initConnection() && finalizeConnect())
+    {
+      if (isInfoEnabled())
+        logInfo(fctName, L"Connection succeded");
+      isClosed = false;
+    }
+  }
+  catch (...)
+  {
+    //Do some clean up: we are in constructor so if we throw an exception, the
+    //destructor will never be called...
+    delete driverSocketPtr; driverSocketPtr = NULL;
+    delete connect_policy_ptr; connect_policy_ptr = NULL;
+  }
+  
+}
+
+

_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits

Reply via email to