summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dbaccess/source/core/api/SingleSelectQueryComposer.cxx8
-rw-r--r--dbaccess/source/core/api/resultcolumn.cxx64
-rw-r--r--dbaccess/source/core/api/resultcolumn.hxx15
-rw-r--r--dbaccess/source/ui/inc/RelationController.hxx8
-rw-r--r--dbaccess/source/ui/relationdesign/RelationController.cxx353
-rw-r--r--dbaccess/source/ui/relationdesign/RelationTableView.cxx2
6 files changed, 305 insertions, 145 deletions
diff --git a/dbaccess/source/core/api/SingleSelectQueryComposer.cxx b/dbaccess/source/core/api/SingleSelectQueryComposer.cxx
index 548b99fd565a..c8a8f9ba01d1 100644
--- a/dbaccess/source/core/api/SingleSelectQueryComposer.cxx
+++ b/dbaccess/source/core/api/SingleSelectQueryComposer.cxx
@@ -344,7 +344,7 @@ void OSingleSelectQueryComposer::setQuery_Impl( const ::rtl::OUString& command )
// update columns and tables
// why? Shouldn't this be done on request only?
// otherwise nothing is working anymore :-)
- getColumns();
+// getColumns();
getTables();
}
// -----------------------------------------------------------------------------
@@ -380,6 +380,7 @@ void SAL_CALL OSingleSelectQueryComposer::appendFilterByColumn( const Reference<
{
::connectivity::checkDisposed(OSubComponent::rBHelper.bDisposed);
+ getColumns();
if ( !column.is()
|| !m_aCurrentColumns[SelectColumns]
|| !column->getPropertySetInfo()->hasPropertyByName(PROPERTY_NAME)
@@ -734,7 +735,7 @@ Reference< XNameAccess > SAL_CALL OSingleSelectQueryComposer::getColumns( ) thr
if ( aSelectColumns->get().empty() )
{
- // This is a valid casse. If we can syntactically parse the query, but not semantically
+ // This is a valid case. If we can syntactically parse the query, but not semantically
// (e.g. because it is based on a table we do not know), then there will be no SelectColumns
aSelectColumns = ::connectivity::parse::OParseColumn::createColumnsForResultSet( xResultSetMeta, m_xMetaData );
break;
@@ -1476,7 +1477,8 @@ void OSingleSelectQueryComposer::setConditionByColumn( const Reference< XPropert
column->getPropertyValue(PROPERTY_VALUE) >>= aValue;
::rtl::OUStringBuffer aSQL;
- ::rtl::OUString aQuote = m_xMetaData->getIdentifierQuoteString();
+ const ::rtl::OUString aQuote = m_xMetaData->getIdentifierQuoteString();
+ getColumns();
if ( m_aCurrentColumns[SelectColumns] && m_aCurrentColumns[SelectColumns]->hasByName(aName) )
{
diff --git a/dbaccess/source/core/api/resultcolumn.cxx b/dbaccess/source/core/api/resultcolumn.cxx
index 4d07448b4268..4fb765148df9 100644
--- a/dbaccess/source/core/api/resultcolumn.cxx
+++ b/dbaccess/source/core/api/resultcolumn.cxx
@@ -237,64 +237,84 @@ void OResultColumn::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const
break;
case PROPERTY_ID_ISSIGNED:
{
- sal_Bool bVal = m_xMetaData->isSigned(m_nPos);
- rValue.setValue(&bVal, getBooleanCppuType());
+ if ( !m_isSigned )
+ m_isSigned.reset( m_xMetaData->isSigned(m_nPos));
+ rValue <<= *m_isSigned;
} break;
case PROPERTY_ID_ISCURRENCY:
{
- sal_Bool bVal = m_xMetaData->isCurrency(m_nPos);
- rValue.setValue(&bVal, getBooleanCppuType());
+ if ( !m_isCurrency )
+ m_isCurrency.reset( m_xMetaData->isCurrency(m_nPos));
+ rValue <<= *m_isCurrency;
} break;
case PROPERTY_ID_ISSEARCHABLE:
{
- sal_Bool bVal = m_xMetaData->isSearchable(m_nPos);
- rValue.setValue(&bVal, getBooleanCppuType());
+ if ( !m_bSearchable )
+ m_bSearchable.reset( m_xMetaData->isSearchable(m_nPos));
+ rValue <<= *m_bSearchable;
} break;
case PROPERTY_ID_ISCASESENSITIVE:
{
- sal_Bool bVal = m_xMetaData->isCaseSensitive(m_nPos);
- rValue.setValue(&bVal, getBooleanCppuType());
+ if ( !m_isCaseSensitive )
+ m_isCaseSensitive.reset( m_xMetaData->isCaseSensitive(m_nPos));
+ rValue <<= *m_isCaseSensitive;
} break;
case PROPERTY_ID_ISREADONLY:
{
- sal_Bool bVal = m_xMetaData->isReadOnly(m_nPos);
- rValue.setValue(&bVal, getBooleanCppuType());
+ if ( !m_isReadOnly )
+ m_isReadOnly.reset( m_xMetaData->isReadOnly(m_nPos));
+ rValue <<= *m_isReadOnly;
} break;
case PROPERTY_ID_ISWRITABLE:
{
- sal_Bool bVal = m_xMetaData->isWritable(m_nPos);
- rValue.setValue(&bVal, getBooleanCppuType());
+ if ( !m_isWritable )
+ m_isWritable.reset( m_xMetaData->isWritable(m_nPos));
+ rValue <<= *m_isWritable;
} break;
case PROPERTY_ID_ISDEFINITELYWRITABLE:
{
- sal_Bool bVal = m_xMetaData->isDefinitelyWritable(m_nPos);
- rValue.setValue(&bVal, getBooleanCppuType());
+ if ( !m_isDefinitelyWritable )
+ m_isDefinitelyWritable.reset( m_xMetaData->isDefinitelyWritable(m_nPos));
+ rValue <<= *m_isDefinitelyWritable;
} break;
case PROPERTY_ID_ISAUTOINCREMENT:
{
- sal_Bool bVal = m_xMetaData->isAutoIncrement(m_nPos);
- rValue.setValue(&bVal, getBooleanCppuType());
+ if ( !m_isAutoIncrement )
+ m_isAutoIncrement.reset( m_xMetaData->isAutoIncrement(m_nPos));
+ rValue <<= *m_isAutoIncrement;
} break;
case PROPERTY_ID_SERVICENAME:
rValue <<= m_xMetaData->getColumnServiceName(m_nPos);
break;
case PROPERTY_ID_LABEL:
- rValue <<= m_xMetaData->getColumnLabel(m_nPos);
+ if ( !m_sColumnLabel )
+ m_sColumnLabel.reset( m_xMetaData->getColumnLabel(m_nPos));
+ rValue <<= *m_sColumnLabel;
break;
case PROPERTY_ID_DISPLAYSIZE:
- rValue <<= m_xMetaData->getColumnDisplaySize(m_nPos);
+ if ( !m_nColumnDisplaySize )
+ m_nColumnDisplaySize.reset( m_xMetaData->getColumnDisplaySize(m_nPos));
+ rValue <<= *m_nColumnDisplaySize;
break;
case PROPERTY_ID_TYPE:
- rValue <<= m_xMetaData->getColumnType(m_nPos);
+ if ( !m_nColumnType )
+ m_nColumnType.reset( m_xMetaData->getColumnType(m_nPos));
+ rValue <<= *m_nColumnType;
break;
case PROPERTY_ID_PRECISION:
- rValue <<= m_xMetaData->getPrecision(m_nPos);
+ if ( !m_nPrecision )
+ m_nPrecision.reset( m_xMetaData->getPrecision(m_nPos));
+ rValue <<= *m_nPrecision;
break;
case PROPERTY_ID_SCALE:
- rValue <<= m_xMetaData->getScale(m_nPos);
+ if ( !m_nScale )
+ m_nScale.reset( m_xMetaData->getScale(m_nPos));
+ rValue <<= *m_nScale;
break;
case PROPERTY_ID_ISNULLABLE:
- rValue <<= m_xMetaData->isNullable(m_nPos);
+ if ( !m_isNullable )
+ m_isNullable.reset( m_xMetaData->isNullable(m_nPos));
+ rValue <<= *m_isNullable;
break;
case PROPERTY_ID_TYPENAME:
rValue <<= m_xMetaData->getColumnTypeName(m_nPos);
diff --git a/dbaccess/source/core/api/resultcolumn.hxx b/dbaccess/source/core/api/resultcolumn.hxx
index 6c6f774fc812..407fa0f7ef98 100644
--- a/dbaccess/source/core/api/resultcolumn.hxx
+++ b/dbaccess/source/core/api/resultcolumn.hxx
@@ -37,6 +37,7 @@
#ifndef _DBA_COREAPI_COLUMN_HXX_
#include <column.hxx>
#endif
+#include <boost/optional.hpp>
namespace dbaccess
{
//************************************************************
@@ -50,6 +51,20 @@ namespace dbaccess
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xDBMetaData;
sal_Int32 m_nPos;
::com::sun::star::uno::Any m_aIsRowVersion;
+ mutable ::boost::optional< sal_Bool > m_isSigned;
+ mutable ::boost::optional< sal_Bool > m_isCurrency;
+ mutable ::boost::optional< sal_Bool > m_bSearchable;
+ mutable ::boost::optional< sal_Bool > m_isCaseSensitive;
+ mutable ::boost::optional< sal_Bool > m_isReadOnly;
+ mutable ::boost::optional< sal_Bool > m_isWritable;
+ mutable ::boost::optional< sal_Bool > m_isDefinitelyWritable;
+ mutable ::boost::optional< sal_Bool > m_isAutoIncrement;
+ mutable ::boost::optional< sal_Int32 > m_isNullable;
+ mutable ::boost::optional< ::rtl::OUString > m_sColumnLabel;
+ mutable ::boost::optional< sal_Int32 > m_nColumnDisplaySize;
+ mutable ::boost::optional< sal_Int32 > m_nColumnType;
+ mutable ::boost::optional< sal_Int32 > m_nPrecision;
+ mutable ::boost::optional< sal_Int32 > m_nScale;
virtual ~OResultColumn();
public:
diff --git a/dbaccess/source/ui/inc/RelationController.hxx b/dbaccess/source/ui/inc/RelationController.hxx
index 0dd07d0119cc..6bc1561e0785 100644
--- a/dbaccess/source/ui/inc/RelationController.hxx
+++ b/dbaccess/source/ui/inc/RelationController.hxx
@@ -38,6 +38,7 @@
#endif
class VCLXWindow;
+class WaitObject;
namespace dbaui
{
class OTableConnectionData;
@@ -48,6 +49,8 @@ namespace dbaui
class ORelationController : public OJoinController
{
::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > m_xTables;
+ ::std::auto_ptr<WaitObject> m_pWaitObject;
+ ULONG m_nThreadEvent;
sal_Bool m_bRelationsPossible;
protected:
// all the features which should be handled by this class
@@ -59,7 +62,7 @@ namespace dbaui
ORelationDesignView* getRelationView() { return static_cast<ORelationDesignView*>(m_pView); }
void loadData();
- TTableWindowData::value_type existsTable(const ::rtl::OUString& _rComposedTableName) const;
+ TTableWindowData::value_type existsTable(const ::rtl::OUString& _rComposedTableName,sal_Bool _bCase) const;
// load the window positions out of the datasource
void loadLayoutInformation();
@@ -71,6 +74,8 @@ namespace dbaui
// temp
void SaveTabWinsPosSize( OJoinTableView::OTableWindowMap* pTabWinList, long nOffsetX, long nOffsetY );
+ void mergeData(const TTableConnectionData& _aConnectionData);
+
virtual sal_Bool Construct(Window* pParent);
// XServiceInfo
@@ -92,6 +97,7 @@ namespace dbaui
virtual void reset();
virtual void impl_initialize();
virtual ::rtl::OUString getPrivateTitle( ) const;
+ DECL_LINK( OnThreadFinished, void* );
};
}
#endif // DBAUI_RELATIONCONTROLLER_HXX
diff --git a/dbaccess/source/ui/relationdesign/RelationController.cxx b/dbaccess/source/ui/relationdesign/RelationController.cxx
index 3997cb656799..14653343bd4d 100644
--- a/dbaccess/source/ui/relationdesign/RelationController.cxx
+++ b/dbaccess/source/ui/relationdesign/RelationController.cxx
@@ -157,6 +157,11 @@
#ifndef _SV_WAITOBJ_HXX
#include <vcl/waitobj.hxx>
#endif
+#include <osl/thread.hxx>
+#include <vos/mutex.hxx>
+
+
+#define MAX_THREADS 10
extern "C" void SAL_CALL createRegistryInfo_ORelationControl()
{
@@ -181,6 +186,7 @@ using namespace ::com::sun::star::util;
using namespace ::dbtools;
using namespace ::dbaui;
using namespace ::comphelper;
+using namespace ::osl;
//------------------------------------------------------------------------------
::rtl::OUString SAL_CALL ORelationController::getImplementationName() throw( RuntimeException )
@@ -214,6 +220,7 @@ DBG_NAME(ORelationController);
// -----------------------------------------------------------------------------
ORelationController::ORelationController(const Reference< XMultiServiceFactory >& _rM)
: OJoinController(_rM)
+ ,m_nThreadEvent(0)
,m_bRelationsPossible(sal_True)
{
DBG_CTOR(ORelationController,NULL);
@@ -321,13 +328,8 @@ void ORelationController::impl_initialize()
try
{
loadData();
- getView()->initialize(); // show the windows and fill with our informations
- getView()->Invalidate(INVALIDATE_NOERASE);
- getUndoMgr()->Clear(); // clear all undo redo things
- setModified(sal_False); // and we are not modified yet
-
- if(m_vTableData.empty())
- Execute(ID_BROWSER_ADDTABLE,Sequence<PropertyValue>());
+ if ( !m_nThreadEvent )
+ Application::PostUserEvent(LINK(this, ORelationController, OnThreadFinished));
}
catch( const Exception& )
{
@@ -369,24 +371,53 @@ void ORelationController::describeSupportedFeatures()
OJoinController::describeSupportedFeatures();
implDescribeSupportedFeature( ".uno:DBAddRelation", SID_RELATION_ADD_RELATION, CommandGroup::EDIT );
}
-// -----------------------------------------------------------------------------
-void ORelationController::loadData()
+namespace
{
- WaitObject aWaitCursor(getView());
- try
+ class RelationLoader : public ::osl::Thread
{
- if ( !m_xTables.is() )
- return;
- // this may take some time
+ DECLARE_STL_MAP(::rtl::OUString,::boost::shared_ptr<OTableWindowData>,::comphelper::UStringMixLess,TTableDataHelper);
+ TTableDataHelper m_aTableData;
+ TTableConnectionData m_vTableConnectionData;
+ const Sequence< ::rtl::OUString> m_aTableList;
+ ORelationController* m_pParent;
+ const Reference< XDatabaseMetaData> m_xMetaData;
+ const Reference< XNameAccess > m_xTables;
+ const sal_Int32 m_nStartIndex;
+ const sal_Int32 m_nEndIndex;
+
+ public:
+ RelationLoader(ORelationController* _pParent
+ ,const Reference< XDatabaseMetaData>& _xMetaData
+ ,const Reference< XNameAccess >& _xTables
+ ,const Sequence< ::rtl::OUString>& _aTableList
+ ,const sal_Int32 _nStartIndex
+ ,const sal_Int32 _nEndIndex)
+ :m_aTableData(_xMetaData.is() && _xMetaData->supportsMixedCaseQuotedIdentifiers())
+ ,m_aTableList(_aTableList)
+ ,m_pParent(_pParent)
+ ,m_xMetaData(_xMetaData)
+ ,m_xTables(_xTables)
+ ,m_nStartIndex(_nStartIndex)
+ ,m_nEndIndex(_nEndIndex)
+ {
+ }
+
+ protected:
+ virtual ~RelationLoader(){}
- Reference< XDatabaseMetaData> xMetaData = getConnection()->getMetaData();
- Sequence< ::rtl::OUString> aNames = m_xTables->getElementNames();
- const ::rtl::OUString* pIter = aNames.getConstArray();
- const ::rtl::OUString* pEnd = pIter + aNames.getLength();
- for(;pIter != pEnd;++pIter)
+ /// Working method which should be overridden.
+ virtual void SAL_CALL run();
+ virtual void SAL_CALL onTerminated();
+ void loadTableData(const Any& _aTable);
+ };
+
+ void SAL_CALL RelationLoader::run()
+ {
+ const ::rtl::OUString* pIter = m_aTableList.getConstArray() + m_nStartIndex;
+ for(sal_Int32 i = m_nStartIndex; i < m_nEndIndex;++i,++pIter)
{
::rtl::OUString sCatalog,sSchema,sTable;
- ::dbtools::qualifiedNameComponents(xMetaData,
+ ::dbtools::qualifiedNameComponents(m_xMetaData,
*pIter,
sCatalog,
sSchema,
@@ -396,124 +427,210 @@ void ORelationController::loadData()
if ( sCatalog.getLength() )
aCatalog <<= sCatalog;
- Reference< XResultSet > xResult = xMetaData->getImportedKeys(aCatalog, sSchema,sTable);
- if ( xResult.is() && xResult->next() )
- loadTableData(m_xTables->getByName(*pIter));
+ try
+ {
+ Reference< XResultSet > xResult = m_xMetaData->getImportedKeys(aCatalog, sSchema,sTable);
+ if ( xResult.is() && xResult->next() )
+ {
+ ::comphelper::disposeComponent(xResult);
+ loadTableData(m_xTables->getByName(*pIter));
+ } // if ( xResult.is() && xResult->next() )
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
}
}
- catch(SQLException& e)
+ void SAL_CALL RelationLoader::onTerminated()
{
- showError(SQLExceptionInfo(e));
- }
- catch(const Exception&)
- {
- DBG_UNHANDLED_EXCEPTION();
+ m_pParent->mergeData(m_vTableConnectionData);
+ delete this;
}
-}
-// -----------------------------------------------------------------------------
-void ORelationController::loadTableData(const Any& _aTable)
-{
- Reference<XPropertySet> xTableProp(_aTable,UNO_QUERY);
- const ::rtl::OUString sSourceName = ::dbtools::composeTableName( getConnection()->getMetaData(), xTableProp, ::dbtools::eInTableDefinitions, false, false, false );
- TTableWindowData::value_type pReferencingTable = existsTable(sSourceName);
- bool bNotFound = true, bAdded = false;
- if ( !pReferencingTable )
- {
- pReferencingTable.reset(new OTableWindowData(xTableProp,sSourceName, sSourceName));
- pReferencingTable->ShowAll(FALSE);
- bAdded = true;
- m_vTableData.push_back(pReferencingTable);
- }
-
- Reference<XIndexAccess> xKeys = pReferencingTable->getKeys();
- Reference<XKeysSupplier> xKeySup(xTableProp,UNO_QUERY);
- if ( !xKeys.is() && xKeySup.is() )
+ void RelationLoader::loadTableData(const Any& _aTable)
{
- xKeys = xKeySup->getKeys();
- }
+ Reference<XPropertySet> xTableProp(_aTable,UNO_QUERY);
+ const ::rtl::OUString sSourceName = ::dbtools::composeTableName( m_xMetaData, xTableProp, ::dbtools::eInTableDefinitions, false, false, false );
+ TTableDataHelper::iterator aFind = m_aTableData.find(sSourceName);
+ bool bNotFound = true, bAdded = false;
+ if ( aFind == m_aTableData.end() )
+ {
+ aFind = m_aTableData.insert(TTableDataHelper::value_type(sSourceName,::boost::shared_ptr<OTableWindowData>(new OTableWindowData(xTableProp,sSourceName, sSourceName)))).first;
+ aFind->second->ShowAll(FALSE);
+ bAdded = true;
+ }
+ TTableWindowData::value_type pReferencingTable = aFind->second;
+ Reference<XIndexAccess> xKeys = pReferencingTable->getKeys();
+ const Reference<XKeysSupplier> xKeySup(xTableProp,UNO_QUERY);
- if ( xKeys.is() )
- {
- Reference<XPropertySet> xKey;
- const sal_Int32 nCount = xKeys->getCount();
- for(sal_Int32 i = 0 ; i < nCount ; ++i)
+ if ( !xKeys.is() && xKeySup.is() )
+ {
+ xKeys = xKeySup->getKeys();
+ }
+
+ if ( xKeys.is() )
{
- xKeys->getByIndex(i) >>= xKey;
- sal_Int32 nKeyType = 0;
- xKey->getPropertyValue(PROPERTY_TYPE) >>= nKeyType;
- if ( KeyType::FOREIGN == nKeyType )
+ Reference<XPropertySet> xKey;
+ const sal_Int32 nCount = xKeys->getCount();
+ for(sal_Int32 i = 0 ; i < nCount ; ++i)
{
- bNotFound = false;
- ::rtl::OUString sReferencedTable;
- xKey->getPropertyValue(PROPERTY_REFERENCEDTABLE) >>= sReferencedTable;
- //////////////////////////////////////////////////////////////////////
- // insert windows
- TTableWindowData::value_type pReferencedTable = existsTable(sReferencedTable);
- if ( !pReferencedTable )
+ xKeys->getByIndex(i) >>= xKey;
+ sal_Int32 nKeyType = 0;
+ xKey->getPropertyValue(PROPERTY_TYPE) >>= nKeyType;
+ if ( KeyType::FOREIGN == nKeyType )
{
- if ( m_xTables->hasByName(sReferencedTable) )
+ bNotFound = false;
+ ::rtl::OUString sReferencedTable;
+ xKey->getPropertyValue(PROPERTY_REFERENCEDTABLE) >>= sReferencedTable;
+ //////////////////////////////////////////////////////////////////////
+ // insert windows
+ TTableDataHelper::iterator aRefFind = m_aTableData.find(sReferencedTable);
+ if ( aRefFind == m_aTableData.end() )
{
- Reference<XPropertySet> xReferencedTable(m_xTables->getByName(sReferencedTable),UNO_QUERY);
- pReferencedTable.reset(new OTableWindowData(xReferencedTable,sReferencedTable, sReferencedTable));
- pReferencedTable->ShowAll(FALSE);
- m_vTableData.push_back(pReferencedTable);
- }
- else
- continue; // table name could not be found so we do not show this table releation
- }
+ if ( m_xTables->hasByName(sReferencedTable) )
+ {
+ Reference<XPropertySet> xReferencedTable(m_xTables->getByName(sReferencedTable),UNO_QUERY);
+ aRefFind = m_aTableData.insert(TTableDataHelper::value_type(sReferencedTable,::boost::shared_ptr<OTableWindowData>(new OTableWindowData(xReferencedTable,sReferencedTable, sReferencedTable)))).first;
+ aRefFind->second->ShowAll(FALSE);
+ }
+ else
+ continue; // table name could not be found so we do not show this table releation
+ } // if ( aFind == m_aTableData.end() )
+ TTableWindowData::value_type pReferencedTable = aRefFind->second;
- ::rtl::OUString sKeyName;
- xKey->getPropertyValue(PROPERTY_NAME) >>= sKeyName;
- //////////////////////////////////////////////////////////////////////
- // insert connection
- ORelationTableConnectionData* pTabConnData = new ORelationTableConnectionData( pReferencingTable, pReferencedTable, sKeyName );
- m_vTableConnectionData.push_back(TTableConnectionData::value_type(pTabConnData));
- //////////////////////////////////////////////////////////////////////
- // insert columns
- Reference<XColumnsSupplier> xColsSup(xKey,UNO_QUERY);
- OSL_ENSURE(xColsSup.is(),"Key is no XColumnsSupplier!");
- Reference<XNameAccess> xColumns = xColsSup->getColumns();
- Sequence< ::rtl::OUString> aNames = xColumns->getElementNames();
- const ::rtl::OUString* pIter = aNames.getConstArray();
- const ::rtl::OUString* pEnd = pIter + aNames.getLength();
- ::rtl::OUString sColumnName,sRelatedName;
- for(sal_uInt16 j=0;pIter != pEnd;++pIter,++j)
- {
- Reference<XPropertySet> xPropSet;
- xColumns->getByName(*pIter) >>= xPropSet;
- OSL_ENSURE(xPropSet.is(),"Invalid column found in KeyColumns!");
- if ( xPropSet.is() )
+ ::rtl::OUString sKeyName;
+ xKey->getPropertyValue(PROPERTY_NAME) >>= sKeyName;
+ //////////////////////////////////////////////////////////////////////
+ // insert connection
+ ORelationTableConnectionData* pTabConnData = new ORelationTableConnectionData( pReferencingTable, pReferencedTable, sKeyName );
+ m_vTableConnectionData.push_back(TTableConnectionData::value_type(pTabConnData));
+ //////////////////////////////////////////////////////////////////////
+ // insert columns
+ const Reference<XColumnsSupplier> xColsSup(xKey,UNO_QUERY);
+ OSL_ENSURE(xColsSup.is(),"Key is no XColumnsSupplier!");
+ const Reference<XNameAccess> xColumns = xColsSup->getColumns();
+ const Sequence< ::rtl::OUString> aNames = xColumns->getElementNames();
+ const ::rtl::OUString* pIter = aNames.getConstArray();
+ const ::rtl::OUString* pEnd = pIter + aNames.getLength();
+ ::rtl::OUString sColumnName,sRelatedName;
+ for(sal_uInt16 j=0;pIter != pEnd;++pIter,++j)
{
- xPropSet->getPropertyValue(PROPERTY_NAME) >>= sColumnName;
- xPropSet->getPropertyValue(PROPERTY_RELATEDCOLUMN) >>= sRelatedName;
+ const Reference<XPropertySet> xPropSet(xColumns->getByName(*pIter),UNO_QUERY);
+ OSL_ENSURE(xPropSet.is(),"Invalid column found in KeyColumns!");
+ if ( xPropSet.is() )
+ {
+ xPropSet->getPropertyValue(PROPERTY_NAME) >>= sColumnName;
+ xPropSet->getPropertyValue(PROPERTY_RELATEDCOLUMN) >>= sRelatedName;
+ }
+ pTabConnData->SetConnLine( j, sColumnName, sRelatedName );
}
- pTabConnData->SetConnLine( j, sColumnName, sRelatedName );
+ //////////////////////////////////////////////////////////////////////
+ // Update/Del-Flags setzen
+ sal_Int32 nUpdateRule = 0;
+ sal_Int32 nDeleteRule = 0;
+ xKey->getPropertyValue(PROPERTY_UPDATERULE) >>= nUpdateRule;
+ xKey->getPropertyValue(PROPERTY_DELETERULE) >>= nDeleteRule;
+
+ pTabConnData->SetUpdateRules( nUpdateRule );
+ pTabConnData->SetDeleteRules( nDeleteRule );
+
+ //////////////////////////////////////////////////////////////////////
+ // Kardinalitaet setzen
+ pTabConnData->SetCardinality();
}
- //////////////////////////////////////////////////////////////////////
- // Update/Del-Flags setzen
- sal_Int32 nUpdateRule = 0;
- sal_Int32 nDeleteRule = 0;
- xKey->getPropertyValue(PROPERTY_UPDATERULE) >>= nUpdateRule;
- xKey->getPropertyValue(PROPERTY_DELETERULE) >>= nDeleteRule;
-
- pTabConnData->SetUpdateRules( nUpdateRule );
- pTabConnData->SetDeleteRules( nDeleteRule );
-
- //////////////////////////////////////////////////////////////////////
- // Kardinalitaet setzen
- pTabConnData->SetCardinality();
}
+ } // if ( xKeys.is() )
+ }
+}
+
+void ORelationController::mergeData(const TTableConnectionData& _aConnectionData)
+{
+ ::osl::MutexGuard aGuard( getMutex() );
+
+ ::std::copy( _aConnectionData.begin(), _aConnectionData.end(), ::std::back_inserter( m_vTableConnectionData ));
+ //const Reference< XDatabaseMetaData> xMetaData = getConnection()->getMetaData();
+ const sal_Bool bCase = sal_True;//xMetaData.is() && xMetaData->supportsMixedCaseQuotedIdentifiers();
+ // here we are finished, so we can collect the table from connection data
+ TTableConnectionData::iterator aConnDataIter = m_vTableConnectionData.begin();
+ TTableConnectionData::iterator aConnDataEnd = m_vTableConnectionData.end();
+ for(;aConnDataIter != aConnDataEnd;++aConnDataIter)
+ {
+ if ( !existsTable((*aConnDataIter)->getReferencingTable()->GetComposedName(),bCase) )
+ {
+ m_vTableData.push_back((*aConnDataIter)->getReferencingTable());
+ }
+ if ( !existsTable((*aConnDataIter)->getReferencedTable()->GetComposedName(),bCase) )
+ {
+ m_vTableData.push_back((*aConnDataIter)->getReferencedTable());
}
- } // if ( xKeys.is() )
- if ( bNotFound && bAdded )
- m_vTableData.pop_back();
+ } // for(;aConnDataIter != aConnDataEnd;++aConnDataIter)
+ --m_nThreadEvent;
+ if ( !m_nThreadEvent )
+ Application::PostUserEvent(LINK(this, ORelationController, OnThreadFinished));
+}
+// -----------------------------------------------------------------------------
+IMPL_LINK( ORelationController, OnThreadFinished, void*, /*NOTINTERESTEDIN*/ )
+{
+ vos::OGuard aSolarGuard( Application::GetSolarMutex() );
+ ::osl::MutexGuard aGuard( getMutex() );
+ try
+ {
+ getView()->initialize(); // show the windows and fill with our informations
+ getView()->Invalidate(INVALIDATE_NOERASE);
+ getUndoMgr()->Clear(); // clear all undo redo things
+ setModified(sal_False); // and we are not modified yet
+
+ if(m_vTableData.empty())
+ Execute(ID_BROWSER_ADDTABLE,Sequence<PropertyValue>());
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+ m_pWaitObject.reset();
+ return 0L;
+}
+// -----------------------------------------------------------------------------
+void ORelationController::loadData()
+{
+ m_pWaitObject.reset( new WaitObject(getView()) );
+ try
+ {
+ if ( !m_xTables.is() )
+ return;
+ // this may take some time
+ const Reference< XDatabaseMetaData> xMetaData = getConnection()->getMetaData();
+ const Sequence< ::rtl::OUString> aNames = m_xTables->getElementNames();
+ const sal_Int32 nCount = aNames.getLength();
+ const sal_Int32 nMaxElements = (nCount / MAX_THREADS) +1;
+
+ sal_Int32 nStart = 0,nEnd = ::std::min(nMaxElements,nCount);
+ while(nStart != nEnd)
+ {
+ ++m_nThreadEvent;
+ RelationLoader* pThread = new RelationLoader(this,xMetaData,m_xTables,aNames,nStart,nEnd);
+ pThread->createSuspended();
+ pThread->setPriority(osl_Thread_PriorityBelowNormal);
+ pThread->resume();
+ nStart = nEnd;
+ nEnd += nMaxElements;
+ nEnd = ::std::min(nEnd,nCount);
+ } // for(;pIter != pEnd;++pIter)
+ }
+ catch(SQLException& e)
+ {
+ showError(SQLExceptionInfo(e));
+ }
+ catch(const Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
}
// -----------------------------------------------------------------------------
-TTableWindowData::value_type ORelationController::existsTable(const ::rtl::OUString& _rComposedTableName) const
+TTableWindowData::value_type ORelationController::existsTable(const ::rtl::OUString& _rComposedTableName,sal_Bool _bCase) const
{
- Reference<XDatabaseMetaData> xMeta = getConnection()->getMetaData();
- ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());
+ ::comphelper::UStringMixEqual bCase(_bCase);
TTableWindowData::const_iterator aIter = m_vTableData.begin();
TTableWindowData::const_iterator aEnd = m_vTableData.end();
for(;aIter != aEnd;++aIter)
diff --git a/dbaccess/source/ui/relationdesign/RelationTableView.cxx b/dbaccess/source/ui/relationdesign/RelationTableView.cxx
index ffbff7cf2e3e..cfd70afc2b95 100644
--- a/dbaccess/source/ui/relationdesign/RelationTableView.cxx
+++ b/dbaccess/source/ui/relationdesign/RelationTableView.cxx
@@ -182,7 +182,7 @@ void ORelationTableView::ReSync()
pTabConnDataList->erase( ::std::remove(pTabConnDataList->begin(),pTabConnDataList->end(),*aConIter),pTabConnDataList->end() );
continue;
}
- }
+ } // if ( !arrInvalidTables.empty() )
addConnection( new ORelationTableConnection(this, *aConIter), sal_False ); // don't add the data again
}