User: vg      
Date: 05/03/10 08:33:22

Modified:
 /dba/dbaccess/source/core/dataaccess/
  databasecontext.cxx

Log:
 INTEGRATION: CWS dba24 (1.26.2); FILE MERGED
 2005/02/22 10:07:20 oj 1.26.2.5: build problems
 2005/02/21 13:08:35 oj 1.26.2.4: RESYNC: (1.26-1.28); FILE MERGED
 2005/02/18 12:25:26 oj 1.26.2.3: #i42460# changes for the separation of 
datasource and database document(model)
 2005/02/04 14:16:14 oj 1.26.2.2: #i42056# remember password if said so
 2005/02/02 12:52:52 oj 1.26.2.1: #i41887# throw NoSuchElementException

File Changes:

Directory: /dba/dbaccess/source/core/dataaccess/
================================================

File [changed]: databasecontext.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/dbaccess/source/core/dataaccess/databasecontext.cxx?r1=1.28&r2=1.29
Delta lines:  +117 -81
----------------------
--- databasecontext.cxx 16 Feb 2005 15:58:18 -0000      1.28
+++ databasecontext.cxx 10 Mar 2005 16:33:20 -0000      1.29
@@ -150,8 +150,9 @@
 #ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX
 #include <svtools/pathoptions.hxx>
 #endif
-#ifndef SVTOOLS_FILENOTATION_HXX
 #include <svtools/filenotation.hxx>
+#ifndef _DBA_COREDATAACCESS_DATABASEDOCUMENT_HXX_
+#include "databasedocument.hxx"
 #endif
 
 using namespace ::com::sun::star::sdbc;
@@ -210,13 +211,12 @@
                }
        }
 
-//============================================================
 //= ODatabaseContext
 //==========================================================================
 DBG_NAME(ODatabaseContext)
 //--------------------------------------------------------------------------
 Reference< XInterface >
-       ODatabaseContext_CreateInstance(const Reference< XMultiServiceFactory > 
 & xServiceManager)
+ODatabaseContext_CreateInstance(const Reference< XMultiServiceFactory >  & 
xServiceManager)
 {
        return (*new ODatabaseContext(xServiceManager));
 }
@@ -241,7 +241,7 @@
 rtl::OUString ODatabaseContext::getImplementationName_Static() throw( 
RuntimeException )
 
 {
-       return 
rtl::OUString::createFromAscii("com.sun.star.comp.dba.ODatabaseContext");
+       return 
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.dba.ODatabaseContext"));
 }
 
 
//------------------------------------------------------------------------------
@@ -280,7 +280,11 @@
 //--------------------------------------------------------------------------
 Reference< XInterface > SAL_CALL ODatabaseContext::createInstance(  ) throw 
(Exception, RuntimeException)
 {
-    return *(new ODatabaseSource(m_xServiceManager,this));
+       ::rtl::Reference<ODatabaseModelImpl> pImpl(new 
ODatabaseModelImpl(m_xServiceManager));
+       pImpl->m_pDBContext = this;
+       Reference< XInterface > xRet = *(new ODatabaseSource(pImpl));
+       pImpl->m_xDataSource = Reference<XDataSource>(xRet,UNO_QUERY);
+    return xRet;
 }
 
 //--------------------------------------------------------------------------
@@ -304,7 +308,6 @@
 
        return xExistent;
 }
-
 // DatabaseAccessContext_Base
 
//------------------------------------------------------------------------------
 void ODatabaseContext::disposing()
@@ -314,15 +317,15 @@
        m_aContainerListeners.disposeAndClear(aDisposeEvent);
 
        // dispose the data sources
+       ObjectCache::iterator aEnd = m_aDatabaseObjects.end();
        for     (       ObjectCache::iterator   aIter = 
m_aDatabaseObjects.begin();
-                       aIter != m_aDatabaseObjects.end();
+                       aIter != aEnd;
                        ++aIter
                )
        {
-               aIter->second.second = WeakReferenceHelper();
-               Reference< XComponent > xComp(aIter->second.first.get(), 
UNO_QUERY);
-               if ( xComp.is() )
-                       xComp->dispose();
+               OSL_ENSURE(aIter->second->m_refCount != 0,"Object is already 
disposed");
+               aIter->second->clear();
+               aIter->second->dispose();               
        }
        m_aDatabaseObjects.clear();
 }
@@ -351,12 +354,11 @@
 Reference< XInterface >  ODatabaseContext::getRegisteredObject(const 
rtl::OUString& _rName) throw( Exception, RuntimeException )
 {
        MutexGuard aGuard(m_aMutex);
-       if (DatabaseAccessContext_Base::rBHelper.bDisposed)
-               throw DisposedException();
+       
::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
 
     ::rtl::OUString sURL;
     if ( !getURLForRegisteredObject( _rName, sURL ) )
-        NoSuchElementException();
+        throw NoSuchElementException(_rName, *this);
 
        if ( !sURL.getLength() )
         // there is a registration for this name, but no URL
@@ -372,6 +374,10 @@
 // 
-----------------------------------------------------------------------------
 Reference< XInterface > ODatabaseContext::loadObjectFromURL(const 
::rtl::OUString& _rName,const ::rtl::OUString& _sURL)
 {
+    INetURLObject aURL( _sURL );
+    if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
+        throw NoSuchElementException(_rName, *this);
+
        try
        {
                ::ucb::Content aContent(_sURL,Reference< 
::com::sun::star::ucb::XCommandEnvironment >());
@@ -404,60 +410,70 @@
                throw WrappedTargetException( _sURL, 
Reference<XNamingService>(this), makeAny( e ) );
        }
 
-       Reference< XInterface > xExistent = getObject(_sURL);
-       if ( xExistent.is() ) // we found a object registered under the URL
-       {
-               m_aDatabaseObjects.erase(_sURL);
-               registerPrivate(_rName,xExistent);
+       Reference< XInterface > xExistent;
+       ObjectCache::iterator aFind = m_aDatabaseObjects.find(_sURL);
+       if ( aFind != m_aDatabaseObjects.end() ) // we found a object 
registered under the URL
+       { // register it under the new name
+               
m_aDatabaseObjects.insert(ObjectCache::value_type(_rName,aFind->second));
+               xExistent = aFind->second->getDataSource();
+               m_aDatabaseObjects.erase(aFind);
        }
-       else
+    if ( !xExistent.is() )
        {
-               xExistent = *(new ODatabaseSource(*this, _rName, 
m_xServiceManager,this));
+               ::rtl::Reference<ODatabaseModelImpl> pImpl(new 
ODatabaseModelImpl(_rName,m_xServiceManager,this));
+               xExistent = *(new ODatabaseSource(pImpl));
+               pImpl->m_xDataSource = 
Reference<XDataSource>(xExistent,UNO_QUERY);
 
                Sequence< PropertyValue > aArgs(1);
                aArgs[0].Name = 
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FileName"));
                aArgs[0].Value <<= _sURL;
 
-               Reference<XModel> xModel(xExistent,UNO_QUERY);
+           Reference<XModel> xModel = new ODatabaseDocument(pImpl);
+        // calls registerPrivate in attachResource
                xModel->attachResource(_sURL,aArgs);
+    }
 
+    setTransientProperties(_sURL,xExistent);
+       return xExistent;
+}
+// 
-----------------------------------------------------------------------------
+void ODatabaseContext::setTransientProperties(const ::rtl::OUString& _sURL, 
const Reference< XInterface > & _rxObject)
+{
                // check if we have any session persistent properties to 
initialize the new object with
                if ( m_aDatasourceProperties.end() != 
m_aDatasourceProperties.find(_sURL) )
                {       // yes, we do ....
-                       Reference< XPropertySet > xDSProps(xExistent, 
UNO_QUERY);
+               Reference< XPropertySet > xDSProps(_rxObject, UNO_QUERY);
                        if (xDSProps.is())
                        {
                                const Sequence< PropertyValue >& 
rSessionPersistentProps = m_aDatasourceProperties[_sURL];
                                const PropertyValue* pSessionPersistentProps = 
rSessionPersistentProps.getConstArray();
+                       try
+                       {
 
                                for (sal_Int32 i=0; 
i<rSessionPersistentProps.getLength(); ++i, ++pSessionPersistentProps)
                                {
-                                       try
-                                       {
                                                
xDSProps->setPropertyValue(pSessionPersistentProps->Name, 
pSessionPersistentProps->Value);
                                        }
+                       }
                                        catch(Exception&)
                                        {
-                                               
DBG_ERROR("ODatabaseContext::getRegisteredObject: could not set a 
session-persistent property on the data source!");
-                                       }
+                               
DBG_ERROR("ODatabaseContext::setTransientProperties: could not set a 
session-persistent property on the data source!");
                                }
                        }
                        else
-                               
DBG_ERROR("ODatabaseContext::getRegisteredObject: missing an interface!");
-               }
+                       DBG_ERROR("ODatabaseContext::setTransientProperties: 
missing an interface!");
        }
-       return xExistent;
 }
 
 
//------------------------------------------------------------------------------
 void ODatabaseContext::registerObject(const rtl::OUString& _rName, const 
Reference< XInterface > & _rxObject) throw( Exception, RuntimeException )
 {
        MutexGuard aGuard(m_aMutex);
-       if ( DatabaseAccessContext_Base::rBHelper.bDisposed )
-               throw DisposedException();
+       
::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
 
+       Reference<XDocumentDataSource> xDocumentDataSource(_rxObject,UNO_QUERY);
+       Reference< XModel > xModel(xDocumentDataSource.is() ? 
xDocumentDataSource->getDatabaseDocument() : Reference< XOfficeDatabaseDocument 
>(),UNO_QUERY);
        Reference< XComponent > xComponent(_rxObject,UNO_QUERY);
-       Reference<XModel> xModel(_rxObject,UNO_QUERY);
        if ( !_rName.getLength() || !xComponent.is() || !xModel.is() )
                throw IllegalArgumentException(::rtl::OUString(),*this,1);
 
@@ -482,7 +498,8 @@
                aThisDriverSettings.setNodeValue(getDbLocationNodeName(), 
makeAny(sURL));
                aDbRegisteredNamesRoot.commit();
        }
-       registerPrivate(sURL,_rxObject);
+
+//     registerPrivate(sURL,_rxObject);
 
        // notify our container listeners
        ContainerEvent aEvent(static_cast<XContainer*>(this), makeAny(_rName), 
makeAny(_rxObject), Any());
@@ -503,7 +520,7 @@
                        ++aLookup
                )
        {
-               Reference< XInterface > 
xDataSource(aLookup->second.first.get(), UNO_QUERY);
+               Reference< XInterface > 
xDataSource(aLookup->second->m_xDataSource.get(), UNO_QUERY);
                if ( xDataSource == xSource )
                        break;
        }
@@ -546,7 +563,6 @@
                }
 
                m_aDatasourceProperties[aLookup->first] = aRememberProps;
-               m_aDatabaseObjects.erase(aLookup);
        }
 }
 
@@ -566,8 +582,7 @@
 void ODatabaseContext::revokeObject(const rtl::OUString& _rName) throw( 
Exception, RuntimeException )
 {
        MutexGuard aGuard(m_aMutex);
-       if ( DatabaseAccessContext_Base::rBHelper.bDisposed )
-               throw DisposedException();
+    
::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
 
        Reference< XInterface > xExistent;
 
@@ -584,13 +599,13 @@
                ObjectCacheIterator aExistent = m_aDatabaseObjects.find(sURL);
                if ( aExistent != m_aDatabaseObjects.end() )
                {
-                       xExistent = aExistent->second.first.get();
+                       xExistent = aExistent->second->m_xDataSource;
                        if (xExistent.is())
                        {
                                Reference< XComponent > xComponent(xExistent, 
UNO_QUERY);
                                if ( xComponent.is() )
                                {
-                                       Reference<XEventListener> 
xListenerHelper(aExistent->second.second.get(),UNO_QUERY);
+                                       Reference<XEventListener> 
xListenerHelper(*this,UNO_QUERY);
                                        
xComponent->removeEventListener(xListenerHelper);
                                }
                        }
@@ -601,7 +616,7 @@
                aDbRegisteredNamesRoot.commit();
        }
        else
-               throw NoSuchElementException();
+               throw NoSuchElementException(_rName,*this);
 
        // notify our container listeners
        ContainerEvent aEvent(static_cast<XContainer*>(this), makeAny(_rName), 
Any(), makeAny(xExistent));
@@ -622,8 +637,7 @@
 sal_Bool ODatabaseContext::hasElements(void) throw( RuntimeException )
 {
        MutexGuard aGuard(m_aMutex);
-       if ( DatabaseAccessContext_Base::rBHelper.bDisposed)
-               throw DisposedException();
+       
::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
 
        return 0 != getElementNames().getLength();
 }
@@ -642,8 +656,7 @@
                                                                                
                                  WrappedTargetException, RuntimeException )
 {
        MutexGuard aGuard(m_aMutex);
-       if ( DatabaseAccessContext_Base::rBHelper.bDisposed )
-               throw DisposedException();
+       
::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
        if ( !_rName.getLength() )
                throw NoSuchElementException(_rName, *this);
 
@@ -691,8 +704,7 @@
 Sequence< rtl::OUString > ODatabaseContext::getElementNames(void) throw( 
RuntimeException )
 {
        MutexGuard aGuard(m_aMutex);
-       if ( DatabaseAccessContext_Base::rBHelper.bDisposed)
-               throw DisposedException();
+    
::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
 
        DECLARE_STL_USTRINGACCESS_MAP( bool , TNameMap);
        TNameMap aRet;
@@ -713,8 +725,7 @@
 sal_Bool ODatabaseContext::hasByName(const rtl::OUString& _rName) throw( 
RuntimeException )
 {
        MutexGuard aGuard(m_aMutex);
-       if ( DatabaseAccessContext_Base::rBHelper.bDisposed)
-               throw DisposedException();
+       
::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
 
        OConfigurationTreeRoot aDbRegisteredNamesRoot = 
OConfigurationTreeRoot::createWithServiceFactory(
                m_xServiceManager, getDbRegisteredNamesNodeName(), -1, 
OConfigurationTreeRoot::CM_READONLY);
@@ -727,36 +738,61 @@
        ObjectCacheIterator aFind = m_aDatabaseObjects.find(_rName);
        Reference< XInterface > xExistent;
        if ( aFind != m_aDatabaseObjects.end() )
-       {
-               xExistent = aFind->second.first.get();
-               if ( !xExistent.is() )
-               {
-                       // the adapter still exists, but the object is already 
dead
-                       m_aDatabaseObjects.erase(aFind);
-               }
-       }
+               xExistent = aFind->second->getDataSource();
        return xExistent;
 }
 // 
-----------------------------------------------------------------------------
-void ODatabaseContext::registerPrivate(const ::rtl::OUString& _sName, const 
Reference< XInterface >& _xObject)
+void ODatabaseContext::registerPrivate(const ::rtl::OUString& _sName
+                                                                          
,const ::rtl::Reference<ODatabaseModelImpl>& _pModelImpl)
 {
        //      OSL_ENSURE(m_aDatabaseObjects.find(_sName) == 
m_aDatabaseObjects.end(),"Name already exists!");
        if ( m_aDatabaseObjects.find(_sName) == m_aDatabaseObjects.end() )
        {
-               m_aDatabaseObjects.insert(
-                               ObjectCache::value_type(_sName,
-                                       
ObjectCacheType(WeakReferenceHelper(_xObject),WeakReferenceHelper(*this))));
+               
m_aDatabaseObjects.insert(ObjectCache::value_type(_sName,_pModelImpl.get()));
+
+               Reference<XDataSource> xDs = _pModelImpl->getDataSource();
+        setTransientProperties(_sName,xDs);
                // add as dispose listener to the data source object, so we 
know when it's dying to save the session-persistent
                // properties
-               Reference< XComponent > xComponent(_xObject,UNO_QUERY);
+               Reference< XComponent > xComponent(xDs,UNO_QUERY);
                if ( xComponent.is() )
                        xComponent->addEventListener(this);
        }
 }
 // 
-----------------------------------------------------------------------------
+void ODatabaseContext::deregisterPrivate(const ::rtl::OUString& _sName)
+{
+       m_aDatabaseObjects.erase(_sName);
+}
+// 
-----------------------------------------------------------------------------
 void ODatabaseContext::nameChangePrivate(const ::rtl::OUString& _sOldName, 
const ::rtl::OUString& _sNewName)
 {
-       registerPrivate(_sNewName,getObject(_sOldName));
+    ObjectCache::iterator aFind = m_aDatabaseObjects.find(_sOldName);
+    registerPrivate(_sNewName,aFind->second);
+       m_aDatabaseObjects.erase(aFind);
+}
+// 
-----------------------------------------------------------------------------
+sal_Int64 SAL_CALL ODatabaseContext::getSomething( const Sequence< sal_Int8 >& 
rId ) throw(RuntimeException)
+{
+       if (rId.getLength() == 16 && 0 == 
rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(),  
rId.getConstArray(), 16 ) )
+               return reinterpret_cast<sal_Int64>(this);
+
+       return 0;
+}
+// 
-----------------------------------------------------------------------------
+Sequence< sal_Int8 > ODatabaseContext::getUnoTunnelImplementationId()
+{
+       static ::cppu::OImplementationId * pId = 0;
+       if (! pId)
+       {
+               ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
+               if (! pId)
+               {
+                       static ::cppu::OImplementationId aId;
+                       pId = &aId;
+               }
+       }
+       return pId->getImplementationId();
 }
 //........................................................................
 }      // namespace dbaccess




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to