summaryrefslogtreecommitdiff
path: root/dbaccess/source/ui/relationdesign
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2007-11-01 14:37:01 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2007-11-01 14:37:01 +0000
commitc17a7acc9c3a1572686807b665f38b5871e4cb4f (patch)
treec471a698a8ff4f824c134233abc68fa782d96a3a /dbaccess/source/ui/relationdesign
parent4675bbfa5dc5e2cbb2a1f9d973b7f2138096eca7 (diff)
INTEGRATION: CWS dba24b (1.12.130); FILE MERGED
2007/10/01 06:37:45 oj 1.12.130.6: merge conflict 2007/09/28 12:00:47 oj 1.12.130.5: RESYNC: (1.12-1.13); FILE MERGED 2007/08/29 13:30:54 fs 1.12.130.4: #i10000# 2007/08/22 11:41:59 oj 1.12.130.3: #i76374# handle cross join as natural join now in query design 2007/08/16 09:57:47 oj 1.12.130.2: #i56898# accept more than one relation 2007/08/16 06:14:45 oj 1.12.130.1: #i56898# clean up of the class structure
Diffstat (limited to 'dbaccess/source/ui/relationdesign')
-rw-r--r--dbaccess/source/ui/relationdesign/RTableConnectionData.cxx218
1 files changed, 69 insertions, 149 deletions
diff --git a/dbaccess/source/ui/relationdesign/RTableConnectionData.cxx b/dbaccess/source/ui/relationdesign/RTableConnectionData.cxx
index 7f6a65556eaa..679cde552cb0 100644
--- a/dbaccess/source/ui/relationdesign/RTableConnectionData.cxx
+++ b/dbaccess/source/ui/relationdesign/RTableConnectionData.cxx
@@ -4,9 +4,9 @@
*
* $RCSfile: RTableConnectionData.cxx,v $
*
- * $Revision: 1.13 $
+ * $Revision: 1.14 $
*
- * last change: $Author: hr $ $Date: 2007-09-26 14:53:09 $
+ * last change: $Author: hr $ $Date: 2007-11-01 15:37:01 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -83,7 +83,6 @@ DBG_NAME(ORelationTableConnectionData)
//========================================================================
// class ORelationTableConnectionData
//========================================================================
-
//------------------------------------------------------------------------
ORelationTableConnectionData::ORelationTableConnectionData()
:OTableConnectionData()
@@ -93,53 +92,25 @@ ORelationTableConnectionData::ORelationTableConnectionData()
{
DBG_CTOR(ORelationTableConnectionData,NULL);
}
-
//------------------------------------------------------------------------
-ORelationTableConnectionData::ORelationTableConnectionData( const Reference< XNameAccess>& _xTables)
- :OTableConnectionData()
- ,m_xTables(_xTables)
- ,m_nUpdateRules(KeyRule::NO_ACTION)
- ,m_nDeleteRules(KeyRule::NO_ACTION)
- ,m_nCardinality(CARDINAL_UNDEFINED)
-{
- DBG_CTOR(ORelationTableConnectionData,NULL);
- Reference<XComponent> xComponent(m_xTables,UNO_QUERY);
- if(xComponent.is())
- startComponentListening(xComponent);
-}
-
-//------------------------------------------------------------------------
-ORelationTableConnectionData::ORelationTableConnectionData( const Reference< XNameAccess>& _xTables,
- const ::rtl::OUString& rSourceWinName,
- const ::rtl::OUString& rDestWinName,
+ORelationTableConnectionData::ORelationTableConnectionData( const TTableWindowData::value_type& _pReferencingTable,
+ const TTableWindowData::value_type& _pReferencedTable,
const ::rtl::OUString& rConnName )
- :OTableConnectionData( rSourceWinName, rDestWinName, rConnName )
- ,m_xTables(_xTables)
+ :OTableConnectionData( _pReferencingTable, _pReferencedTable )
,m_nUpdateRules(KeyRule::NO_ACTION)
,m_nDeleteRules(KeyRule::NO_ACTION)
,m_nCardinality(CARDINAL_UNDEFINED)
{
DBG_CTOR(ORelationTableConnectionData,NULL);
+ m_aConnName = rConnName;
- ::osl::MutexGuard aGuard( m_aMutex );
-
- OSL_ENSURE(m_xTables.is(),"ORelationTableConnectionData::ORelationTableConnectionData No Tables!");
- addListening(m_xTables);
-
- SetCardinality();
- if(m_xTables.is() && m_xTables->hasByName(rSourceWinName))
- m_xTables->getByName(rSourceWinName) >>= m_xSource;
- if(m_xTables.is() && m_xTables->hasByName(rDestWinName))
- m_xTables->getByName(rDestWinName) >>= m_xDest;
-
- addListening(m_xSource);
- addListening(m_xDest);
+ if ( m_aConnName.Len() )
+ SetCardinality();
}
//------------------------------------------------------------------------
ORelationTableConnectionData::ORelationTableConnectionData( const ORelationTableConnectionData& rConnData )
:OTableConnectionData( rConnData )
- , ::utl::OEventListenerAdapter()
{
DBG_CTOR(ORelationTableConnectionData,NULL);
*this = rConnData;
@@ -149,10 +120,6 @@ ORelationTableConnectionData::ORelationTableConnectionData( const ORelationTable
ORelationTableConnectionData::~ORelationTableConnectionData()
{
DBG_DTOR(ORelationTableConnectionData,NULL);
-
- removeListening(m_xDest);
- removeListening(m_xSource);
- removeListening(m_xTables);
}
//------------------------------------------------------------------------
@@ -162,7 +129,7 @@ BOOL ORelationTableConnectionData::DropRelation()
::osl::MutexGuard aGuard( m_aMutex );
////////////////////////////////////////////////////////////
// Relation loeschen
- Reference<XKeysSupplier> xSup(m_xSource,UNO_QUERY);
+ Reference<XKeysSupplier> xSup(getReferencingTable()->getTable(),UNO_QUERY);
Reference< XIndexAccess> xKeys;
if(xSup.is() )
xKeys = xSup->getKeys();
@@ -171,10 +138,10 @@ BOOL ORelationTableConnectionData::DropRelation()
if( m_aConnName.Len() && xKeys.is() )
{
- for(sal_Int32 i=0;i<xKeys->getCount();++i)
+ const sal_Int32 nCount = xKeys->getCount();
+ for(sal_Int32 i = 0;i < nCount;++i)
{
- Reference< XPropertySet> xKey;
- xKeys->getByIndex(i) >>= xKey;
+ Reference< XPropertySet> xKey(xKeys->getByIndex(i),UNO_QUERY);
OSL_ENSURE(xKey.is(),"Key is not valid!");
if(xKey.is())
{
@@ -211,45 +178,9 @@ void ORelationTableConnectionData::ChangeOrientation()
//////////////////////////////////////////////////////////////////////
// Member anpassen
- sTempString = m_aSourceWinName;
- m_aSourceWinName = m_aDestWinName;
- m_aDestWinName = sTempString;
-
- ::osl::MutexGuard aGuard( m_aMutex );
-
- Reference<XPropertySet> xTemp;
- xTemp = m_xSource;
- m_xSource = m_xDest;
- m_xDest = xTemp;
-}
-
-//------------------------------------------------------------------------
-void ORelationTableConnectionData::SetSourceWinName( const String& rSourceWinName )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- OTableConnectionData::SetSourceWinName(rSourceWinName);
- if(m_xTables->hasByName(rSourceWinName))
- {
- removeListening(m_xDest);
- m_xTables->getByName(rSourceWinName) >>= m_xSource;
- addListening(m_xDest);
- }
-}
-
-//------------------------------------------------------------------------
-void ORelationTableConnectionData::SetDestWinName( const String& rDestWinName )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- OTableConnectionData::SetDestWinName(rDestWinName);
-
- if(m_xTables->hasByName(rDestWinName))
- {
- removeListening(m_xDest);
- m_xTables->getByName(rDestWinName) >>= m_xDest;
- addListening(m_xDest);
- }
+ TTableWindowData::value_type pTemp = m_pReferencingTable;
+ m_pReferencingTable = m_pReferencedTable;
+ m_pReferencedTable = pTemp;
}
//------------------------------------------------------------------------
@@ -297,8 +228,7 @@ BOOL ORelationTableConnectionData::checkPrimaryKey(const Reference< XPropertySet
OConnectionLineDataVec::const_iterator aIter = m_vConnLineData.begin();
for(;aIter != m_vConnLineData.end();++aIter)
{
- if( (*aIter)->IsValid() )
- ++nValidLinesCount;
+ ++nValidLinesCount;
if ( (*aIter)->GetFieldName(_eEConnectionSide) == *pKeyBegin )
{
++nPrimKeysCount;
@@ -321,12 +251,6 @@ BOOL ORelationTableConnectionData::IsConnectionPossible()
DBG_CHKTHIS(ORelationTableConnectionData,NULL);
::osl::MutexGuard aGuard( m_aMutex );
- if( !m_xSource.is() || !m_xDest.is() )
- return FALSE;
-
- if( !m_aSourceWinName.Len() || !m_aDestWinName.Len() )
- return FALSE;
-
//////////////////////////////////////////////////////////////////////
// Wenn die SourceFelder ein PrimKey sind, ist nur die Orientierung falsch
if ( IsSourcePrimKey() && !IsDestPrimKey() )
@@ -365,21 +289,6 @@ ORelationTableConnectionData& ORelationTableConnectionData::operator=( const ORe
m_nDeleteRules = rConnData.GetDeleteRules();
m_nCardinality = rConnData.GetCardinality();
-
- ::osl::MutexGuard aGuard( m_aMutex );
-
- removeListening(m_xDest);
- removeListening(m_xSource);
- removeListening(m_xTables);
-
- m_xTables = rConnData.getTables();
- m_xSource = rConnData.getSource();
- m_xDest = rConnData.getDest();
-
- addListening(m_xDest);
- addListening(m_xSource);
- addListening(m_xTables);
-
return *this;
}
namespace dbaui
@@ -390,8 +299,8 @@ bool operator==(const ORelationTableConnectionData& lhs, const ORelationTableCon
bool bEqual = (lhs.m_nUpdateRules == rhs.m_nUpdateRules)
&& (lhs.m_nDeleteRules == rhs.m_nDeleteRules)
&& (lhs.m_nCardinality == rhs.m_nCardinality)
- && (lhs.m_aSourceWinName == rhs.m_aSourceWinName)
- && (lhs.m_aDestWinName == rhs.m_aDestWinName)
+ && (lhs.getReferencingTable() == rhs.getReferencingTable())
+ && (lhs.getReferencedTable() == rhs.getReferencedTable())
&& (lhs.m_aConnName == rhs.m_aConnName)
&& (lhs.m_vConnLineData.size() == rhs.m_vConnLineData.size());
@@ -416,7 +325,7 @@ BOOL ORelationTableConnectionData::Update()
////////////////////////////////////////////////////////////
// Alte Relation loeschen
{
- Reference<XKeysSupplier> xSup(m_xSource,UNO_QUERY);
+ Reference<XKeysSupplier> xSup(getReferencingTable()->getTable(),UNO_QUERY);
Reference< XIndexAccess> xKeys;
if ( xSup.is() )
xKeys = xSup->getKeys();
@@ -429,7 +338,7 @@ BOOL ORelationTableConnectionData::Update()
}
// reassign the keys because the orientaion could be changed
- Reference<XKeysSupplier> xSup(m_xSource,UNO_QUERY);
+ Reference<XKeysSupplier> xSup(getReferencingTable()->getTable(),UNO_QUERY);
Reference< XIndexAccess> xKeys;
if ( xSup.is() )
xKeys = xSup->getKeys();
@@ -449,13 +358,14 @@ BOOL ORelationTableConnectionData::Update()
{
// build a foreign key name
::rtl::OUString sSourceName;
- m_xSource->getPropertyValue(PROPERTY_NAME) >>= sSourceName;
+ Reference<XPropertySet> xProp(xSup,UNO_QUERY_THROW);
+ xProp->getPropertyValue(PROPERTY_NAME) >>= sSourceName;
::rtl::OUString sKeyName = sSourceName;
- sKeyName += m_aDestWinName;
+ sKeyName += getReferencedTable()->GetTableName();
xKey->setPropertyValue(PROPERTY_NAME,makeAny(sKeyName));
xKey->setPropertyValue(PROPERTY_TYPE,makeAny(KeyType::FOREIGN));
- xKey->setPropertyValue(PROPERTY_REFERENCEDTABLE,makeAny(::rtl::OUString(m_aDestWinName)));
+ xKey->setPropertyValue(PROPERTY_REFERENCEDTABLE,makeAny(::rtl::OUString(getReferencedTable()->GetTableName())));
xKey->setPropertyValue(PROPERTY_UPDATERULE, makeAny(GetUpdateRules()));
xKey->setPropertyValue(PROPERTY_DELETERULE, makeAny(GetDeleteRules()));
}
@@ -501,15 +411,49 @@ BOOL ORelationTableConnectionData::Update()
{
sal_Int32 nType = 0;
xKey->getPropertyValue(PROPERTY_TYPE) >>= nType;
- // if ( nType == KeyType::FOREIGN )
+ ::rtl::OUString sReferencedTable;
+ xKey->getPropertyValue(PROPERTY_REFERENCEDTABLE) >>= sReferencedTable;
+ if ( sReferencedTable == ::rtl::OUString(getReferencedTable()->GetTableName()) )
{
- ::rtl::OUString sName;
- xKey->getPropertyValue(PROPERTY_REFERENCEDTABLE) >>= sName;
- if ( sName == ::rtl::OUString(m_aDestWinName) )
+ xColSup.set(xKey,UNO_QUERY_THROW);
+ try
+ {
+ Reference<XNameAccess> xColumns = xColSup->getColumns();
+ Sequence< ::rtl::OUString> aNames = xColumns->getElementNames();
+ const ::rtl::OUString* pIter = aNames.getConstArray();
+ const ::rtl::OUString* pEnd = pIter + aNames.getLength();
+
+ Reference<XPropertySet> xColumn;
+ ::rtl::OUString sName,sRelatedColumn;
+ for ( ; pIter != pEnd ; ++pIter )
+ {
+ xColumn.set(xColumns->getByName(*pIter),UNO_QUERY_THROW);
+ xColumn->getPropertyValue(PROPERTY_NAME) >>= sName;
+ xColumn->getPropertyValue(PROPERTY_RELATEDCOLUMN) >>= sRelatedColumn;
+
+ OConnectionLineDataVec::iterator aIter = m_vConnLineData.begin();
+ for(;aIter != m_vConnLineData.end();++aIter)
+ {
+ if( (*aIter)->GetSourceFieldName() == sName
+ && (*aIter)->GetDestFieldName() == sRelatedColumn )
+ {
+ break;
+ }
+ }
+ if ( aIter == m_vConnLineData.end() )
+ break;
+ }
+ if ( pIter == pEnd )
+ {
+ xKey->getPropertyValue(PROPERTY_NAME) >>= sName;
+ m_aConnName = sName;
+ //here we already know our column structure so we don't have to recreate the table connection data
+ xColSup.clear();
+ break;
+ }
+ }
+ catch(Exception&)
{
- xKey->getPropertyValue(PROPERTY_NAME) >>= sName;
- m_aConnName = sName;
- break;
}
}
}
@@ -518,7 +462,6 @@ BOOL ORelationTableConnectionData::Update()
// OSL_ENSURE(xKey.is(),"No key found have insertion!");
- xColSup.set(xKey,UNO_QUERY);
if ( xColSup.is() )
{
// The fields the relation marks may not be the same as our LineDatas mark after the relation has been updated
@@ -526,16 +469,16 @@ BOOL ORelationTableConnectionData::Update()
Reference<XNameAccess> xColumns = xColSup->getColumns();
Sequence< ::rtl::OUString> aNames = xColumns->getElementNames();
- const ::rtl::OUString* pBegin = aNames.getConstArray();
- const ::rtl::OUString* pEnd = pBegin + aNames.getLength();
+ const ::rtl::OUString* pIter = aNames.getConstArray();
+ const ::rtl::OUString* pEnd = pIter + aNames.getLength();
m_vConnLineData.reserve( aNames.getLength() );
Reference<XPropertySet> xColumn;
::rtl::OUString sName,sRelatedColumn;
- for(;pBegin != pEnd;++pBegin)
+ for(;pIter != pEnd;++pIter)
{
- xColumns->getByName(*pBegin) >>= xColumn;
+ xColumns->getByName(*pIter) >>= xColumn;
if ( xColumn.is() )
{
OConnectionLineDataRef pNewData = CreateLineDataObj();
@@ -558,27 +501,4 @@ BOOL ORelationTableConnectionData::Update()
return TRUE;
}
// -----------------------------------------------------------------------------
-void ORelationTableConnectionData::addListening(const Reference<XInterface>& _rxComponent)
-{
- Reference<XComponent> xComponent(_rxComponent,UNO_QUERY);
- if(xComponent.is())
- startComponentListening(xComponent);
-}
-// -----------------------------------------------------------------------------
-void ORelationTableConnectionData::removeListening(const Reference<XInterface>& _rxComponent)
-{
- Reference<XComponent> xComponent(_rxComponent,UNO_QUERY);
- if(xComponent.is())
- stopComponentListening(xComponent);
-}
-// -----------------------------------------------------------------------------
-void ORelationTableConnectionData::_disposing( const ::com::sun::star::lang::EventObject& /*_rSource*/ )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- // it doesn't matter which one was disposed
- m_xTables = NULL;
- m_xSource = NULL;
- m_xDest = NULL;
-}
-// -----------------------------------------------------------------------------