diff --git a/compilerplugins/clang/badstatics.cxx b/compilerplugins/clang/badstatics.cxx index 2e2a1ce61e4a..56f2b7be9f91 100644 --- a/compilerplugins/clang/badstatics.cxx +++ b/compilerplugins/clang/badstatics.cxx @@ -198,6 +198,7 @@ public: || name == "g_aWindowList" //vcl/unx/gtk/a11y/atkutil.cxx, asserted empty at exit || name == "aLogger" // FormulaLogger& FormulaLogger::get() in sc/source/core/tool/formulalogger.cxx + || name == "m_aUncommitedRegistrations" // sw/source/uibase/dbui/dbmgr.cxx || (loplugin::DeclCheck(pVarDecl).Var("aAllListeners") .Class("ScAddInListener").GlobalNamespace()) // not owning ) // these variables appear unproblematic diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx index d6ca22ef5b5c..0d27b355253d 100644 --- a/sw/inc/dbmgr.hxx +++ b/sw/inc/dbmgr.hxx @@ -257,7 +257,7 @@ class SW_DLLPUBLIC SwDBManager OUString m_sEmbeddedName; /// Store last registrations to revoke or commit - static std::vector m_aUncommitedRegistrations; + static std::vector> m_aUncommitedRegistrations; /// The document that owns this manager. SwDoc* m_pDoc; @@ -484,7 +484,7 @@ public: void RevokeLastRegistrations(); /// Accept not commited registrations - static void CommitLastRegistrations(); + void CommitLastRegistrations(); }; #endif 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 SwDBManager::m_aUncommitedRegistrations; +std::vector> 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> 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(pDocShell, sFind)); } return sFind; } @@ -2872,6 +2874,10 @@ void SwDBManager::LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const uno::Reference 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(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 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 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& 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: */