summaryrefslogtreecommitdiff
path: root/connectivity
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2005-09-23 10:36:41 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2005-09-23 10:36:41 +0000
commit1c86cafd95c64e085f912fffbeb30c4f4937626b (patch)
tree3724be238acf7957622d97c0eca18047fdb3fb9d /connectivity
parentb8327cef2c5f6fa38d998386e1fa550b37fb3187 (diff)
INTEGRATION: CWS dba201b (1.55.54); FILE MERGED
2005/09/21 06:56:53 oj 1.55.54.4: RESYNC: (1.55-1.56); FILE MERGED 2005/07/21 14:20:54 fs 1.55.54.3: slight syntax changes to the recently introduced SharedUNOComponent for better readability of client code 2005/07/21 12:00:33 fs 1.55.54.2: #i52255# +ensureRowSetConnection 2005/07/11 13:56:36 fs 1.55.54.1: merging CWS dba201a into dba201b
Diffstat (limited to 'connectivity')
-rw-r--r--connectivity/source/commontools/dbtools.cxx188
1 files changed, 120 insertions, 68 deletions
diff --git a/connectivity/source/commontools/dbtools.cxx b/connectivity/source/commontools/dbtools.cxx
index 88c5a2dda107..b2f49469b932 100644
--- a/connectivity/source/commontools/dbtools.cxx
+++ b/connectivity/source/commontools/dbtools.cxx
@@ -4,9 +4,9 @@
*
* $RCSfile: dbtools.cxx,v $
*
- * $Revision: 1.56 $
+ * $Revision: 1.57 $
*
- * last change: $Author: rt $ $Date: 2005-09-08 05:14:45 $
+ * last change: $Author: hr $ $Date: 2005-09-23 11:36:41 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -474,84 +474,136 @@ Reference< XConnection> getConnection(const Reference< XRowSet>& _rxRowSet) thro
}
//------------------------------------------------------------------------------
-Reference< XConnection> connectRowset(const Reference< XRowSet>& _rxRowSet, const Reference< XMultiServiceFactory>& _rxFactory,
- sal_Bool _bSetAsActiveConnection ) SAL_THROW ( ( SQLException, WrappedTargetException, RuntimeException ) )
+// helper function which allows to implement both the connectRowset and the ensureRowSetConnection semantics
+// if connectRowset (which is deprecated) is removed, this function and one of its parameters are
+// not needed anymore, the whole implementation can be moved into ensureRowSetConnection then)
+SharedConnection lcl_connectRowSet(const Reference< XRowSet>& _rxRowSet, const Reference< XMultiServiceFactory>& _rxFactory,
+ bool _bSetAsActiveConnection, bool _bAttachAutoDisposer )
+ SAL_THROW ( ( SQLException, WrappedTargetException, RuntimeException ) )
{
- Reference< XConnection> xReturn;
- Reference< XPropertySet> xRowSetProps(_rxRowSet, UNO_QUERY);
- if (xRowSetProps.is())
+ SharedConnection xConnection;
+
+ do
{
- Any aConn( xRowSetProps->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ActiveConnection"))) );
- aConn >>= xReturn;
+ Reference< XPropertySet> xRowSetProps(_rxRowSet, UNO_QUERY);
+ if ( !xRowSetProps.is() )
+ break;
+
+ // 1. already connected?
+ Reference< XConnection > xExistingConn(
+ xRowSetProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ActiveConnection" ) ) ),
+ UNO_QUERY );
- if (!xReturn.is())
+ if ( xExistingConn.is()
+ // 2. embedded in a database?
+ || isEmbeddedInDatabase( _rxRowSet, xExistingConn )
+ // 3. is there a connection in the parent hierarchy?
+ || ( xExistingConn = findConnection( _rxRowSet ) ).is()
+ )
{
- // first look if there is a connection in the parent hierarchy
- xReturn = findConnection(_rxRowSet);
- if (!xReturn.is())
+ if ( _bSetAsActiveConnection )
{
- static const ::rtl::OUString s_sUserProp = ::rtl::OUString::createFromAscii("User");
- // the row set didn't supply a connection -> build one with it's current settings
- ::rtl::OUString sDataSourceName;
- xRowSetProps->getPropertyValue(::rtl::OUString::createFromAscii("DataSourceName")) >>= sDataSourceName;
- ::rtl::OUString sURL;
- xRowSetProps->getPropertyValue(::rtl::OUString::createFromAscii("URL")) >>= sURL;
- if (sDataSourceName.getLength())
- { // the row set's data source property is set
- // -> try to connect, get user and pwd setting for that
- ::rtl::OUString sUser, sPwd;
-
- if (hasProperty(s_sUserProp, xRowSetProps))
- xRowSetProps->getPropertyValue(s_sUserProp) >>= sUser;
- if (hasProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD), xRowSetProps))
- xRowSetProps->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD)) >>= sPwd;
- xReturn = getConnection_allowException(sDataSourceName, sUser, sPwd, _rxFactory);
- }
- else if (sURL.getLength())
- { // the row set has no data source, but a connection url set
- // -> try to connection with that url
- Reference< XDriverManager > xDriverManager(
- _rxFactory->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.sdbc.ConnectionPool")), UNO_QUERY);
- if (xDriverManager.is())
- {
- ::rtl::OUString sUser, sPwd;
- if (hasProperty(s_sUserProp, xRowSetProps))
- xRowSetProps->getPropertyValue(s_sUserProp) >>= sUser;
- if (hasProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD), xRowSetProps))
- xRowSetProps->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD)) >>= sPwd;
- if (sUser.getLength())
- { // use user and pwd together with the url
- Sequence< PropertyValue> aInfo(2);
- aInfo.getArray()[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("user"));
- aInfo.getArray()[0].Value <<= sUser;
- aInfo.getArray()[1].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("password"));
- aInfo.getArray()[1].Value <<= sPwd;
- xReturn = xDriverManager->getConnectionWithInfo(sURL, aInfo);
- }
- else
- // just use the url
- xReturn = xDriverManager->getConnection(sURL);
- }
- }
+ xRowSetProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ActiveConnection" ) ), makeAny( xExistingConn ) );
+ // no auto disposer needed, since we did not create the connection
}
- // now if we got a connection, forward it to the row set
- if (xReturn.is() && _bSetAsActiveConnection)
+ xConnection.reset( xExistingConn, SharedConnection::NoTakeOwnership );
+ break;
+ }
+
+ // build a connection with it's current settings (4. data source name, or 5. URL)
+
+ const ::rtl::OUString sUserProp = ::rtl::OUString::createFromAscii("User");
+ ::rtl::OUString sDataSourceName;
+ xRowSetProps->getPropertyValue(::rtl::OUString::createFromAscii("DataSourceName")) >>= sDataSourceName;
+ ::rtl::OUString sURL;
+ xRowSetProps->getPropertyValue(::rtl::OUString::createFromAscii("URL")) >>= sURL;
+
+ Reference< XConnection > xPureConnection;
+ if (sDataSourceName.getLength())
+ { // the row set's data source property is set
+ // -> try to connect, get user and pwd setting for that
+ ::rtl::OUString sUser, sPwd;
+
+ if (hasProperty(sUserProp, xRowSetProps))
+ xRowSetProps->getPropertyValue(sUserProp) >>= sUser;
+ if (hasProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD), xRowSetProps))
+ xRowSetProps->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD)) >>= sPwd;
+
+ xPureConnection = getConnection_allowException( sDataSourceName, sUser, sPwd, _rxFactory );
+ }
+ else if (sURL.getLength())
+ { // the row set has no data source, but a connection url set
+ // -> try to connection with that url
+ Reference< XDriverManager > xDriverManager(
+ _rxFactory->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.sdbc.ConnectionPool")), UNO_QUERY);
+ if (xDriverManager.is())
{
- try
- {
- OAutoConnectionDisposer* pAutoDispose = new OAutoConnectionDisposer(_rxRowSet, xReturn);
- Reference< XPropertyChangeListener > xEnsureDelete(pAutoDispose);
+ ::rtl::OUString sUser, sPwd;
+ if (hasProperty(sUserProp, xRowSetProps))
+ xRowSetProps->getPropertyValue(sUserProp) >>= sUser;
+ if (hasProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD), xRowSetProps))
+ xRowSetProps->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD)) >>= sPwd;
+ if (sUser.getLength())
+ { // use user and pwd together with the url
+ Sequence< PropertyValue> aInfo(2);
+ aInfo.getArray()[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("user"));
+ aInfo.getArray()[0].Value <<= sUser;
+ aInfo.getArray()[1].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("password"));
+ aInfo.getArray()[1].Value <<= sPwd;
+ xPureConnection = xDriverManager->getConnectionWithInfo( sURL, aInfo );
}
- catch(Exception&)
+ else
+ // just use the url
+ xPureConnection = xDriverManager->getConnection( sURL );
+ }
+ }
+ xConnection.reset(
+ xPureConnection,
+ _bAttachAutoDisposer ? SharedConnection::NoTakeOwnership : SharedConnection::TakeOwnership
+ /* take ownership if and only if we're *not* going to auto-dispose the connection */
+ );
+
+ // now if we created a connection, forward it to the row set
+ if ( xConnection.is() && _bSetAsActiveConnection )
+ {
+ try
+ {
+ if ( _bAttachAutoDisposer )
{
- OSL_ENSURE(0,"EXception when we set the new active connection!");
+ OAutoConnectionDisposer* pAutoDispose = new OAutoConnectionDisposer( _rxRowSet, xConnection );
+ Reference< XPropertyChangeListener > xEnsureDelete(pAutoDispose);
}
+ else
+ xRowSetProps->setPropertyValue(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ActiveConnection" ) ),
+ makeAny( xConnection.getTyped() )
+ );
+ }
+ catch(Exception&)
+ {
+ OSL_ENSURE(0,"EXception when we set the new active connection!");
}
}
}
+ while ( false );
- return xReturn;
+ return xConnection;
+}
+
+//------------------------------------------------------------------------------
+Reference< XConnection> connectRowset(const Reference< XRowSet>& _rxRowSet, const Reference< XMultiServiceFactory>& _rxFactory,
+ sal_Bool _bSetAsActiveConnection ) SAL_THROW ( ( SQLException, WrappedTargetException, RuntimeException ) )
+{
+ SharedConnection xConnection = lcl_connectRowSet( _rxRowSet, _rxFactory, _bSetAsActiveConnection, true );
+ return xConnection.getTyped();
+}
+
+//------------------------------------------------------------------------------
+SharedConnection ensureRowSetConnection(const Reference< XRowSet>& _rxRowSet, const Reference< XMultiServiceFactory>& _rxFactory,
+ bool _bUseAutoConnectionDisposer ) SAL_THROW ( ( SQLException, WrappedTargetException, RuntimeException ) )
+{
+ return lcl_connectRowSet( _rxRowSet, _rxFactory, true, _bUseAutoConnectionDisposer );
}
//------------------------------------------------------------------------------
@@ -1182,9 +1234,7 @@ Reference< XDataSource> findDataSource(const Reference< XInterface >& _xParent)
::rtl::OUString sStatement;
try
{
- Reference< XConnection> xConn;
- if ( !isEmbeddedInDatabase( _rxRowSet, xConn ) )
- xConn = connectRowset( Reference< XRowSet >( _rxRowSet, UNO_QUERY ), _rxFactory, sal_True );
+ Reference< XConnection> xConn = connectRowset( Reference< XRowSet >( _rxRowSet, UNO_QUERY ), _rxFactory, sal_True );
if ( xConn.is() ) // implies _rxRowSet.is()
{
// build the statement the row set is based on (can't use the ActiveCommand property of the set
@@ -1424,6 +1474,8 @@ void composeTableName( const Reference< XDatabaseMetaData >& _rxMetaData,
, sal_Bool _bUseSchemaInSelect)
{
OSL_ENSURE(_rxMetaData.is(), "composeTableName : invalid meta data !");
+ if ( !_rxMetaData.is() )
+ return; // just to be save here
OSL_ENSURE(_rName.getLength(), "composeTableName : at least the name should be non-empty !");
::std::mem_fun_t<bool,OMetaDataWrapper> aCatalogCall = ::std::mem_fun(&OMetaDataWrapper::supportsCatalogsInDataManipulation);