diff options
Diffstat (limited to 'connectivity/source/commontools')
-rw-r--r-- | connectivity/source/commontools/ConnectionWrapper.cxx | 2 | ||||
-rw-r--r-- | connectivity/source/commontools/DateConversion.cxx | 56 | ||||
-rw-r--r-- | connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx | 2 | ||||
-rw-r--r-- | connectivity/source/commontools/TColumnsHelper.cxx | 73 | ||||
-rw-r--r-- | connectivity/source/commontools/TDatabaseMetaDataBase.cxx | 4 | ||||
-rw-r--r-- | connectivity/source/commontools/TIndexColumns.cxx | 2 | ||||
-rw-r--r-- | connectivity/source/commontools/TIndexes.cxx | 4 | ||||
-rw-r--r-- | connectivity/source/commontools/TKey.cxx | 53 | ||||
-rw-r--r-- | connectivity/source/commontools/TPrivilegesResultSet.cxx | 4 | ||||
-rw-r--r-- | connectivity/source/commontools/TTableHelper.cxx | 213 | ||||
-rw-r--r-- | connectivity/source/commontools/dbconversion.cxx | 4 | ||||
-rw-r--r-- | connectivity/source/commontools/dbmetadata.cxx | 3 | ||||
-rw-r--r-- | connectivity/source/commontools/dbtools.cxx | 5 | ||||
-rw-r--r-- | connectivity/source/commontools/dbtools2.cxx | 49 | ||||
-rw-r--r-- | connectivity/source/commontools/parameters.cxx | 2 |
15 files changed, 345 insertions, 131 deletions
diff --git a/connectivity/source/commontools/ConnectionWrapper.cxx b/connectivity/source/commontools/ConnectionWrapper.cxx index 450243c0295c..8a4ee0272251 100644 --- a/connectivity/source/commontools/ConnectionWrapper.cxx +++ b/connectivity/source/commontools/ConnectionWrapper.cxx @@ -109,7 +109,7 @@ void OConnectionWrapper::setDelegation(const Reference< XConnection >& _xConnect // ----------------------------------------------------------------------------- void OConnectionWrapper::disposing() { - m_xConnection = NULL; +m_xConnection.clear(); } //----------------------------------------------------------------------------- OConnectionWrapper::~OConnectionWrapper() diff --git a/connectivity/source/commontools/DateConversion.cxx b/connectivity/source/commontools/DateConversion.cxx index 1b8f40f3b0d6..010cfbcf5f34 100644 --- a/connectivity/source/commontools/DateConversion.cxx +++ b/connectivity/source/commontools/DateConversion.cxx @@ -45,6 +45,7 @@ #include "TConnection.hxx" #include "diagnose_ex.h" #include <comphelper/numbers.hxx> +#include <rtl/ustrbuf.hxx> using namespace ::connectivity; @@ -63,7 +64,7 @@ using namespace ::com::sun::star::beans; ::rtl::OUString DBTypeConversion::toSQLString(sal_Int32 eType, const Any& _rVal, sal_Bool bQuote, const Reference< XTypeConverter >& _rxTypeConverter) { - ::rtl::OUString aRet; + ::rtl::OUStringBuffer aRet; if (_rVal.hasValue()) { try @@ -78,18 +79,22 @@ using namespace ::com::sun::star::beans; if (_rVal.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_BOOLEAN) { if (::cppu::any2bool(_rVal)) - aRet = ::rtl::OUString::createFromAscii("1"); + aRet.appendAscii("1"); else - aRet = ::rtl::OUString::createFromAscii("0"); + aRet.appendAscii("0"); } else - _rxTypeConverter->convertToSimpleType(_rVal, TypeClass_STRING) >>= aRet; + { + ::rtl::OUString sTemp; + _rxTypeConverter->convertToSimpleType(_rVal, TypeClass_STRING) >>= sTemp; + aRet.append(sTemp); + } break; case DataType::CHAR: case DataType::VARCHAR: case DataType::LONGVARCHAR: if (bQuote) - aRet += ::rtl::OUString::createFromAscii("'"); + aRet.appendAscii("'"); { ::rtl::OUString aTemp; _rxTypeConverter->convertToSimpleType(_rVal, TypeClass_STRING) >>= aTemp; @@ -104,17 +109,22 @@ using namespace ::com::sun::star::beans; aTemp = aTemp.replaceAt(nIndex,sQuot.getLength(),sQuotToReplace); } while (nIndex != -1); - aRet += aTemp; + aRet.append(aTemp); } if (bQuote) - aRet += ::rtl::OUString::createFromAscii("'"); + aRet.appendAscii("'"); break; case DataType::REAL: case DataType::DOUBLE: case DataType::DECIMAL: case DataType::NUMERIC: case DataType::BIGINT: - _rxTypeConverter->convertToSimpleType(_rVal, TypeClass_STRING) >>= aRet; + default: + { + ::rtl::OUString sTemp; + _rxTypeConverter->convertToSimpleType(_rVal, TypeClass_STRING) >>= sTemp; + aRet.append(sTemp); + } break; case DataType::TIMESTAMP: { @@ -123,9 +133,11 @@ using namespace ::com::sun::star::beans; // check if this is really a timestamp or only a date if ( _rVal >>= aDateTime ) { - if (bQuote) aRet += ::rtl::OUString::createFromAscii("{TS '"); - aRet += DBTypeConversion::toDateTimeString(aDateTime); - if (bQuote) aRet += ::rtl::OUString::createFromAscii("'}"); + if (bQuote) + aRet.appendAscii("{TS '"); + aRet.append(DBTypeConversion::toDateTimeString(aDateTime)); + if (bQuote) + aRet.appendAscii("'}"); break; } break; @@ -134,20 +146,22 @@ using namespace ::com::sun::star::beans; { Date aDate; OSL_VERIFY_RES( _rVal >>= aDate, "DBTypeConversion::toSQLString: _rVal is not date!"); - if (bQuote) aRet += ::rtl::OUString::createFromAscii("{D '"); - aRet += DBTypeConversion::toDateString(aDate);; - if (bQuote) aRet += ::rtl::OUString::createFromAscii("'}"); + if (bQuote) + aRet.appendAscii("{D '"); + aRet.append(DBTypeConversion::toDateString(aDate)); + if (bQuote) + aRet.appendAscii("'}"); } break; case DataType::TIME: { Time aTime; OSL_VERIFY_RES( _rVal >>= aTime,"DBTypeConversion::toSQLString: _rVal is not time!"); - if (bQuote) aRet += ::rtl::OUString::createFromAscii("{T '"); - aRet += DBTypeConversion::toTimeString(aTime); - if (bQuote) aRet += ::rtl::OUString::createFromAscii("'}"); + if (bQuote) + aRet.appendAscii("{T '"); + aRet.append(DBTypeConversion::toTimeString(aTime)); + if (bQuote) + aRet.appendAscii("'}"); } break; - default: - _rxTypeConverter->convertToSimpleType(_rVal, TypeClass_STRING) >>= aRet; } } catch ( const Exception& ) @@ -156,8 +170,8 @@ using namespace ::com::sun::star::beans; } } else - aRet = ::rtl::OUString::createFromAscii(" NULL "); - return aRet; + aRet.appendAscii(" NULL "); + return aRet.makeStringAndClear(); } // ----------------------------------------------------------------------------- Date DBTypeConversion::getNULLDate(const Reference< XNumberFormatsSupplier > &xSupplier) diff --git a/connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx b/connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx index 9c3acfb606d5..afa53652d4e6 100644 --- a/connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx +++ b/connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx @@ -133,7 +133,7 @@ void ODatabaseMetaDataResultSet::disposing(void) ::osl::MutexGuard aGuard(m_aMutex); m_aStatement = NULL; - m_xMetaData = NULL; +m_xMetaData.clear(); m_aRowsIter = m_aRows.end(); m_aRows.clear(); m_aRowsIter = m_aRows.end(); diff --git a/connectivity/source/commontools/TColumnsHelper.cxx b/connectivity/source/commontools/TColumnsHelper.cxx index 2ce570e95936..8d02cfccab4a 100644 --- a/connectivity/source/commontools/TColumnsHelper.cxx +++ b/connectivity/source/commontools/TColumnsHelper.cxx @@ -37,6 +37,9 @@ #include <com/sun/star/sdbc/XResultSet.hpp> #include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/sdbc/ColumnValue.hpp> +#include <com/sun/star/sdbcx/KeyType.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <com/sun/star/sdbcx/XKeysSupplier.hpp> #include <comphelper/types.hxx> #include "connectivity/dbtools.hxx" #include "TConnection.hxx" @@ -51,7 +54,7 @@ using namespace connectivity; using namespace dbtools; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -// using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; @@ -114,17 +117,67 @@ sdbcx::ObjectType OColumnsHelper::createObject(const ::rtl::OUString& _rName) bAutoIncrement = aFind->second.first.first; bIsCurrency = aFind->second.first.second; nDataType = aFind->second.second; - } + } // if ( aFind != m_pImpl->m_aColumnInfo.end() ) + sdbcx::ObjectType xRet; + const ColumnDesc* pColDesc = m_pTable->getColumnDescription(_rName); + if ( pColDesc ) + { + Reference<XPropertySet> xPr = m_pTable; + Reference<XKeysSupplier> xKeysSup(xPr,UNO_QUERY); + Reference<XNameAccess> xPrimaryKeyColumns; + if ( xKeysSup.is() ) + { + const Reference<XIndexAccess> xKeys = xKeysSup->getKeys(); + if ( xKeys.is() ) + { + ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); + const sal_Int32 nKeyCount = xKeys->getCount(); + for(sal_Int32 nKeyIter = 0; nKeyIter < nKeyCount;++nKeyIter) + { + const Reference<XPropertySet> xKey(xKeys->getByIndex(nKeyIter),UNO_QUERY_THROW); + sal_Int32 nType = 0; + xKey->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_TYPE)) >>= nType; + if ( nType == KeyType::PRIMARY ) + { + const Reference<XColumnsSupplier> xColS(xKey,UNO_QUERY_THROW); + xPrimaryKeyColumns = xColS->getColumns(); + break; + } + } // for(sal_Int32 nKeyIter = 0; nKeyIter < nKeyCount;++) + } + } + sal_Int32 nField11 = pColDesc->nField11; + if ( nField11 != ColumnValue::NO_NULLS && xPrimaryKeyColumns.is() && xPrimaryKeyColumns->hasByName(_rName) ) + { + nField11 = ColumnValue::NO_NULLS; + } // if ( xKeys.is() ) + connectivity::sdbcx::OColumn* pRet = new connectivity::sdbcx::OColumn(_rName, + pColDesc->aField6, + pColDesc->sField13, + nField11, + pColDesc->nField7, + pColDesc->nField9, + pColDesc->nField5, + bAutoIncrement, + sal_False, + bIsCurrency, + isCaseSensitive()); + + xRet = pRet; + } + else + { - sdbcx::ObjectType xRet(::dbtools::createSDBCXColumn( m_pTable, - xConnection, - _rName, - isCaseSensitive(), - bQueryInfo, - bAutoIncrement, - bIsCurrency, - nDataType),UNO_QUERY); + xRet.set(::dbtools::createSDBCXColumn( m_pTable, + xConnection, + _rName, + isCaseSensitive(), + bQueryInfo, + bAutoIncrement, + bIsCurrency, + nDataType),UNO_QUERY); + } return xRet; } diff --git a/connectivity/source/commontools/TDatabaseMetaDataBase.cxx b/connectivity/source/commontools/TDatabaseMetaDataBase.cxx index 5f5aaabe5c72..b3cbb4ae67c7 100644 --- a/connectivity/source/commontools/TDatabaseMetaDataBase.cxx +++ b/connectivity/source/commontools/TDatabaseMetaDataBase.cxx @@ -90,8 +90,8 @@ Sequence< PropertyValue > SAL_CALL ODatabaseMetaDataBase::getConnectionInfo( ) void SAL_CALL ODatabaseMetaDataBase::disposing( const EventObject& /*Source*/ ) throw(RuntimeException) { // cut off all references to the connection - m_xConnection = NULL; - m_xListenerHelper = NULL; +m_xConnection.clear(); +m_xListenerHelper.clear(); } // ----------------------------------------------------------------------------- Reference< XResultSet > SAL_CALL ODatabaseMetaDataBase::getTypeInfo( ) throw(SQLException, RuntimeException) diff --git a/connectivity/source/commontools/TIndexColumns.cxx b/connectivity/source/commontools/TIndexColumns.cxx index 00a153ceeed0..89fa282f2e74 100644 --- a/connectivity/source/commontools/TIndexColumns.cxx +++ b/connectivity/source/commontools/TIndexColumns.cxx @@ -85,7 +85,7 @@ sdbcx::ObjectType OIndexColumns::createObject(const ::rtl::OUString& _rName) m_pIndex->getTable()->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)), aSchema,aTable,_rName); - sdbcx::ObjectType xRet = NULL; + sdbcx::ObjectType xRet; if ( xResult.is() ) { Reference< XRow > xRow(xResult,UNO_QUERY); diff --git a/connectivity/source/commontools/TIndexes.cxx b/connectivity/source/commontools/TIndexes.cxx index 3257f8c984c0..cf17b7a51411 100644 --- a/connectivity/source/commontools/TIndexes.cxx +++ b/connectivity/source/commontools/TIndexes.cxx @@ -97,8 +97,8 @@ sdbcx::ObjectType OIndexesHelper::createObject(const ::rtl::OUString& _rName) { sal_Int32 nClustered = xRow->getShort(7); sal_Bool bPrimarKeyIndex = sal_False; - xRow = NULL; - xResult = NULL; + xRow.clear(); + xResult.clear(); try { xResult = m_pTable->getMetaData()->getPrimaryKeys(aCatalog,aSchema,aTable); diff --git a/connectivity/source/commontools/TKey.cxx b/connectivity/source/commontools/TKey.cxx index c065e11cf24c..1218c752ec50 100644 --- a/connectivity/source/commontools/TKey.cxx +++ b/connectivity/source/commontools/TKey.cxx @@ -71,38 +71,43 @@ void OTableKeyHelper::refreshColumns() ::std::vector< ::rtl::OUString> aVector; if ( !isNew() ) { - ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); - ::rtl::OUString aSchema,aTable; - m_pTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_SCHEMANAME)) >>= aSchema; - m_pTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)) >>= aTable; - - if ( m_Name.getLength() ) // foreign key + aVector = m_aProps->m_aKeyColumnNames; + if ( aVector.empty() ) { + ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); + ::rtl::OUString aSchema,aTable; + m_pTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_SCHEMANAME)) >>= aSchema; + m_pTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)) >>= aTable; - Reference< XResultSet > xResult = m_pTable->getMetaData()->getImportedKeys(m_pTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)), - aSchema,aTable); - - if ( xResult.is() ) + if ( m_Name.getLength() ) // foreign key { - Reference< XRow > xRow(xResult,UNO_QUERY); - while( xResult->next() ) + + Reference< XResultSet > xResult = m_pTable->getMetaData()->getImportedKeys(m_pTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)), + aSchema,aTable); + + if ( xResult.is() ) { - ::rtl::OUString aForeignKeyColumn = xRow->getString(8); - if(xRow->getString(12) == m_Name) - aVector.push_back(aForeignKeyColumn); + Reference< XRow > xRow(xResult,UNO_QUERY); + while( xResult->next() ) + { + ::rtl::OUString aForeignKeyColumn = xRow->getString(8); + if(xRow->getString(12) == m_Name) + aVector.push_back(aForeignKeyColumn); + } } } - } - if ( aVector.empty() ) - { - Reference< XResultSet > xResult = m_pTable->getMetaData()->getPrimaryKeys(m_pTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)), - aSchema,aTable); - if ( xResult.is() ) + if ( aVector.empty() ) { - Reference< XRow > xRow(xResult,UNO_QUERY); - while( xResult->next() ) - aVector.push_back(xRow->getString(4)); + const Reference< XResultSet > xResult = m_pTable->getMetaData()->getPrimaryKeys(m_pTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)), + aSchema,aTable); + + if ( xResult.is() ) + { + const Reference< XRow > xRow(xResult,UNO_QUERY); + while( xResult->next() ) + aVector.push_back(xRow->getString(4)); + } // if ( xResult.is() ) } } } diff --git a/connectivity/source/commontools/TPrivilegesResultSet.cxx b/connectivity/source/commontools/TPrivilegesResultSet.cxx index 0de0c1e077b5..509d924779de 100644 --- a/connectivity/source/commontools/TPrivilegesResultSet.cxx +++ b/connectivity/source/commontools/TPrivilegesResultSet.cxx @@ -127,8 +127,8 @@ const ORowSetValue& OResultSetPrivileges::getValue(sal_Int32 columnIndex) void SAL_CALL OResultSetPrivileges::disposing(void) { ODatabaseMetaDataResultSet::disposing(); - m_xTables = NULL; - m_xRow = NULL; +m_xTables.clear(); +m_xRow.clear(); } // ----------------------------------------------------------------------------- sal_Bool SAL_CALL OResultSetPrivileges::next( ) throw(SQLException, RuntimeException) diff --git a/connectivity/source/commontools/TTableHelper.cxx b/connectivity/source/commontools/TTableHelper.cxx index ecec91aa6f32..477ec01c0499 100644 --- a/connectivity/source/commontools/TTableHelper.cxx +++ b/connectivity/source/commontools/TTableHelper.cxx @@ -38,6 +38,7 @@ #include <cppuhelper/typeprovider.hxx> #include <com/sun/star/lang/DisposedException.hpp> #include <com/sun/star/sdbc/ColumnValue.hpp> +#include <comphelper/implementationreference.hxx> #include <comphelper/sequence.hxx> #include <comphelper/extract.hxx> #include <comphelper/types.hxx> @@ -54,16 +55,70 @@ using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; +namespace +{ + /// helper class for column property change events which holds the OComponentDefinition weak +typedef ::cppu::WeakImplHelper1 < XContainerListener > OTableContainerListener_BASE; +class OTableContainerListener : public OTableContainerListener_BASE +{ + OTableHelper* m_pComponent; + ::std::map< ::rtl::OUString,bool> m_aRefNames; + + OTableContainerListener(const OTableContainerListener&); + void operator =(const OTableContainerListener&); +protected: + virtual ~OTableContainerListener(){} +public: + OTableContainerListener(OTableHelper* _pComponent) : m_pComponent(_pComponent){} + virtual void SAL_CALL elementInserted( const ::com::sun::star::container::ContainerEvent& /*Event*/ ) throw (RuntimeException) + { + } + virtual void SAL_CALL elementRemoved( const ::com::sun::star::container::ContainerEvent& Event ) throw (RuntimeException) + { + ::rtl::OUString sName; + Event.Accessor >>= sName; + if ( m_aRefNames.find(sName) != m_aRefNames.end() ) + m_pComponent->refreshKeys(); + } + virtual void SAL_CALL elementReplaced( const ::com::sun::star::container::ContainerEvent& Event ) throw (RuntimeException) + { + ::rtl::OUString sOldComposedName,sNewComposedName; + Event.ReplacedElement >>= sOldComposedName; + Event.Accessor >>= sNewComposedName; + if ( sOldComposedName != sNewComposedName && m_aRefNames.find(sOldComposedName) != m_aRefNames.end() ) + m_pComponent->refreshKeys(); + } + // XEventListener + virtual void SAL_CALL disposing( const EventObject& /*_rSource*/ ) throw (RuntimeException) + { + } + void clear() { m_pComponent = NULL; } + inline void add(const ::rtl::OUString& _sRefName) { m_aRefNames.insert(::std::map< ::rtl::OUString,bool>::value_type(_sRefName,true)); } +}; +} +namespace connectivity +{ + struct OTableHelperImpl + { + TKeyMap m_aKeys; + Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; + Reference< ::com::sun::star::sdbc::XConnection > m_xConnection; + ::comphelper::ImplementationReference< OTableContainerListener,XContainerListener> + m_xTablePropertyListener; + ::std::vector< ColumnDesc > m_aColumnDesc; + }; +} OTableHelper::OTableHelper( sdbcx::OCollection* _pTables, const Reference< XConnection >& _xConnection, sal_Bool _bCase) :OTable_TYPEDEF(_pTables,_bCase) - ,m_xConnection(_xConnection) + ,m_pImpl(new OTableHelperImpl) { try { - m_xMetaData = m_xConnection->getMetaData(); + m_pImpl->m_xConnection = _xConnection; + m_pImpl->m_xMetaData = m_pImpl->m_xConnection->getMetaData(); } catch(const Exception&) { @@ -85,42 +140,41 @@ OTableHelper::OTableHelper( sdbcx::OCollection* _pTables, _Description, _SchemaName, _CatalogName) - ,m_xConnection(_xConnection) + ,m_pImpl(new OTableHelperImpl) { try { - m_xMetaData = m_xConnection->getMetaData(); + m_pImpl->m_xConnection = _xConnection; + m_pImpl->m_xMetaData = m_pImpl->m_xConnection->getMetaData(); } catch(const Exception&) { } } // ----------------------------------------------------------------------------- +OTableHelper::~OTableHelper() +{ +} +// ----------------------------------------------------------------------------- void SAL_CALL OTableHelper::disposing() { - OTable_TYPEDEF::disposing(); ::osl::MutexGuard aGuard(m_aMutex); - m_xConnection = NULL; - m_xMetaData = NULL; + if ( m_pImpl->m_xTablePropertyListener.is() ) + { + m_pTables->removeContainerListener(m_pImpl->m_xTablePropertyListener.getRef()); + m_pImpl->m_xTablePropertyListener->clear(); + m_pImpl->m_xTablePropertyListener.dispose(); + } + OTable_TYPEDEF::disposing(); + + m_pImpl->m_xConnection = NULL; + m_pImpl->m_xMetaData = NULL; + } // ------------------------------------------------------------------------- namespace { - typedef sal_Int32 OrdinalPosition; - struct ColumnDesc - { - ::rtl::OUString sName; - OrdinalPosition nOrdinalPosition; - - ColumnDesc() {} - ColumnDesc( const ::rtl::OUString& _rName, OrdinalPosition _nPosition ) - :sName( _rName ) - ,nOrdinalPosition( _nPosition ) - { - } - }; - /** collects ColumnDesc's from a resultset produced by XDatabaseMetaData::getColumns */ void lcl_collectColumnDescs_throw( const Reference< XResultSet >& _rxResult, ::std::vector< ColumnDesc >& _out_rColumns ) @@ -131,8 +185,14 @@ namespace while ( _rxResult->next() ) { sName = xRow->getString( 4 ); // COLUMN_NAME + sal_Int32 nField5 = xRow->getInt(5); + ::rtl::OUString aField6 = xRow->getString(6); + sal_Int32 nField7 = xRow->getInt(7) + , nField9 = xRow->getInt(9) + , nField11= xRow->getInt(11); + ::rtl::OUString sField13 = xRow->getString(13); nOrdinalPosition = xRow->getInt( 17 ); // ORDINAL_POSITION - _out_rColumns.push_back( ColumnDesc( sName, nOrdinalPosition ) ); + _out_rColumns.push_back( ColumnDesc( sName,nField5,aField6,nField7,nField9,nField11,sField13, nOrdinalPosition ) ); } } @@ -201,16 +261,16 @@ void OTableHelper::refreshColumns() ) ); // collect the column names, together with their ordinal position - ::std::vector< ColumnDesc > aColumns; - lcl_collectColumnDescs_throw( xResult, aColumns ); + m_pImpl->m_aColumnDesc.clear(); + lcl_collectColumnDescs_throw( xResult, m_pImpl->m_aColumnDesc ); // ensure that the ordinal positions as obtained from the meta data do make sense - lcl_sanitizeColumnDescs( aColumns ); + lcl_sanitizeColumnDescs( m_pImpl->m_aColumnDesc ); // sort by ordinal position ::std::map< OrdinalPosition, ::rtl::OUString > aSortedColumns; - for ( ::std::vector< ColumnDesc >::const_iterator copy = aColumns.begin(); - copy != aColumns.end(); + for ( ::std::vector< ColumnDesc >::const_iterator copy = m_pImpl->m_aColumnDesc.begin(); + copy != m_pImpl->m_aColumnDesc.end(); ++copy ) aSortedColumns[ copy->nOrdinalPosition ] = copy->sName; @@ -229,6 +289,21 @@ void OTableHelper::refreshColumns() else m_pColumns = createColumns(aVector); } +// ----------------------------------------------------------------------------- +const ColumnDesc* OTableHelper::getColumnDescription(const ::rtl::OUString& _sName) const +{ + const ColumnDesc* pRet = NULL; + ::std::vector< ColumnDesc >::const_iterator aEnd = m_pImpl->m_aColumnDesc.end(); + for (::std::vector< ColumnDesc >::const_iterator aIter = m_pImpl->m_aColumnDesc.begin();aIter != aEnd;++aIter) + { + if ( aIter->sName == _sName ) + { + pRet = &*aIter; + break; + } + } // for (::std::vector< ColumnDesc >::const_iterator aIter = m_pImpl->m_aColumnDesc.begin();aIter != aEnd;++aIter) + return pRet; +} // ------------------------------------------------------------------------- void OTableHelper::refreshPrimaryKeys(TStringVector& _rNames) { @@ -237,14 +312,26 @@ void OTableHelper::refreshPrimaryKeys(TStringVector& _rNames) aCatalog <<= m_CatalogName; Reference< XResultSet > xResult = getMetaData()->getPrimaryKeys(aCatalog,m_SchemaName,m_Name); - if ( xResult.is() && xResult->next() ) + if ( xResult.is() ) { - Reference< XRow > xRow(xResult,UNO_QUERY); - const ::rtl::OUString aPkName = xRow->getString(6); - m_aKeys.insert(TKeyMap::value_type(aPkName,sdbcx::TKeyProperties(new sdbcx::KeyProperties(::rtl::OUString(),KeyType::PRIMARY,0,0)))); + sdbcx::TKeyProperties pKeyProps(new sdbcx::KeyProperties(::rtl::OUString(),KeyType::PRIMARY,0,0)); + ::rtl::OUString aPkName; + bool bAlreadyFetched = false; + const Reference< XRow > xRow(xResult,UNO_QUERY); + while ( xResult->next() ) + { + pKeyProps->m_aKeyColumnNames.push_back(xRow->getString(4)); + if ( !bAlreadyFetched ) + { + aPkName = xRow->getString(6); + bAlreadyFetched = true; + } + } + + m_pImpl->m_aKeys.insert(TKeyMap::value_type(aPkName,pKeyProps)); _rNames.push_back(aPkName); - ::comphelper::disposeComponent(xResult); - } + } // if ( xResult.is() && xResult->next() ) + ::comphelper::disposeComponent(xResult); } // ------------------------------------------------------------------------- void OTableHelper::refreshForgeinKeys(TStringVector& _rNames) @@ -257,7 +344,8 @@ void OTableHelper::refreshForgeinKeys(TStringVector& _rNames) if ( xRow.is() ) { - ::rtl::OUString aName,sCatalog,aSchema; + sdbcx::TKeyProperties pKeyProps; + ::rtl::OUString aName,sCatalog,aSchema,sOldFKName; while( xResult->next() ) { // this must be outsid the "if" because we have to call in a right order @@ -267,29 +355,51 @@ void OTableHelper::refreshForgeinKeys(TStringVector& _rNames) aSchema = xRow->getString(2); aName = xRow->getString(3); - const sal_Int32 nKeySeq = xRow->getInt(9); + const ::rtl::OUString sForeignKeyColumn = xRow->getString(8); const sal_Int32 nUpdateRule = xRow->getInt(10); const sal_Int32 nDeleteRule = xRow->getInt(11); + const ::rtl::OUString sFkName = xRow->getString(12); + + if ( pKeyProps.get() ) + { + } + - if ( nKeySeq == 1 ) - { // only append when the sequnce number is 1 to forbid serveral inserting the same key name - const ::rtl::OUString sFkName = xRow->getString(12); - if ( sFkName.getLength() && !xRow->wasNull() ) + if ( sFkName.getLength() && !xRow->wasNull() ) + { + if ( sOldFKName != sFkName ) { - ::rtl::OUString sReferencedName; - sReferencedName = ::dbtools::composeTableName(getMetaData(),sCatalog,aSchema,aName,sal_False,::dbtools::eInDataManipulation); - m_aKeys.insert(TKeyMap::value_type(sFkName,sdbcx::TKeyProperties(new sdbcx::KeyProperties(sReferencedName,KeyType::FOREIGN,nUpdateRule,nDeleteRule)))); + if ( pKeyProps.get() ) + m_pImpl->m_aKeys.insert(TKeyMap::value_type(sOldFKName,pKeyProps)); + + const ::rtl::OUString sReferencedName = ::dbtools::composeTableName(getMetaData(),sCatalog,aSchema,aName,sal_False,::dbtools::eInDataManipulation); + pKeyProps.reset(new sdbcx::KeyProperties(sReferencedName,KeyType::FOREIGN,nUpdateRule,nDeleteRule)); + pKeyProps->m_aKeyColumnNames.push_back(sForeignKeyColumn); _rNames.push_back(sFkName); + if ( m_pTables->hasByName(sReferencedName) ) + { + if ( !m_pImpl->m_xTablePropertyListener.is() ) + m_pImpl->m_xTablePropertyListener = ::comphelper::ImplementationReference< OTableContainerListener,XContainerListener>( new OTableContainerListener(this) ); + m_pTables->addContainerListener(m_pImpl->m_xTablePropertyListener.getRef()); + m_pImpl->m_xTablePropertyListener->add(sReferencedName); + } // if ( m_pTables->hasByName(sReferencedName) ) + sOldFKName = sFkName; + } // if ( sOldFKName != sFkName ) + else if ( pKeyProps.get() ) + { + pKeyProps->m_aKeyColumnNames.push_back(sForeignKeyColumn); } } - } + } // while( xResult->next() ) + if ( pKeyProps.get() ) + m_pImpl->m_aKeys.insert(TKeyMap::value_type(sOldFKName,pKeyProps)); ::comphelper::disposeComponent(xResult); } } // ------------------------------------------------------------------------- void OTableHelper::refreshKeys() { - m_aKeys.clear(); + m_pImpl->m_aKeys.clear(); TStringVector aNames; @@ -386,7 +496,7 @@ void SAL_CALL OTableHelper::rename( const ::rtl::OUString& newName ) throw(SQLEx sComposedName = ::dbtools::composeTableName(getMetaData(),sCatalog,sSchema,sTable,sal_True,::dbtools::eInDataManipulation); sSql += sComposedName; - Reference< XStatement > xStmt = m_xConnection->createStatement( ); + Reference< XStatement > xStmt = m_pImpl->m_xConnection->createStatement( ); if ( xStmt.is() ) { xStmt->execute(sSql); @@ -401,7 +511,7 @@ void SAL_CALL OTableHelper::rename( const ::rtl::OUString& newName ) throw(SQLEx // ----------------------------------------------------------------------------- Reference< XDatabaseMetaData> OTableHelper::getMetaData() const { - return m_xMetaData; + return m_pImpl->m_xMetaData; } // ------------------------------------------------------------------------- void SAL_CALL OTableHelper::alterColumnByIndex( sal_Int32 index, const Reference< XPropertySet >& descriptor ) throw(SQLException, ::com::sun::star::lang::IndexOutOfBoundsException, RuntimeException) @@ -441,8 +551,8 @@ void SAL_CALL OTableHelper::release() throw() sdbcx::TKeyProperties OTableHelper::getKeyProperties(const ::rtl::OUString& _sName) const { sdbcx::TKeyProperties pKeyProps; - TKeyMap::const_iterator aFind = m_aKeys.find(_sName); - if ( aFind != m_aKeys.end() ) + TKeyMap::const_iterator aFind = m_pImpl->m_aKeys.find(_sName); + if ( aFind != m_pImpl->m_aKeys.end() ) { pKeyProps = aFind->second; } @@ -457,7 +567,7 @@ sdbcx::TKeyProperties OTableHelper::getKeyProperties(const ::rtl::OUString& _sNa // ----------------------------------------------------------------------------- void OTableHelper::addKey(const ::rtl::OUString& _sName,const sdbcx::TKeyProperties& _aKeyProperties) { - m_aKeys.insert(TKeyMap::value_type(_sName,_aKeyProperties)); + m_pImpl->m_aKeys.insert(TKeyMap::value_type(_sName,_aKeyProperties)); } // ----------------------------------------------------------------------------- ::rtl::OUString OTableHelper::getTypeCreatePattern() const @@ -465,4 +575,7 @@ void OTableHelper::addKey(const ::rtl::OUString& _sName,const sdbcx::TKeyPropert return ::rtl::OUString(); } // ----------------------------------------------------------------------------- - +Reference< XConnection> OTableHelper::getConnection() const +{ + return m_pImpl->m_xConnection; +} diff --git a/connectivity/source/commontools/dbconversion.cxx b/connectivity/source/commontools/dbconversion.cxx index 47c6143e6507..2d620018c73f 100644 --- a/connectivity/source/commontools/dbconversion.cxx +++ b/connectivity/source/commontools/dbconversion.cxx @@ -99,9 +99,9 @@ namespace dbtools ::rtl::OUStringBuffer aTemp(toDateString(aDate)); aTemp.appendAscii(" "); Time aTime(0,_rDateTime.Seconds,_rDateTime.Minutes,_rDateTime.Hours); - aTemp.append(toTimeString(aTime)); + aTemp.append( toTimeString(aTime) ); aTemp.appendAscii("."); - aTemp.append(static_cast<sal_Int32>(_rDateTime.HundredthSeconds)); + aTemp.append( static_cast<sal_Int32>(_rDateTime.HundredthSeconds)); return aTemp.makeStringAndClear(); } //------------------------------------------------------------------------------ diff --git a/connectivity/source/commontools/dbmetadata.cxx b/connectivity/source/commontools/dbmetadata.cxx index 0d47cffce0ab..7eccb8e8463e 100644 --- a/connectivity/source/commontools/dbmetadata.cxx +++ b/connectivity/source/commontools/dbmetadata.cxx @@ -157,10 +157,9 @@ namespace dbtools const DatabaseMetaData_Impl& _metaData, ::boost::optional< ::rtl::OUString >& _cachedSetting, ::rtl::OUString (SAL_CALL XDatabaseMetaData::*_getter)() ) { - lcl_checkConnected( _metaData ); - if ( !_cachedSetting ) { + lcl_checkConnected( _metaData ); try { _cachedSetting.reset( (_metaData.xConnectionMetaData.get()->*_getter)() ); diff --git a/connectivity/source/commontools/dbtools.cxx b/connectivity/source/commontools/dbtools.cxx index 5bd8c93cb639..02e6e420142f 100644 --- a/connectivity/source/commontools/dbtools.cxx +++ b/connectivity/source/commontools/dbtools.cxx @@ -842,9 +842,8 @@ static ::rtl::OUString impl_doComposeTableName( const Reference< XDatabaseMetaDa return ::rtl::OUString(); OSL_ENSURE(_rName.getLength(), "impl_doComposeTableName : at least the name should be non-empty !"); - ::rtl::OUString sQuoteString = _rxMetaData->getIdentifierQuoteString(); - - NameComponentSupport aNameComps( lcl_getNameComponentSupport( _rxMetaData, _eComposeRule ) ); + const ::rtl::OUString sQuoteString = _rxMetaData->getIdentifierQuoteString(); + const NameComponentSupport aNameComps( lcl_getNameComponentSupport( _rxMetaData, _eComposeRule ) ); ::rtl::OUStringBuffer aComposedName; diff --git a/connectivity/source/commontools/dbtools2.cxx b/connectivity/source/commontools/dbtools2.cxx index 1e1fa87cc58e..e08c3a33076d 100644 --- a/connectivity/source/commontools/dbtools2.cxx +++ b/connectivity/source/commontools/dbtools2.cxx @@ -384,7 +384,7 @@ namespace } namespace { - Reference<XPropertySet> lcl_createSDBCXColumn( + Reference<XPropertySet> lcl_createSDBCXColumn(const Reference<XNameAccess>& _xPrimaryKeyColumns, const Reference<XConnection>& _xConnection, const Any& _aCatalog, const ::rtl::OUString& _aSchema, @@ -424,8 +424,7 @@ namespace const ::rtl::OUString sQuote = xMetaData->getIdentifierQuoteString(); ::rtl::OUString sQuotedName = ::dbtools::quoteName(sQuote,_rName); ::rtl::OUString sComposedName; - sComposedName = composeTableNameForSelect( - _xConnection, getString( _aCatalog ), _aSchema, _aTable ); + sComposedName = composeTableNameForSelect(_xConnection, getString( _aCatalog ), _aSchema, _aTable ); ColumnInformationMap aInfo(_bCase); collectColumnInformation(_xConnection,sComposedName,sQuotedName,aInfo); @@ -445,11 +444,19 @@ namespace { try { - Reference< XResultSet > xPKeys = xMetaData->getPrimaryKeys( _aCatalog, _aSchema, _aTable ); - Reference< XRow > xPKeyRow( xPKeys, UNO_QUERY_THROW ); - while( xPKeys->next() ) // there can be only one primary key + if ( _xPrimaryKeyColumns.is() ) + { + if ( _xPrimaryKeyColumns->hasByName(_rName) ) + nField11 = ColumnValue::NO_NULLS; + + } + else + { + Reference< XResultSet > xPKeys = xMetaData->getPrimaryKeys( _aCatalog, _aSchema, _aTable ); + Reference< XRow > xPKeyRow( xPKeys, UNO_QUERY_THROW ); + while( xPKeys->next() ) // there can be only one primary key { - ::rtl::OUString sKeyColumn = xPKeyRow->getString(4); + ::rtl::OUString sKeyColumn = xPKeyRow->getString(4); if ( aMixCompare(_rName,sKeyColumn) ) { nField11 = ColumnValue::NO_NULLS; @@ -457,6 +464,7 @@ namespace } } } + } catch(SQLException&) { OSL_ENSURE( false, "lcl_createSDBCXColumn: caught an exception!" ); @@ -521,10 +529,33 @@ Reference<XPropertySet> createSDBCXColumn(const Reference<XPropertySet>& _xTable _xTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_SCHEMANAME)) >>= aSchema; _xTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)) >>= aTable; - xProp = lcl_createSDBCXColumn(_xConnection,aCatalog, aSchema, aTable, _rName,_rName,_bCase,_bQueryForInfo,_bIsAutoIncrement,_bIsCurrency,_nDataType); + Reference<XKeysSupplier> xKeysSup(_xTable,UNO_QUERY); + Reference<XNameAccess> xPrimaryKeyColumns; + if ( xKeysSup.is() ) + { + const Reference<XIndexAccess> xKeys = xKeysSup->getKeys(); + if ( xKeys.is() ) + { + const sal_Int32 nKeyCount = xKeys->getCount(); + for(sal_Int32 nKeyIter = 0; nKeyIter < nKeyCount;++nKeyIter) + { + const Reference<XPropertySet> xKey(xKeys->getByIndex(nKeyIter),UNO_QUERY_THROW); + sal_Int32 nType = 0; + xKey->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_TYPE)) >>= nType; + if ( nType == KeyType::PRIMARY ) + { + const Reference<XColumnsSupplier> xColS(xKey,UNO_QUERY_THROW); + xPrimaryKeyColumns = xColS->getColumns(); + break; + } + } // for(sal_Int32 nKeyIter = 0; nKeyIter < nKeyCount;++) + } + } + + xProp = lcl_createSDBCXColumn(xPrimaryKeyColumns,_xConnection,aCatalog, aSchema, aTable, _rName,_rName,_bCase,_bQueryForInfo,_bIsAutoIncrement,_bIsCurrency,_nDataType); if ( !xProp.is() ) { - xProp = lcl_createSDBCXColumn(_xConnection,aCatalog, aSchema, aTable, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")),_rName,_bCase,_bQueryForInfo,_bIsAutoIncrement,_bIsCurrency,_nDataType); + xProp = lcl_createSDBCXColumn(xPrimaryKeyColumns,_xConnection,aCatalog, aSchema, aTable, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")),_rName,_bCase,_bQueryForInfo,_bIsAutoIncrement,_bIsCurrency,_nDataType); if ( !xProp.is() ) xProp = new connectivity::sdbcx::OColumn(_rName, ::rtl::OUString(),::rtl::OUString(), diff --git a/connectivity/source/commontools/parameters.cxx b/connectivity/source/commontools/parameters.cxx index b2a093753804..ae55ad3f2680 100644 --- a/connectivity/source/commontools/parameters.cxx +++ b/connectivity/source/commontools/parameters.cxx @@ -118,7 +118,7 @@ namespace dbtools //-------------------------------------------------------------------- void ParameterManager::clearAllParameterInformation() { - m_xInnerParamColumns = NULL; + m_xInnerParamColumns.clear(); if ( m_pOuterParameters.is() ) m_pOuterParameters->dispose(); m_pOuterParameters = NULL; |