summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLionel Elie Mamane <lionel@mamane.lu>2014-06-17 18:12:45 +0200
committerLionel Elie Mamane <lionel@mamane.lu>2014-06-18 16:17:32 +0200
commit2504ffccd02f42211dcbc92a5aa6addb04a4b717 (patch)
tree9b424f2fc1a551b7f84b22e522c82710efc20546
parent6ba2e7fba0fe7bb200b7482eb6e007c1af3461c4 (diff)
fdo#80084 file driver PreparedStatement: close previous ResultSet on reexec
This partially reverts commit d87c2c59c9c1d5f5825f355c9eb941fdf95b42f6 "sdbc file driver (Prepared)Statement: created ResultSet owned by *caller*" From that commit, we keep the part about not reusing the same ResultSet on reexecution (client code may have disposed it or closed it), but we revert the part about not closing / disposing the previous ResultSet on reexecution. Change-Id: I4946207f9740484b2f5fbc3575a5708fe39f357c
-rw-r--r--connectivity/source/drivers/file/FPreparedStatement.cxx9
-rw-r--r--connectivity/source/drivers/file/FStatement.cxx31
-rw-r--r--connectivity/source/inc/file/FStatement.hxx4
3 files changed, 36 insertions, 8 deletions
diff --git a/connectivity/source/drivers/file/FPreparedStatement.cxx b/connectivity/source/drivers/file/FPreparedStatement.cxx
index fb9b2c2e48ec..2d7db2fa5ff1 100644
--- a/connectivity/source/drivers/file/FPreparedStatement.cxx
+++ b/connectivity/source/drivers/file/FPreparedStatement.cxx
@@ -101,15 +101,16 @@ void OPreparedStatement::construct(const OUString& sql) throw(SQLException, Run
Reference<XResultSet> OPreparedStatement::makeResultSet()
{
+ closeResultSet();
+
OResultSet *pResultSet = createResultSet();
Reference<XResultSet> xRS(pResultSet);
initializeResultSet(pResultSet);
initResultSet(pResultSet);
+ m_xResultSet = xRS;
return xRS;
}
-
-
Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) throw(RuntimeException, std::exception)
{
Any aRet = OStatement_BASE2::queryInterface(rType);
@@ -145,6 +146,8 @@ void SAL_CALL OPreparedStatement::close( ) throw(SQLException, RuntimeException
{
::osl::MutexGuard aGuard( m_aMutex );
checkDisposed(OStatement_BASE::rBHelper.bDisposed);
+
+ closeResultSet();
}
@@ -157,6 +160,7 @@ sal_Bool SAL_CALL OPreparedStatement::execute( ) throw(SQLException, RuntimeExc
// since we don't support the XMultipleResults interface, nobody will ever get that ResultSet...
Reference< XComponent > xComp(xRS, UNO_QUERY);
+ assert(xComp.is() || !xRS.is());
if (xComp.is())
xComp->dispose();
@@ -512,7 +516,6 @@ void OPreparedStatement::describeParameter()
}
}
}
-
void OPreparedStatement::initializeResultSet(OResultSet* pRS)
{
OStatement_Base::initializeResultSet(pRS);
diff --git a/connectivity/source/drivers/file/FStatement.cxx b/connectivity/source/drivers/file/FStatement.cxx
index fb3361a0e817..bf88543a3b42 100644
--- a/connectivity/source/drivers/file/FStatement.cxx
+++ b/connectivity/source/drivers/file/FStatement.cxx
@@ -95,10 +95,23 @@ OStatement_Base::~OStatement_Base()
delete m_pSQLAnalyzer;
}
+void OStatement_Base::disposeResultSet()
+{
+ SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OStatement_Base::disposeResultSet" );
+ // free the cursor if alive
+ Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY);
+ assert(xComp.is() || !m_xResultSet.get().is());
+ if (xComp.is())
+ xComp->dispose();
+ m_xResultSet.clear();
+}
+
void OStatement_BASE2::disposing()
{
::osl::MutexGuard aGuard(m_aMutex);
+ disposeResultSet();
+
if(m_pSQLAnalyzer)
m_pSQLAnalyzer->dispose();
@@ -173,17 +186,26 @@ void SAL_CALL OStatement_Base::close( ) throw(SQLException, RuntimeException, s
dispose();
}
-
-void OStatement_Base::reset() throw (SQLException)
+void OStatement_Base::closeResultSet () throw (SQLException)
{
+ SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OStatement_Base::clearMyResultSet " );
::osl::MutexGuard aGuard( m_aMutex );
checkDisposed(OStatement_BASE::rBHelper.bDisposed);
- clearWarnings ();
+ Reference< XCloseable > xCloseable(m_xResultSet.get(), UNO_QUERY);
+ assert(xCloseable.is() || !m_xResultSet.get().is());
+ if (xCloseable.is())
+ {
+ try
+ {
+ xCloseable->close();
+ }
+ catch( const DisposedException& ) { }
+ }
+ m_xResultSet.clear();
}
-
Any SAL_CALL OStatement_Base::getWarnings( ) throw(SQLException, RuntimeException, std::exception)
{
::osl::MutexGuard aGuard( m_aMutex );
@@ -252,6 +274,7 @@ Reference< XResultSet > SAL_CALL OStatement::executeQuery( const OUString& sql )
OResultSet* pResult = createResultSet();
xRS = pResult;
initializeResultSet(pResult);
+ m_xResultSet = xRS;
pResult->OpenImpl();
diff --git a/connectivity/source/inc/file/FStatement.hxx b/connectivity/source/inc/file/FStatement.hxx
index 3fb60bb74738..9b540dd612ab 100644
--- a/connectivity/source/inc/file/FStatement.hxx
+++ b/connectivity/source/inc/file/FStatement.hxx
@@ -68,6 +68,7 @@ namespace connectivity
::std::vector<TAscendingOrder> m_aOrderbyAscending;
::com::sun::star::sdbc::SQLWarning m_aLastWarning;
+ ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XResultSet> m_xResultSet; // The last ResultSet created
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData> m_xDBMetaData;
::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> m_xColNames; // table columns // for this Statement
@@ -112,9 +113,10 @@ namespace connectivity
// create the analyzer
virtual OSQLAnalyzer* createAnalyzer();
- void reset () throw( ::com::sun::star::sdbc::SQLException);
+ void closeResultSet () throw( ::com::sun::star::sdbc::SQLException);
sal_Int32 getPrecision ( sal_Int32 sqlType);
+ void disposeResultSet();
void GetAssignValues();
void SetAssignValue(const OUString& aColumnName,
const OUString& aValue,