diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-06-06 12:59:58 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2018-06-07 09:29:12 +0200 |
commit | a432a2e481baffa77e6f25584efbfbb3b68bc9a6 (patch) | |
tree | 52fb63e4143be625e26e8244435d7d2f6f9dc4c0 | |
parent | b3c4dbf459065ae7d6a68dd565da741ed18bd608 (diff) |
tdf#117824 switch embedded database storage away from doc on revoke
otherwise the database document still has the embedded storage
open when the attempt to remove the storage is made
Change-Id: Ie313923b969bdbc53b27b00e379ac20240ffb6e3
Reviewed-on: https://gerrit.libreoffice.org/55388
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
-rw-r--r-- | sw/source/uibase/dbui/dbmgr.cxx | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index bae61f7e5be1..9b29507fa46b 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -100,6 +100,7 @@ #include <com/sun/star/mail/MailAttachment.hpp> #include <comphelper/processfactory.hxx> #include <comphelper/property.hxx> +#include <comphelper/storagehelper.hxx> #include <comphelper/string.hxx> #include <comphelper/types.hxx> #include <mailmergehelper.hxx> @@ -2995,11 +2996,30 @@ OUString SwDBManager::LoadAndRegisterDataSource(const OUString &rURI, const OUSt return LoadAndRegisterDataSource_Impl( DBConnURIType::UNKNOWN, nullptr, INetURLObject(rURI), pDestDir, nullptr ); } +namespace +{ + // tdf#117824 switch the embedded database away from using its current storage and point it to temporary storage + // which allows the original storage to be deleted + void switchEmbeddedDatabaseStorage(uno::Reference<sdb::XDatabaseContext>& rDatabaseContext, const OUString& rName) + { + uno::Reference<sdb::XDocumentDataSource> xDS(rDatabaseContext->getByName(rName), uno::UNO_QUERY); + if (!xDS) + return; + uno::Reference<document::XStorageBasedDocument> xStorageDoc(xDS->getDatabaseDocument(), uno::UNO_QUERY); + if (!xStorageDoc) + return; + xStorageDoc->switchToStorage(comphelper::OStorageHelper::GetTemporaryStorage()); + } +} + void SwDBManager::RevokeDataSource(const OUString& rName) { uno::Reference<sdb::XDatabaseContext> xDatabaseContext = sdb::DatabaseContext::create(comphelper::getProcessComponentContext()); if (xDatabaseContext->hasByName(rName)) + { + switchEmbeddedDatabaseStorage(xDatabaseContext, rName); xDatabaseContext->revokeObject(rName); + } } void SwDBManager::LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const SwDocShell& rDocShell) |