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