Date: Friday, December 30, 2005 @ 11:38:24
  Author: gilles
    Path: /cvsroot/carob/carob

Modified: include/Connection.hpp (1.39 -> 1.40) include/Statement.hpp
          (1.19 -> 1.20) src/Connection.cpp (1.46 -> 1.47)
          src/DriverResultSet.cpp (1.28 -> 1.29) src/Statement.cpp (1.19
          -> 1.20)

Added statement list in connection in order to be able to destroy all created 
statements when closing connection.


-------------------------+
 include/Connection.hpp  |   15 +++++++++++++--
 include/Statement.hpp   |    2 +-
 src/Connection.cpp      |   29 ++++++++++++++++++++++++++---
 src/DriverResultSet.cpp |    2 +-
 src/Statement.cpp       |   15 +++++++--------
 5 files changed, 48 insertions(+), 15 deletions(-)


Index: carob/include/Connection.hpp
diff -u carob/include/Connection.hpp:1.39 carob/include/Connection.hpp:1.40
--- carob/include/Connection.hpp:1.39   Wed Dec 28 18:14:57 2005
+++ carob/include/Connection.hpp        Fri Dec 30 11:38:24 2005
@@ -102,6 +102,8 @@
 {
 /** DriverResultSet must access getDriverSocketPtr() function */
 friend class DriverResultSet;
+/** Statements must inform connection about their destruction */
+friend class Statement;
 public:
   /**
    * Creates a new connection and connects to a controller with the given
@@ -327,12 +329,13 @@
    */
   void                checkIfConnected() const throw (SocketIOException,
                           UnexpectedException);
-  
+
   /**
    * Gets the driver socket for i/o operations
    * @return reference to this connection socket
    */
   const DriverSocket& getDriverSocket() { return *driverSocketPtr; }
+
 private:
   /** This connection socket pointer */
   DriverSocket*       driverSocketPtr;
@@ -356,7 +359,15 @@
    * statement
    */
   bool                mustBeginTransaction;
-
+  /**
+   * List of pointers to the [parameter]statements created by this connection.
+   * Kept in order to destroy them when closing connection
+   */
+  std::list<Statement*> created_statements;
+  /**
+   * Removes given statement from created statement list to avoid double 
deletes
+   */
+  void                removeStatementFromList(Statement* stPtr);
   /**
    * Forbids Connection creation that would lead to unexpected state.
    * A connection is either created, ie. connected to a controller or destroyed
Index: carob/include/Statement.hpp
diff -u carob/include/Statement.hpp:1.19 carob/include/Statement.hpp:1.20
--- carob/include/Statement.hpp:1.19    Thu Dec 29 16:22:28 2005
+++ carob/include/Statement.hpp Fri Dec 30 11:38:24 2005
@@ -328,7 +328,7 @@
    * the driverResultSet destructor to inform that the give resultSet is beeing
    * destroyed, so that any reference to it is not valid anymore
    */
-  void                    nullResultSetPointer(DriverResultSet* drsPtr);
+  void                    removeResultSetFromList(DriverResultSet* drsPtr);
   /** List of updateCount/ResultSet */
   std::list<ResultSetOrUpdateCount>  resultList;
   /** Iterator on the list of results */
Index: carob/src/Connection.cpp
diff -u carob/src/Connection.cpp:1.46 carob/src/Connection.cpp:1.47
--- carob/src/Connection.cpp:1.46       Wed Dec 28 18:14:57 2005
+++ carob/src/Connection.cpp    Fri Dec 30 11:38:24 2005
@@ -211,7 +211,18 @@
   }
   return true;
 }
-
+void Connection::removeStatementFromList(Statement* stPtr)
+{
+  for (std::list<Statement*>::iterator iter = created_statements.begin();
+      iter != created_statements.end(); iter++)
+  {
+    if (*iter == stPtr)
+    {
+      created_statements.erase(iter);
+      break;
+    }
+  }
+}
 bool Connection::close()
 {
   wstring fctName(L"Connection::closeConnection");
@@ -219,6 +230,14 @@
   //Wait until other methods/Commands are done
   LockScope ls(&connectionCS);
 
+  //delete all statement created by this connection
+  for (std::list<Statement*>::iterator iter = created_statements.begin();
+      iter != created_statements.end(); iter++)
+  {
+    delete *iter;
+  }
+  created_statements.clear();
+
   if (driverSocketPtr == NULL)
   {
     return false;
@@ -412,14 +431,18 @@
     UnexpectedException)
 {
   checkIfConnected();
-  return new Statement(this);
+  Statement* stPtr = new Statement(this);
+  created_statements.push_back(stPtr);
+  return stPtr;
 }
 
 ParameterStatement* Connection::createParameterStatement(const std::wstring 
&query) 
     throw (SocketIOException, UnexpectedException)
 {
   checkIfConnected();
-  return new ParameterStatement(this, query);
+  ParameterStatement* pstPtr = new ParameterStatement(this, query);
+  created_statements.push_back(pstPtr);
+  return pstPtr;
 }
 
 
Index: carob/src/DriverResultSet.cpp
diff -u carob/src/DriverResultSet.cpp:1.28 carob/src/DriverResultSet.cpp:1.29
--- carob/src/DriverResultSet.cpp:1.28  Thu Dec 29 16:22:28 2005
+++ carob/src/DriverResultSet.cpp       Fri Dec 30 11:38:24 2005
@@ -45,7 +45,7 @@
   //Inform statement we are beeing destroyed
   if (owningStatementPtr != NULL)
   {
-    owningStatementPtr->nullResultSetPointer(this);
+    owningStatementPtr->removeResultSetFromList(this);
     owningStatementPtr = NULL;
   }
 }
Index: carob/src/Statement.cpp
diff -u carob/src/Statement.cpp:1.19 carob/src/Statement.cpp:1.20
--- carob/src/Statement.cpp:1.19        Thu Dec 29 16:22:28 2005
+++ carob/src/Statement.cpp     Fri Dec 30 11:38:24 2005
@@ -46,37 +46,36 @@
 Statement::~Statement()
 {
   cleanUpResults();
+  connectionPtr->removeStatementFromList(this);
 }
 
 void Statement::cleanUpResults()
 {
-  std::list<ResultSetOrUpdateCount>::iterator iter = resultList.begin();
-  while (iter != resultList.end())
+  for (std::list<ResultSetOrUpdateCount>::iterator iter = resultList.begin();
+      iter != resultList.end(); iter++)
   {
     if (iter->isResultSet)
     {
-      //TODO: do we close it ?
+      //FIXME: do we close it ?
       //iter->resultSetPtr->close();
       delete iter->resultSetPtr;
     }
-    iter++;
   }
   resultList.clear();
   lastResultPtr = NULL;
   lastUpdateCount = -1;
 }
 
-void Statement::nullResultSetPointer(DriverResultSet* drsPtr)
+void Statement::removeResultSetFromList(DriverResultSet* drsPtr)
 {
-  std::list<ResultSetOrUpdateCount>::iterator iter = resultList.begin();
-  while (iter != resultList.end())
+  for (std::list<ResultSetOrUpdateCount>::iterator iter = resultList.begin();
+      iter != resultList.end(); iter++)
   {
     if (iter->isResultSet && iter->resultSetPtr == drsPtr)
     {
       iter->resultSetPtr = NULL;
       break;
     }
-    iter++;
   }
 }
 

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

Reply via email to