summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-06-03 18:54:08 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-06-03 19:29:06 +0200
commitb79017f49a487a3981b1cd9f488ed5062eeb880b (patch)
tree1c8cff3b899221fcd2f1a50e8121c6e0363493fe
parent1096ca46a23fc4df30865c243e10881157fe4840 (diff)
sw: move name of the embedded data source def from SwDBData to SwDBManager
The problem is that SwDBData just describes the current data source, and when changing that, the embedded name doesn't change, so they should be separate. Change-Id: I2dd7e0a97b9f7d6a3a74a5752467515a0a09171a
-rw-r--r--sw/inc/dbmgr.hxx7
-rw-r--r--sw/inc/swdbdata.hxx6
-rw-r--r--sw/source/core/doc/doc.cxx9
-rw-r--r--sw/source/core/doc/docfmt.cxx1
-rw-r--r--sw/source/uibase/dbui/dbmgr.cxx29
-rw-r--r--sw/source/uibase/uno/SwXDocumentSettings.cxx10
6 files changed, 41 insertions, 21 deletions
diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx
index 27c86a7268f0..e397e5777373 100644
--- a/sw/inc/dbmgr.hxx
+++ b/sw/inc/dbmgr.hxx
@@ -199,6 +199,8 @@ friend class SwConnectionDisposedListener_Impl;
SwDSParamArr aDataSourceParams;
SwDBManager_Impl* pImpl;
const SwXMailMerge* pMergeEvtSrc; ///< != 0 if mail merge events are to be send
+ /// Name of the embedded database that's included in the current document.
+ OUString m_sEmbeddedName;
SAL_DLLPRIVATE SwDSParam* FindDSData(const SwDBData& rData, bool bCreate);
SAL_DLLPRIVATE SwDSParam* FindDSConnection(const OUString& rSource, bool bCreate);
@@ -372,7 +374,7 @@ public:
const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > *pSettings = 0);
/// Load the embedded data source of the document and also register it.
- static void LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const SwDocShell& rDocShell);
+ void LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const SwDocShell& rDocShell);
/** try to get the data source from the given connection through the XChild interface.
If this is not possible, the data source will be created through its name.
@@ -405,6 +407,9 @@ public:
sal_Int32 _nCommandType,
const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection
);
+
+ void setEmbeddedName(const OUString& rEmbeddedName, SwDocShell& rDocShell);
+ OUString getEmbeddedName() const;
};
#endif
diff --git a/sw/inc/swdbdata.hxx b/sw/inc/swdbdata.hxx
index 02ccf6807815..6d91e2b85558 100644
--- a/sw/inc/swdbdata.hxx
+++ b/sw/inc/swdbdata.hxx
@@ -28,16 +28,14 @@ struct SwDBData
OUString sDataSource;
OUString sCommand; //table, query or statement
sal_Int32 nCommandType; //com::sun::star::sdb::CommandType
- /// Name of the embedded database that's included in the current document.
- OUString sEmbeddedName;
SwDBData() :
nCommandType(0){}
void dumpAsXml(struct _xmlTextWriter* pWriter) const;
bool operator !=(const SwDBData& rCmp) const
- {return rCmp.sDataSource != sDataSource || rCmp.sCommand != sCommand || rCmp.nCommandType != nCommandType || rCmp.sEmbeddedName != sEmbeddedName;}
+ {return rCmp.sDataSource != sDataSource || rCmp.sCommand != sCommand || rCmp.nCommandType != nCommandType;}
bool operator ==(const SwDBData& rCmp) const
- {return rCmp.sDataSource == sDataSource && rCmp.sCommand == sCommand && rCmp.nCommandType == nCommandType && rCmp.sEmbeddedName == sEmbeddedName;}
+ {return rCmp.sDataSource == sDataSource && rCmp.sCommand == sCommand && rCmp.nCommandType == nCommandType;}
};
#endif
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index b427c93430f9..fb43e0c78b25 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -494,15 +494,6 @@ void SwDoc::ChgDBData(const SwDBData& rNewData)
{
if( rNewData != maDBData )
{
- if (maDBData.sEmbeddedName != rNewData.sEmbeddedName && GetDocShell())
- {
- uno::Reference<embed::XStorage> xStorage = GetDocShell()->GetStorage();
- // It's OK that we don't have the named sub-storage yet, in case
- // we're in the process of creating it.
- if (xStorage->hasByName(rNewData.sEmbeddedName))
- SwDBManager::LoadAndRegisterEmbeddedDataSource(rNewData, *GetDocShell());
- }
-
maDBData = rNewData;
getIDocumentState().SetModified();
}
diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx
index bb1ea8717ee7..4acd8e885bf6 100644
--- a/sw/source/core/doc/docfmt.cxx
+++ b/sw/source/core/doc/docfmt.cxx
@@ -1958,7 +1958,6 @@ void SwDBData::dumpAsXml(xmlTextWriterPtr pWriter) const
xmlTextWriterWriteAttribute(pWriter, BAD_CAST("sDataSource"), BAD_CAST(sDataSource.toUtf8().getStr()));
xmlTextWriterWriteAttribute(pWriter, BAD_CAST("sCommand"), BAD_CAST(sCommand.toUtf8().getStr()));
xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nCommandType"), BAD_CAST(OString::number(nCommandType).getStr()));
- xmlTextWriterWriteAttribute(pWriter, BAD_CAST("sEmbeddedName"), BAD_CAST(sEmbeddedName.toUtf8().getStr()));
xmlTextWriterEndElement(pWriter);
}
diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx
index fd57164a5993..b138730f5c46 100644
--- a/sw/source/uibase/dbui/dbmgr.cxx
+++ b/sw/source/uibase/dbui/dbmgr.cxx
@@ -2667,6 +2667,12 @@ void SwDBManager::LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const
{
uno::Reference<sdb::XDatabaseContext> xDatabaseContext = sdb::DatabaseContext::create(comphelper::getProcessComponentContext());
+ OUString sDataSource = rData.sDataSource;
+
+ // Fallback, just in case the document would contain an embedded data source, but no DB fields.
+ if (sDataSource.isEmpty())
+ sDataSource = "EmbeddedDatabase";
+
if (xDatabaseContext->hasByName(rData.sDataSource))
xDatabaseContext->revokeObject(rData.sDataSource);
@@ -2674,7 +2680,7 @@ void SwDBManager::LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const
const INetURLObject& rURLObject = rDocShell.GetMedium()->GetURLObject();
OUString aURL = "vnd.sun.star.pkg://";
aURL += INetURLObject::encode(rURLObject.GetMainURL(INetURLObject::DECODE_WITH_CHARSET), INetURLObject::PART_AUTHORITY, INetURLObject::ENCODE_ALL);
- aURL += "/" + INetURLObject::encode(rData.sEmbeddedName, INetURLObject::PART_FPATH, INetURLObject::ENCODE_ALL);
+ aURL += "/" + INetURLObject::encode(m_sEmbeddedName, INetURLObject::PART_FPATH, INetURLObject::ENCODE_ALL);
uno::Reference<uno::XInterface> xDataSource(xDatabaseContext->getByName(aURL), uno::UNO_QUERY);
xDatabaseContext->registerObject(rData.sDataSource, xDataSource);
@@ -2966,6 +2972,27 @@ uno::Reference<XResultSet> SwDBManager::createCursor(const OUString& _sDataSourc
return xResultSet;
}
+void SwDBManager::setEmbeddedName(const OUString& rEmbeddedName, SwDocShell& rDocShell)
+{
+ bool bLoad = m_sEmbeddedName != rEmbeddedName && !rEmbeddedName.isEmpty();
+
+ m_sEmbeddedName = rEmbeddedName;
+
+ if (bLoad)
+ {
+ uno::Reference<embed::XStorage> xStorage = rDocShell.GetStorage();
+ // It's OK that we don't have the named sub-storage yet, in case
+ // we're in the process of creating it.
+ if (xStorage->hasByName(rEmbeddedName))
+ LoadAndRegisterEmbeddedDataSource(rDocShell.GetDoc()->GetDBData(), rDocShell);
+ }
+}
+
+OUString SwDBManager::getEmbeddedName() const
+{
+ return m_sEmbeddedName;
+}
+
SwConnectionDisposedListener_Impl::SwConnectionDisposedListener_Impl(SwDBManager& rManager)
: m_pDBManager(&rManager)
{
diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx
index 7d513d4767f5..78ad21e2b3f0 100644
--- a/sw/source/uibase/uno/SwXDocumentSettings.cxx
+++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx
@@ -46,6 +46,7 @@
#include "swmodule.hxx"
#include "cfgitems.hxx"
#include "prtopt.hxx"
+#include "dbmgr.hxx"
using namespace comphelper;
using namespace ::com::sun::star;
@@ -508,9 +509,9 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
break;
case HANDLE_EMBEDDED_DATABASE_NAME:
{
- SwDBData aData = mpDoc->GetDBData();
- if (rValue >>= aData.sEmbeddedName)
- mpDoc->ChgDBData(aData);
+ OUString sEmbeddedName;
+ if (rValue >>= sEmbeddedName)
+ mpDoc->GetDBManager()->setEmbeddedName(sEmbeddedName, *mpDocSh);
}
break;
case HANDLE_SAVE_VERSION_ON_CLOSE:
@@ -988,8 +989,7 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
break;
case HANDLE_EMBEDDED_DATABASE_NAME:
{
- const SwDBData& rData = mpDoc->GetDBDesc();
- rValue <<= rData.sEmbeddedName;
+ rValue <<= mpDoc->GetDBManager()->getEmbeddedName();
}
break;
case HANDLE_SAVE_VERSION_ON_CLOSE: