From a3eece5a885395888e3b8e779e1fa46f9538d7af Mon Sep 17 00:00:00 2001 From: "Andrzej J.R. Hunt" Date: Sun, 10 Nov 2013 08:34:27 +0000 Subject: Pass Document directly to Driver for embedded databases. Change-Id: I346a8ef07c5d695b3aa879f5c25cc4af97e25b99 Reviewed-on: https://gerrit.libreoffice.org/6627 Reviewed-by: Lionel Elie Mamane Tested-by: Lionel Elie Mamane --- .../source/drivers/firebird/Connection.cxx | 54 ++++++---------------- .../source/drivers/firebird/Connection.hxx | 18 +++++--- 2 files changed, 25 insertions(+), 47 deletions(-) (limited to 'connectivity') 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 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 > 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 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 #include #include +#include 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). @@ -130,12 +142,6 @@ namespace connectivity /** Statements owned by this connection. */ 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 -- cgit