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

Reply via email to