diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2017-09-08 10:57:55 +0200 |
---|---|---|
committer | Szymon Kłos <szymon.klos@collabora.com> | 2017-09-09 11:42:50 +0200 |
commit | 97477ee5e11951a5a25a91b89f1b71a1b78ac8f5 (patch) | |
tree | 77d49f492b37bc05ac9eafc77b7a7f28c31530ed /sw/source | |
parent | a45800f010f3e063c6f31426fcdba76aa5b43d3e (diff) |
tdf#108572 remove connections only for current shell
Also remove connections to temp files.
Change-Id: Ie5c09eb365d1246e053dc52884c72687ac226f3c
Reviewed-on: https://gerrit.libreoffice.org/42095
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/uibase/app/apphdl.cxx | 8 | ||||
-rw-r--r-- | sw/source/uibase/dbui/dbmgr.cxx | 44 |
2 files changed, 39 insertions, 13 deletions
diff --git a/sw/source/uibase/app/apphdl.cxx b/sw/source/uibase/app/apphdl.cxx index a9c72fe84ac2..9839eddc2d6c 100644 --- a/sw/source/uibase/app/apphdl.cxx +++ b/sw/source/uibase/app/apphdl.cxx @@ -479,7 +479,13 @@ void SwMailMergeWizardExecutor::ExecutionFinished() if (xMMConfig) xMMConfig->Commit(); - SwDBManager::CommitLastRegistrations(); + SwDoc* pDoc = m_pView->GetDocShell()->GetDoc(); + if (pDoc) + { + SwDBManager* pDbManager = pDoc->GetDBManager(); + if (pDbManager) + pDbManager->CommitLastRegistrations(); + } // release/destroy asynchronously Application::PostUserEvent( LINK( this, SwMailMergeWizardExecutor, DestroyDialogHdl ) ); diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 12e91f75b047..0004fbd9e456 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -161,7 +161,7 @@ void lcl_emitEvent(SfxEventHintId nEventId, sal_Int32 nStrId, SfxObjectShell* pD } -std::vector<OUString> SwDBManager::m_aUncommitedRegistrations; +std::vector<std::pair<SwDocShell*, OUString>> SwDBManager::m_aUncommitedRegistrations; enum class SwDBNextRecord { NEXT, FIRST }; static bool lcl_ToNextRecord( SwDSParam* pParam, const SwDBNextRecord action = SwDBNextRecord::NEXT ); @@ -804,6 +804,8 @@ SwDBManager::SwDBManager(SwDoc* pDoc) SwDBManager::~SwDBManager() { + RevokeLastRegistrations(); + // copy required, m_DataSourceParams can be modified while disposing components std::vector<uno::Reference<sdbc::XConnection>> aCopiedConnections; for (auto & pParam : m_DataSourceParams) @@ -2615,7 +2617,7 @@ OUString SwDBManager::LoadAndRegisterDataSource(const vcl::Window* pParent, SwDo } sFind = LoadAndRegisterDataSource( type, aURLAny, DBCONN_FLAT == type ? &aSettings : nullptr, aURI, nullptr, nullptr, pDocShell ); - m_aUncommitedRegistrations.push_back(sFind); + m_aUncommitedRegistrations.push_back(std::pair<SwDocShell*, OUString>(pDocShell, sFind)); } return sFind; } @@ -2872,6 +2874,10 @@ void SwDBManager::LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const uno::Reference<uno::XInterface> xDataSource(xDatabaseContext->getByName(aURL), uno::UNO_QUERY); xDatabaseContext->registerObject( sDataSource, xDataSource ); + + // temp file - don't remember connection + if (rData.sDataSource.isEmpty()) + m_aUncommitedRegistrations.push_back(std::pair<SwDocShell*, OUString>(nullptr, sDataSource)); } void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh, @@ -3189,24 +3195,38 @@ void SwDBManager::RevokeLastRegistrations() { if (m_aUncommitedRegistrations.size()) { - SwView* pView = m_pDoc->GetDocShell()->GetView(); - std::shared_ptr<SwMailMergeConfigItem> xConfigItem = pView->GetMailMergeConfigItem(); - if (xConfigItem) + SwView* pView = ( m_pDoc && m_pDoc->GetDocShell() ) ? m_pDoc->GetDocShell()->GetView() : nullptr; + if (pView) { - xConfigItem->DisposeResultSet(); - xConfigItem->DocumentReloaded(); + std::shared_ptr<SwMailMergeConfigItem> xConfigItem = pView->GetMailMergeConfigItem(); + if (xConfigItem) + { + xConfigItem->DisposeResultSet(); + xConfigItem->DocumentReloaded(); + } } - for (const OUString& rName : m_aUncommitedRegistrations) - RevokeDataSource(rName); - - m_aUncommitedRegistrations.clear(); + for (auto it = m_aUncommitedRegistrations.begin(); it != m_aUncommitedRegistrations.end();) + { + if ((m_pDoc && it->first == m_pDoc->GetDocShell()) || it->first == nullptr) + { + RevokeDataSource(it->second); + it = m_aUncommitedRegistrations.erase(it); + } + else + it++; + } } } void SwDBManager::CommitLastRegistrations() { - m_aUncommitedRegistrations.clear(); + auto predicate = [this](const std::pair<SwDocShell*, OUString>& x) + { return x.first == this->m_pDoc->GetDocShell(); }; + + m_aUncommitedRegistrations.erase( + std::remove_if(m_aUncommitedRegistrations.begin(), m_aUncommitedRegistrations.end(), predicate), + m_aUncommitedRegistrations.end()); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |