Date: Friday, January 13, 2006 @ 12:51:47
Author: gilles
Path: /cvsroot/carob/carob
Modified: include/Connection.hpp (1.49 -> 1.50) include/Statement.hpp
(1.26 -> 1.27) src/Connection.cpp (1.56 -> 1.57)
src/Statement.cpp (1.24 -> 1.25)
Leak fix: preparedStatementGetMetaData now returns a ResultSet pointer so we
can destroy it (this is a semi-rollback)
------------------------+
include/Connection.hpp | 6 +++---
include/Statement.hpp | 9 ++++-----
src/Connection.cpp | 8 +++-----
src/Statement.cpp | 10 +++++++---
4 files changed, 17 insertions(+), 16 deletions(-)
Index: carob/include/Connection.hpp
diff -u carob/include/Connection.hpp:1.49 carob/include/Connection.hpp:1.50
--- carob/include/Connection.hpp:1.49 Fri Jan 13 11:31:32 2006
+++ carob/include/Connection.hpp Fri Jan 13 12:51:47 2006
@@ -99,7 +99,6 @@
class Statement;
class ParameterStatement;
-class ResultSetMetaData;
/**
* This class implements the communication protocol to the Controller.
@@ -292,10 +291,11 @@
ProtocolException, BackendException,
UnexpectedException);
/**
- * Returns the metadata of the sql template as a resultset.
+ * Returns the metadata of the sql template as a resultset (which will
contain
+ * the metadata).
* @param sqlTemplate sql template of the PreparedStatement
*/
- ResultSetMetaData* preparedStatementGetMetaData(const std::wstring
&sqlTemplate)
+ DriverResultSet* preparedStatementGetMetaData(const std::wstring
&sqlTemplate)
throw (SocketIOException, BackendException,
ProtocolException,
NotImplementedException, UnexpectedException);
Index: carob/include/Statement.hpp
diff -u carob/include/Statement.hpp:1.26 carob/include/Statement.hpp:1.27
--- carob/include/Statement.hpp:1.26 Thu Jan 12 18:05:05 2006
+++ carob/include/Statement.hpp Fri Jan 13 12:51:47 2006
@@ -375,12 +375,11 @@
/** Current result for a read request */
DriverResultSet* lastResultPtr;
/**
- * Metadata corresponding either to the lastResultPtr's metadata (if
- * <code>getMetaData()</code> was called right after a read request) or to
this
- * statement metadata (thus becoming a prepared statement) if
- * <code>getMetaData()</code> was called before a read query that returned a
- * valid resultset
+ * ResultSet containing the metadata got from
+ * Connection#preparedStatementGetMetaData(Request)
*/
+ DriverResultSet* metadata_holder_ptr;
+ /** metadata got from #getMetaData() */
ResultSetMetaData* rs_metadata_ptr;
/** Update count for a write request */
int lastUpdateCount;
Index: carob/src/Connection.cpp
diff -u carob/src/Connection.cpp:1.56 carob/src/Connection.cpp:1.57
--- carob/src/Connection.cpp:1.56 Fri Jan 13 11:31:32 2006
+++ carob/src/Connection.cpp Fri Jan 13 12:51:47 2006
@@ -22,7 +22,6 @@
#include "Connection.hpp"
#include "Statement.hpp"
#include "ParameterStatement.hpp"
-#include "ResultSetMetaData.hpp"
using std::wstring;
@@ -495,13 +494,13 @@
L"Request cannot be processed : connection is closed!");
}
-ResultSetMetaData* Connection::preparedStatementGetMetaData(const wstring
&sqlTemplate)
+DriverResultSet* Connection::preparedStatementGetMetaData(const wstring
&sqlTemplate)
throw (SocketIOException, BackendException, ProtocolException,
NotImplementedException,
UnexpectedException)
{
checkIfConnected();
wstring fctName(L"Connection::PreparedStatementGetMetaData");
-
+
LockScope ls(&connectionCS);
sendCommand(*driverSocketPtr, PreparedStatementGetMetaData);
@@ -510,8 +509,7 @@
if (isDebugEnabled())
logDebug(fctName, L"Statement sent successfully");
- DriverResultSet* drsPtr = receiveResultSet();
- return new ResultSetMetaData(drsPtr);
+ return receiveResultSet();
}
void Connection::setConnectionParametersOnRequest(Request &request)
Index: carob/src/Statement.cpp
diff -u carob/src/Statement.cpp:1.24 carob/src/Statement.cpp:1.25
--- carob/src/Statement.cpp:1.24 Thu Jan 12 17:33:46 2006
+++ carob/src/Statement.cpp Fri Jan 13 12:51:47 2006
@@ -35,6 +35,7 @@
sql_request(L""),
connectionPtr(c),
lastResultPtr(NULL),
+metadata_holder_ptr(NULL),
rs_metadata_ptr(NULL),
lastUpdateCount(-1),
timeout(0),
@@ -65,8 +66,8 @@
resultList.clear();
lastResultPtr = NULL;
lastUpdateCount = -1;
- delete rs_metadata_ptr;
- rs_metadata_ptr = NULL;
+ delete rs_metadata_ptr; rs_metadata_ptr = NULL;
+ delete metadata_holder_ptr; metadata_holder_ptr = NULL;
}
void Statement::removeResultSetFromList(DriverResultSet* drsPtr)
@@ -274,14 +275,17 @@
UnexpectedException)
{
// clean-up old one (if none, won't do anything)
+ delete metadata_holder_ptr; metadata_holder_ptr = NULL;
delete rs_metadata_ptr; rs_metadata_ptr = NULL;
+
if (lastResultPtr != NULL)
{
rs_metadata_ptr = new ResultSetMetaData(lastResultPtr);
}
else
{
- rs_metadata_ptr = connectionPtr->preparedStatementGetMetaData(sql_request);
+ metadata_holder_ptr =
connectionPtr->preparedStatementGetMetaData(sql_request);
+ rs_metadata_ptr = new ResultSetMetaData(metadata_holder_ptr);
}
return rs_metadata_ptr;
}
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits