diff options
author | Lionel Elie Mamane <lionel@mamane.lu> | 2013-12-13 13:10:49 +0100 |
---|---|---|
committer | Lionel Elie Mamane <lionel@mamane.lu> | 2013-12-13 13:50:59 +0100 |
commit | d87c2c59c9c1d5f5825f355c9eb941fdf95b42f6 (patch) | |
tree | a29f0f2bf748fecf15ee26b25125edfe09eaf8c4 /connectivity/source/drivers | |
parent | 29c079f0480f63dd3f046f30c2b81023c2a5aebf (diff) |
sdbc file driver (Prepared)Statement: created ResultSet owned by *caller*
That is the only choice that makes sense, since the
(Prepared)Statement could die (go out of scope) before the ResultSet.
User code could do that, if it does not "need" the (Prepared)Statement
anymore. Also, it is only natural for user code to dispose a ResultSet
that it does not need anymore.
So we need to create a fresh ResultSet each time.
The "luck" here is that the sdbc file driver does not implement
the XMultipleResults interface; things get more hairy then.
Change-Id: Ibf2cb5e5b7ca90432a289c185a6b4fe32d1ba565
Diffstat (limited to 'connectivity/source/drivers')
-rw-r--r-- | connectivity/source/drivers/file/FPreparedStatement.cxx | 70 | ||||
-rw-r--r-- | connectivity/source/drivers/file/FResultSet.cxx | 7 | ||||
-rw-r--r-- | connectivity/source/drivers/file/FStatement.cxx | 37 |
3 files changed, 38 insertions, 76 deletions
diff --git a/connectivity/source/drivers/file/FPreparedStatement.cxx b/connectivity/source/drivers/file/FPreparedStatement.cxx index d34c5266c99f..f24748369d42 100644 --- a/connectivity/source/drivers/file/FPreparedStatement.cxx +++ b/connectivity/source/drivers/file/FPreparedStatement.cxx @@ -55,7 +55,6 @@ DBG_NAME( file_OPreparedStatement ) // ------------------------------------------------------------------------- OPreparedStatement::OPreparedStatement( OConnection* _pConnection) : OStatement_BASE2( _pConnection ) - ,m_pResultSet(NULL) { SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OPreparedStatement::OPreparedStatement" ); DBG_CTOR( file_OPreparedStatement, NULL ); @@ -74,15 +73,8 @@ void OPreparedStatement::disposing() SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OPreparedStatement::disposing" ); ::osl::MutexGuard aGuard(m_aMutex); - clearMyResultSet(); OStatement_BASE2::disposing(); - if(m_pResultSet) - { - m_pResultSet->release(); - m_pResultSet = NULL; - } - m_xParamColumns = NULL; m_xMetaData.clear(); if(m_aParameterRow.is()) @@ -90,8 +82,6 @@ void OPreparedStatement::disposing() m_aParameterRow->get().clear(); m_aParameterRow = NULL; } - - } // ------------------------------------------------------------------------- void OPreparedStatement::construct(const OUString& sql) throw(SQLException, RuntimeException) @@ -115,12 +105,17 @@ void OPreparedStatement::construct(const OUString& sql) throw(SQLException, Run OValueRefRow aTemp; OResultSet::setBoundedColumns(m_aEvaluateRow,aTemp,m_xParamColumns,xNames,sal_False,m_xDBMetaData,m_aColMapping); +} - m_pResultSet = createResultSet(); - m_pResultSet->acquire(); - m_xResultSet = Reference<XResultSet>(m_pResultSet); - initializeResultSet(m_pResultSet); +Reference<XResultSet> OPreparedStatement::makeResultSet() +{ + OResultSet *pResultSet = createResultSet(); + Reference<XResultSet> xRS(pResultSet); + initializeResultSet(pResultSet); + initResultSet(pResultSet); + return xRS; } + // ------------------------------------------------------------------------- Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) throw(RuntimeException) @@ -160,9 +155,6 @@ void SAL_CALL OPreparedStatement::close( ) throw(SQLException, RuntimeException SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OPreparedStatement::close" ); ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - - clearMyResultSet(); } // ------------------------------------------------------------------------- @@ -172,7 +164,12 @@ sal_Bool SAL_CALL OPreparedStatement::execute( ) throw(SQLException, RuntimeExc ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - initResultSet(); + Reference<XResultSet> xRS(makeResultSet()); + + // since we don't support the XMultipleResults interface, nobody will ever get that ResultSet... + Reference< XComponent > xComp(xRS, UNO_QUERY); + if (xComp.is()) + xComp->dispose(); return m_aSQLIterator.getStatementType() == SQL_STATEMENT_SELECT; } @@ -184,9 +181,20 @@ sal_Int32 SAL_CALL OPreparedStatement::executeUpdate( ) throw(SQLException, Run ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - initResultSet(); - - return m_pResultSet ? m_pResultSet->getRowCountResult() : sal_Int32(0); + Reference<XResultSet> xRS(makeResultSet()); + if(xRS.is()) + { + assert(dynamic_cast<OResultSet*>(xRS.get())); + const sal_Int32 res(static_cast<OResultSet*>(xRS.get())->getRowCountResult()); + // nobody will ever get that ResultSet... + Reference< XComponent > xComp(xRS, UNO_QUERY); + assert(xComp.is()); + if (xComp.is()) + xComp->dispose(); + return res; + } + else + return 0; } // ------------------------------------------------------------------------- @@ -213,7 +221,7 @@ Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery( ) throw(SQLE ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - return initResultSet(); + return makeResultSet(); } // ------------------------------------------------------------------------- @@ -408,21 +416,17 @@ OResultSet* OPreparedStatement::createResultSet() return new OResultSet(this,m_aSQLIterator); } // ----------------------------------------------------------------------------- -Reference<XResultSet> OPreparedStatement::initResultSet() +void OPreparedStatement::initResultSet(OResultSet *pResultSet) { SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OPreparedStatement::initResultSet" ); - m_pResultSet->clear(); - Reference<XResultSet> xRs(m_pResultSet); // check if we got enough parameters if ( (m_aParameterRow.is() && ( m_aParameterRow->get().size() -1 ) < m_xParamColumns->get().size()) || (m_xParamColumns.is() && !m_aParameterRow.is() && !m_aParameterRow->get().empty()) ) m_pConnection->throwGenericSQLException(STR_INVALID_PARA_COUNT,*this); - m_pResultSet->OpenImpl(); - m_pResultSet->setMetaData(getMetaData()); - - return xRs; + pResultSet->OpenImpl(); + pResultSet->setMetaData(getMetaData()); } // ----------------------------------------------------------------------------- void SAL_CALL OPreparedStatement::acquire() throw() @@ -554,13 +558,13 @@ void OPreparedStatement::describeParameter() } } // ----------------------------------------------------------------------------- -void OPreparedStatement::initializeResultSet(OResultSet* _pResult) +void OPreparedStatement::initializeResultSet(OResultSet* pRS) { SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OPreparedStatement::initializeResultSet" ); - OStatement_Base::initializeResultSet(_pResult); + OStatement_Base::initializeResultSet(pRS); - m_pResultSet->setParameterColumns(m_xParamColumns); - m_pResultSet->setParameterRow(m_aParameterRow); + pRS->setParameterColumns(m_xParamColumns); + pRS->setParameterRow(m_aParameterRow); // Substitute parameter (AssignValues and criteria): if (!m_xParamColumns->get().empty()) diff --git a/connectivity/source/drivers/file/FResultSet.cxx b/connectivity/source/drivers/file/FResultSet.cxx index 63c77c7e4cc4..d8fbde1da9a2 100644 --- a/connectivity/source/drivers/file/FResultSet.cxx +++ b/connectivity/source/drivers/file/FResultSet.cxx @@ -166,12 +166,7 @@ void OResultSet::disposing(void) m_pTable->release(); m_pTable = NULL; } - clear(); -} -// ----------------------------------------------------------------------------- -void OResultSet::clear() -{ - SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OResultSet::clear" ); + m_pFileSet = NULL; DELETEZ(m_pSortIndex); diff --git a/connectivity/source/drivers/file/FStatement.cxx b/connectivity/source/drivers/file/FStatement.cxx index 02bfe247deca..44e6b2f0c812 100644 --- a/connectivity/source/drivers/file/FStatement.cxx +++ b/connectivity/source/drivers/file/FStatement.cxx @@ -102,22 +102,10 @@ OStatement_Base::~OStatement_Base() DBG_DTOR( file_OStatement_Base, NULL ); } //------------------------------------------------------------------------------ -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); - if (xComp.is()) - xComp->dispose(); - m_xResultSet.clear(); -} -//------------------------------------------------------------------------------ void OStatement_BASE2::disposing() { ::osl::MutexGuard aGuard(m_aMutex); - disposeResultSet(); - if(m_pSQLAnalyzer) m_pSQLAnalyzer->dispose(); @@ -203,32 +191,8 @@ void OStatement_Base::reset() throw (SQLException) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - clearWarnings (); - if (m_xResultSet.get().is()) - clearMyResultSet(); -} -//-------------------------------------------------------------------- -// clearMyResultSet -// If a ResultSet was created for this Statement, close it -//-------------------------------------------------------------------- - -void OStatement_Base::clearMyResultSet () throw (SQLException) -{ - SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OStatement_Base::clearMyResultSet " ); - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - try - { - Reference<XCloseable> xCloseable; - if ( ::comphelper::query_interface( m_xResultSet.get(), xCloseable ) ) - xCloseable->close(); - } - catch( const DisposedException& ) { } - - m_xResultSet.clear(); } // ------------------------------------------------------------------------- @@ -304,7 +268,6 @@ Reference< XResultSet > SAL_CALL OStatement::executeQuery( const OUString& sql ) OResultSet* pResult = createResultSet(); xRS = pResult; initializeResultSet(pResult); - m_xResultSet = Reference<XResultSet>(pResult); pResult->OpenImpl(); |