Date: Tuesday, December 6, 2005 @ 17:38:35
Author: gilles
Path: /cvsroot/carob/carob
Modified: include/DriverResultSet.hpp (1.17 -> 1.18)
src/DriverResultSet.cpp (1.13 -> 1.14)
Added clean-up of data related vectors in destructor and in receive rows
(function clearAllData() added)
Init of owningStatement to NULL in constructor to prevent hazardous deletions
-----------------------------+
include/DriverResultSet.hpp | 3 +-
src/DriverResultSet.cpp | 61 ++++++++++++++++++++++++++++++++++--------
2 files changed, 52 insertions(+), 12 deletions(-)
Index: carob/include/DriverResultSet.hpp
diff -u carob/include/DriverResultSet.hpp:1.17
carob/include/DriverResultSet.hpp:1.18
--- carob/include/DriverResultSet.hpp:1.17 Fri Dec 2 15:53:07 2005
+++ carob/include/DriverResultSet.hpp Tue Dec 6 17:38:34 2005
@@ -283,7 +283,8 @@
*/
void checkRowAndColPosAndSetNullFlag(int32_t
columnIndex)
throw (SQLException, UnexpectedException);
-
+ /** Clear/delete data, nulls and typeTags vectors */
+ void clearAllData();
};
/**
Index: carob/src/DriverResultSet.cpp
diff -u carob/src/DriverResultSet.cpp:1.13 carob/src/DriverResultSet.cpp:1.14
--- carob/src/DriverResultSet.cpp:1.13 Fri Dec 2 15:53:07 2005
+++ carob/src/DriverResultSet.cpp Tue Dec 6 17:38:35 2005
@@ -35,13 +35,61 @@
DriverResultSet::~DriverResultSet()
{
+ clearAllData();
for (int32_t i=0; i<nbOfColumns; i++)
{
delete fields[i];
fields[i] = NULL;
}
+ nbOfColumns = -1;
+ //Inform statement we are beeing destroyed
+ if (owningStatementPtr != NULL)
+ {
+ owningStatementPtr->resultPtr = NULL;
+ owningStatementPtr = NULL;
+ }
}
+void DriverResultSet::clearAllData()
+{
+ //empty all data
+ dataIsNull = true;
+ if (data.size() > 0)
+ {
+ size_t cnt = 0;
+ //First delete data contained in data[x][y].as_other.
+ //These are void* so we need to switch on the column type to delete it
+ //Let's make this switch only once per column !
+ for (size_t col=0; col<data[0].size(); col++)
+ {
+ switch (columnTypeTags[col])
+ {
+ case TT_STRING:
+ for (cnt=0; cnt<data.size(); cnt++)
+ {
+ if (!nulls[cnt][col])
+ {
+ logDebug(*((wstring*)(data[cnt][col]).as_other), L"deletion...");
+ delete ((wstring*)(data[cnt][col]).as_other);
+ }
+ }
+ break;
+ }
+ }
+ //Now remove data from the vector
+ for (cnt=0; cnt<data.size(); cnt++)
+ {
+ data[cnt].clear();
+ }
+ data.clear();
+ //The types
+ columnTypeTags.clear();
+ //And finally the nulls
+ for (cnt=0; cnt<nulls.size(); cnt++)
+ nulls[cnt].clear();
+ nulls.clear();
+ }
+}
DriverResultSet::DriverResultSet(Connection* conPtr) throw (ProtocolException,
SocketIOException, NotImplementedException, UnexpectedException) :
currentRow(-1),
@@ -52,6 +100,7 @@
wasNullFlag(false),
resultSetType(0),
resultSetConcurrency(0),
+owningStatementPtr(NULL),
isClosed(true)
{
wstring fctName(L"DriverResultSet::DriverResultSet");
@@ -228,17 +277,7 @@
void DriverResultSet::receiveRows() throw (SocketIOException,
ProtocolException,
UnexpectedException)
{
- //empty all data
- dataIsNull = true;
- size_t cnt = 0;
- for (cnt=0; cnt<data.size(); cnt++)
- data[cnt].clear();
- data.clear();
- columnTypeTags.clear();
- for (cnt=0; cnt<nulls.size(); cnt++)
- nulls[cnt].clear();
- nulls.clear();
-
+ clearAllData();
const DriverSocket& socket = connectionPtr->getDriverSocket();
socket>>nbOfRows;
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits