summaryrefslogtreecommitdiff
path: root/connectivity
diff options
context:
space:
mode:
authorAndrzej J.R. Hunt <andrzej@ahunt.org>2013-11-10 08:34:27 +0000
committerLionel Elie Mamane <lionel@mamane.lu>2013-11-13 14:38:40 +0000
commita3eece5a885395888e3b8e779e1fa46f9538d7af (patch)
tree7f92fdda3c429949ea80298623dbdbd7ab05fac4 /connectivity
parentd634d1a18a33fbef272a4cfdf094ce1ea1bc5d6c (diff)
Pass Document directly to Driver for embedded databases.
Change-Id: I346a8ef07c5d695b3aa879f5c25cc4af97e25b99 Reviewed-on: https://gerrit.libreoffice.org/6627 Reviewed-by: Lionel Elie Mamane <lionel@mamane.lu> Tested-by: Lionel Elie Mamane <lionel@mamane.lu>
Diffstat (limited to 'connectivity')
-rw-r--r--connectivity/source/drivers/firebird/Connection.cxx54
-rw-r--r--connectivity/source/drivers/firebird/Connection.hxx18
2 files changed, 25 insertions, 47 deletions
diff --git a/connectivity/source/drivers/firebird/Connection.cxx b/connectivity/source/drivers/firebird/Connection.cxx
index 728e54ffe69d..d00478abdec5 100644
--- a/connectivity/source/drivers/firebird/Connection.cxx
+++ b/connectivity/source/drivers/firebird/Connection.cxx
@@ -124,6 +124,7 @@ void Connection::construct(const ::rtl::OUString& url, const Sequence< PropertyV
if (url.equals("sdbc:embedded:firebird"))
{
m_bIsEmbedded = true;
+
const PropertyValue* pIter = info.getConstArray();
const PropertyValue* pEnd = pIter + info.getLength();
@@ -137,6 +138,10 @@ void Connection::construct(const ::rtl::OUString& url, const Sequence< PropertyV
{
pIter->Value >>= aStorageURL;
}
+ else if ( pIter->Name == "Document" )
+ {
+ pIter->Value >>= m_xParentDocument;
+ }
}
if ( !m_xEmbeddedStorage.is() )
@@ -284,52 +289,19 @@ void Connection::construct(const ::rtl::OUString& url, const Sequence< PropertyV
// it in the .odb.
rebuildIndexes();
- attachAsDocumentListener(aStorageURL);
+ // We need to attach as a document listener in order to be able to store
+ // the temporary db back into the .odb when saving
+ uno::Reference<XDocumentEventBroadcaster> xBroadcaster(m_xParentDocument, UNO_QUERY);
+
+ if (xBroadcaster.is())
+ xBroadcaster->addDocumentEventListener(this);
+ else
+ assert(false);
}
osl_atomic_decrement( &m_refCount );
}
-void Connection::attachAsDocumentListener(const OUString& rStorageURL)
-{
- // We can't directly access the Document that is using this connection
- // (since a Connection can in fact be used independently of a DB document)
- // hence we need to iterate through all Frames to find our Document.
- uno::Reference< frame::XDesktop2 > xFramesSupplier =
- frame::Desktop::create(::comphelper::getProcessComponentContext());
- uno::Reference< frame::XFrames > xFrames(xFramesSupplier->getFrames(),
- uno::UNO_QUERY);
- if (!xFrames.is())
- return;
-
- uno::Sequence< uno::Reference<frame::XFrame> > xFrameList =
- xFrames->queryFrames( frame::FrameSearchFlag::ALL );
-
- for (sal_Int32 i = 0; i < xFrameList.getLength(); i++)
- {
- uno::Reference< frame::XFrame > xf = xFrameList[i];
- uno::Reference< XController > xc;
- if (xf.is())
- xc = xf->getController();
-
- uno::Reference< XModel > xm;
- if (xc.is())
- xm = xc->getModel();
-
- if (xm.is() && xm->getURL() == rStorageURL)
- {
- uno::Reference<XDocumentEventBroadcaster> xBroadcaster( xm, UNO_QUERY);
- if (xBroadcaster.is())
- {
- xBroadcaster->addDocumentEventListener(this);
- return;
- }
- //TODO: remove in the disposing?
- }
- }
- assert(false); // If we have an embedded DB we must have a document
-}
-
//----- XServiceInfo ---------------------------------------------------------
IMPLEMENT_SERVICE_INFO(Connection, "com.sun.star.sdbc.drivers.firebird.Connection",
"com.sun.star.sdbc.Connection")
diff --git a/connectivity/source/drivers/firebird/Connection.hxx b/connectivity/source/drivers/firebird/Connection.hxx
index 6c8dba4db75b..40ebee7920c2 100644
--- a/connectivity/source/drivers/firebird/Connection.hxx
+++ b/connectivity/source/drivers/firebird/Connection.hxx
@@ -45,6 +45,7 @@
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/sdbc/XWarningsSupplier.hpp>
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#include <com/sun/star/util/XModifiable.hpp>
namespace connectivity
{
@@ -96,6 +97,17 @@ namespace connectivity
/* EMBEDDED MODE DATA */
/** Denotes that we have a .fdb stored within a .odb file. */
sal_Bool m_bIsEmbedded;
+
+ /**
+ * Handle for the parent DatabaseDocument. We need to notify this
+ * whenever any data is written to our temporary database so that
+ * the user is able to save this back to the .odb file.
+ *
+ * Note that this is ONLY set in embedded mode.
+ */
+ ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifiable >
+ m_xParentDocument;
+
/**
* Handle for the folder within the .odb where we store our .fdb
* (Only used if m_bIsEmbedded is true).
@@ -131,12 +143,6 @@ namespace connectivity
OWeakRefArray m_aStatements;
/**
- * If we are embedded in a .odb we need to listen to Document events
- * in order to save the .fdb back into the .odb.
- */
- void attachAsDocumentListener(const ::rtl::OUString& rStorageURL);
-
- /**
* Firebird stores binary collations for indexes on Character based
* columns, these can be binary-incompatible between different icu
* version, hence we need to rebuild the indexes when switching icu