Date: Thursday, December 29, 2005 @ 16:22:28
  Author: gilles
    Path: /cvsroot/carob/carob

Modified: include/Statement.hpp (1.18 -> 1.19) src/DriverResultSet.cpp
          (1.27 -> 1.28) src/Statement.cpp (1.18 -> 1.19)

Modified statement executeXXX result handling: result from executeQuery/Update 
is now the same as result from execute, but with only one ResultSet or 
UpdateCount in the result list.
Also fixed result destruction and const keyword


-------------------------+
 include/Statement.hpp   |   35 +++++++++++-----
 src/DriverResultSet.cpp |    2 
 src/Statement.cpp       |  100 +++++++++++++++++++++++++++++++---------------
 3 files changed, 93 insertions(+), 44 deletions(-)


Index: carob/include/Statement.hpp
diff -u carob/include/Statement.hpp:1.18 carob/include/Statement.hpp:1.19
--- carob/include/Statement.hpp:1.18    Thu Dec 22 17:02:51 2005
+++ carob/include/Statement.hpp Thu Dec 29 16:22:28 2005
@@ -159,7 +159,7 @@
    * 
    * @return true if there are more results pending for retrieval.
    */
-  bool                    moreResults() {return resultListIterator != 
resultList.end();}
+  bool                    moreResults() const {return resultListIterator != 
resultList.end();}
 
   /**
    * Return the true if next available result is a ResultSet or false it this 
is
@@ -206,14 +206,14 @@
    * 
    * @return the current result as an update count.
    */
-  int                     getUpdateCount() { return updateCount; }
+  int                     getUpdateCount() const { return lastUpdateCount; }
   /**
    * The queryTimeout limit is the number of seconds the driver will wait for a
    * Statement to execute.
    * 
    * @return the current query timeout limit in seconds; 0 = unlimited
    */
-  int                     getQueryTimeout() { return timeout; }
+  int                     getQueryTimeout() const { return timeout; }
   /**
    * Sets the number of seconds the driver will wait for a
    * <code>Statement</code> object to execute.
@@ -224,7 +224,7 @@
   void                    setQueryTimeout(int seconds)
                               throw (DriverException, UnexpectedException);
   /** Gets the fetch size */
-  int                     getFetchSize() { return fetchSize; }
+  int                     getFetchSize() const { return fetchSize; }
   /**
    * Sets the default fetch size for the produced ResultSet.
    * 
@@ -251,7 +251,7 @@
    * @return one of <code>TYPE_FORWARD_ONLY</code> or
    *         <code>TYPE_SCROLL_INSENSITIVE</code>
    */
-  int                     getResultSetType() { return resultSetType; }
+  int                     getResultSetType() const { return resultSetType; }
   /**
    * @param value an <code>int</code> value
    */
@@ -262,12 +262,12 @@
    * 
    * @return pointer to the current result set; null if there are no more
    */
-  DriverResultSet*        getResultSet() { return resultPtr; }
+  DriverResultSet*        getResultSet() const { return lastResultPtr; }
   /**
    * Retrieves the concurrency mode for the <code>ResultSet</code>.
    * @return <code>CONCUR_READ_ONLY</code> or <code>CONCUR_UPDATABLE</code>
    */
-  int                     getResultSetConcurrency()
+  int                     getResultSetConcurrency() const
                               { return resultSetConcurrency; }
   /**
    * Sets the concurrency mode for the <code>ResultSet</code>
@@ -284,7 +284,7 @@
    * 
    * @return the current maximum row limit; zero means unlimited
    */
-  int                     getMaxRows() { return maxRows; }
+  int                     getMaxRows() const { return maxRows; }
   /**
    * Sets the maximum number of rows that any <code>ResultSet</code> can
    * contain.
@@ -323,6 +323,12 @@
    */
   void                    setReadRequestParameters(
                               RequestWithResultSetParameters& request);
+  /**
+   * Nulls the given resultSet in the resultList. This function is called by
+   * 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);
   /** List of updateCount/ResultSet */
   std::list<ResultSetOrUpdateCount>  resultList;
   /** Iterator on the list of results */
@@ -331,9 +337,9 @@
   /** Connection that created us */
   Connection*             connectionPtr;
   /** Current result for a read request */
-  DriverResultSet*        resultPtr;
+  DriverResultSet*        lastResultPtr;
   /** Update count for a write request */
-  int                     updateCount;
+  int                     lastUpdateCount;
   /** Query timeout in seconds (0 means no timeout) */
   int                     timeout;
   /** Default ResultSet fetch size */
@@ -348,11 +354,18 @@
   int                     maxRows;
   /** Should the driver to escape processing before sending to the DB? */
   bool                    escapeProcessing;
+  /** End of result list marker, declared and initialized once for all */
+  ResultSetOrUpdateCount  endOfResultList;
   /**
    * Tests if this statement is closed.
    * @return <code>true</code> if this statement is closed
    */
-  bool                    isClosed() { return (connectionPtr == NULL); }
+  bool                    isClosed() const { return (connectionPtr == NULL); }
+  /**
+   * Iterates through the result list to close and delete result sets, then
+   * clears the list
+   */
+  void                    cleanUpResults();
   //Forbid default constructor: statements must be created by connections
   Statement();
 };
Index: carob/src/DriverResultSet.cpp
diff -u carob/src/DriverResultSet.cpp:1.27 carob/src/DriverResultSet.cpp:1.28
--- carob/src/DriverResultSet.cpp:1.27  Fri Dec 16 21:46:07 2005
+++ carob/src/DriverResultSet.cpp       Thu Dec 29 16:22:28 2005
@@ -45,7 +45,7 @@
   //Inform statement we are beeing destroyed
   if (owningStatementPtr != NULL)
   {
-    owningStatementPtr->resultPtr = NULL;
+    owningStatementPtr->nullResultSetPointer(this);
     owningStatementPtr = NULL;
   }
 }
Index: carob/src/Statement.cpp
diff -u carob/src/Statement.cpp:1.18 carob/src/Statement.cpp:1.19
--- carob/src/Statement.cpp:1.18        Thu Dec 22 17:02:51 2005
+++ carob/src/Statement.cpp     Thu Dec 29 16:22:28 2005
@@ -30,22 +30,53 @@
 
 Statement::Statement(Connection* c) :
 connectionPtr(c),
-resultPtr(NULL),
-updateCount(-1),
+lastResultPtr(NULL),
+lastUpdateCount(-1),
 timeout(0),
 fetchSize(0),
 cursorName(L""),
 maxRows(0),
 escapeProcessing(true)
 {
+  //FIXME: make this static
+  endOfResultList.isResultSet = false;
+  endOfResultList.updateCount = -1;
 }
 
 Statement::~Statement()
 {
-  if (resultPtr != NULL)
+  cleanUpResults();
+}
+
+void Statement::cleanUpResults()
+{
+  std::list<ResultSetOrUpdateCount>::iterator iter = resultList.begin();
+  while (iter != resultList.end())
+  {
+    if (iter->isResultSet)
+    {
+      //TODO: do we close it ?
+      //iter->resultSetPtr->close();
+      delete iter->resultSetPtr;
+    }
+    iter++;
+  }
+  resultList.clear();
+  lastResultPtr = NULL;
+  lastUpdateCount = -1;
+}
+
+void Statement::nullResultSetPointer(DriverResultSet* drsPtr)
+{
+  std::list<ResultSetOrUpdateCount>::iterator iter = resultList.begin();
+  while (iter != resultList.end())
   {
-    delete resultPtr;
-    resultPtr = NULL;
+    if (iter->isResultSet && iter->resultSetPtr == drsPtr)
+    {
+      iter->resultSetPtr = NULL;
+      break;
+    }
+    iter++;
   }
 }
 
@@ -86,13 +117,8 @@
   {
     throw DriverException(L"Unable to execute query on a closed statement");
   }
-  updateCount = -1; // invalidate the last write result
-  if (resultPtr != NULL)
-  { // Discard the previous result
-    resultPtr->close();
-    delete resultPtr;
-    resultPtr = NULL;
-  }
+  // invalidate the last write result
+  cleanUpResults();
 
   RequestWithResultSetParameters request(skeleton);
   request.setEscapeProcessing(escapeProcessing).setTimeoutInSeconds(timeout);
@@ -100,10 +126,17 @@
     request.setParameters(parameters);
   setReadRequestParameters(request);
 
-  resultPtr = connectionPtr->statementExecuteQuery(request);
-  resultPtr->setStatement(this);
-  return resultPtr;
+  ResultSetOrUpdateCount uniqueRS;
+  uniqueRS.isResultSet = true;
+  uniqueRS.resultSetPtr = connectionPtr->statementExecuteQuery(request);
+  resultList.push_back(uniqueRS);
+  resultList.push_back(endOfResultList);
+  resultListIterator = resultList.begin();
+  if (!getMoreResults())
+    throw DriverException(L"Invalid executeQuery result !");
+  return lastResultPtr;
 }
+
 //TODO: executeUpdateWithKeys
 int Statement::executeUpdate(const std::wstring &skeleton, const std::wstring 
&parameters) 
     throw (DriverException, SocketIOException, BackendException, 
@@ -114,17 +147,20 @@
   {
     throw DriverException(L"Unable to execute query on a closed statement");
   }
-  if (resultPtr != NULL)
-  { // Discard the previous result
-    resultPtr->close();
-    resultPtr = NULL;
-  }
+  cleanUpResults();
   Request request(skeleton);
   request.setEscapeProcessing(escapeProcessing).setTimeoutInSeconds(timeout);
   if (!parameters.empty())
     request.setParameters(parameters);
-  int updateCount = connectionPtr->statementExecuteUpdate(request);
-  return updateCount;
+  ResultSetOrUpdateCount uniqueUC;
+  uniqueUC.isResultSet = false;
+  uniqueUC.updateCount = connectionPtr->statementExecuteUpdate(request);
+  resultList.push_back(uniqueUC);
+  resultList.push_back(endOfResultList);
+  resultListIterator = resultList.begin();
+  if (getMoreResults())
+    throw DriverException(L"Invalid executeQuery result !");
+  return lastUpdateCount;
 }
 
 bool Statement::getMoreResults() throw (DriverException, SocketIOException,
@@ -139,15 +175,15 @@
 {
   if (current != KEEP_CURRENT_RESULT)
   {
-    if (resultPtr != NULL)
+    if (lastResultPtr != NULL)
       try
       {
-        resultPtr->close();
-        resultPtr = NULL;
+        lastResultPtr->close();
+        lastResultPtr = NULL;
       }
       catch (...) {} //ignore
   }
-  updateCount = -1;
+  lastUpdateCount = -1;
 
   ResultSetOrUpdateCount nextResult;
   if (resultListIterator == resultList.end())
@@ -159,13 +195,13 @@
   resultListIterator++;
   if (nextResult.isResultSet)
   {
-    resultPtr = nextResult.resultSetPtr;
-    resultPtr->setStatement(this);
+    lastResultPtr = nextResult.resultSetPtr;
+    lastResultPtr->setStatement(this);
     return true;
   }
   else
   {
-    updateCount = nextResult.updateCount;
+    lastUpdateCount = nextResult.updateCount;
     return false;
   }
 }
@@ -219,12 +255,12 @@
 void Statement::close()
 {
   // Force the ResultSet to close
-  if (resultPtr != NULL)
+  if (lastResultPtr != NULL)
   {
     try
     {
-      resultPtr->close();
-      resultPtr = NULL;
+      lastResultPtr->close();
+      lastResultPtr = NULL;
     }
     catch (...) {} //ignore
   }

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

Reply via email to