diff options
-rw-r--r-- | connectivity/source/drivers/firebird/Connection.cxx | 54 | ||||
-rw-r--r-- | connectivity/source/drivers/firebird/Connection.hxx | 18 | ||||
-rw-r--r-- | dbaccess/source/core/dataaccess/datasource.cxx | 7 |
3 files changed, 31 insertions, 48 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 diff --git a/dbaccess/source/core/dataaccess/datasource.cxx b/dbaccess/source/core/dataaccess/datasource.cxx index 94cd6da18a1d..83bb45eaa496 100644 --- a/dbaccess/source/core/dataaccess/datasource.cxx +++ b/dbaccess/source/core/dataaccess/datasource.cxx @@ -703,12 +703,17 @@ Reference< XConnection > ODatabaseSource::buildLowLevelConnection(const OUString if ( m_pImpl->isEmbeddedDatabase() ) { sal_Int32 nCount = aDriverInfo.getLength(); - aDriverInfo.realloc(nCount + 2 ); + aDriverInfo.realloc(nCount + 3 ); + aDriverInfo[nCount].Name = "URL"; aDriverInfo[nCount++].Value <<= m_pImpl->getURL(); + aDriverInfo[nCount].Name = "Storage"; Reference< css::document::XDocumentSubStorageSupplier> xDocSup( m_pImpl->getDocumentSubStorageSupplier() ); aDriverInfo[nCount++].Value <<= xDocSup->getDocumentSubStorage("database",ElementModes::READWRITE); + + aDriverInfo[nCount].Name = "Document"; + aDriverInfo[nCount++].Value <<= getDatabaseDocument(); } if (nAdditionalArgs) xReturn = xManager->getConnectionWithInfo(m_pImpl->m_sConnectURL, ::comphelper::concatSequences(aUserPwd,aDriverInfo)); |