sw/source/uibase/dbui/dbmgr.cxx |   20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

New commits:
commit a432a2e481baffa77e6f25584efbfbb3b68bc9a6
Author: Caolán McNamara <caol...@redhat.com>
Date:   Wed Jun 6 12:59:58 2018 +0100

    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 <c...@libreoffice.org>
    Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk>

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)
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to