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
¶meters)
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