| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_connectivity.hxx" |
| #include "ado/ATable.hxx" |
| #include "ado/AIndexes.hxx" |
| #include "ado/AColumns.hxx" |
| #include "ado/AColumn.hxx" |
| #include "ado/AKeys.hxx" |
| #include "ado/AConnection.hxx" |
| #include <com/sun/star/sdbc/XRow.hpp> |
| #include <com/sun/star/sdbc/XResultSet.hpp> |
| #include <com/sun/star/sdbcx/KeyType.hpp> |
| #include <com/sun/star/sdbc/KeyRule.hpp> |
| #include <cppuhelper/typeprovider.hxx> |
| #include <com/sun/star/lang/DisposedException.hpp> |
| #include <com/sun/star/sdbc/ColumnValue.hpp> |
| #include "ado/Awrapado.hxx" |
| #include <comphelper/sequence.hxx> |
| #include "TConnection.hxx" |
| #include <comphelper/types.hxx> |
| |
| using namespace ::comphelper; |
| |
| using namespace connectivity; |
| using namespace connectivity::ado; |
| using namespace com::sun::star::uno; |
| using namespace com::sun::star::lang; |
| using namespace com::sun::star::beans; |
| using namespace com::sun::star::sdbc; |
| using namespace com::sun::star::container; |
| using namespace com::sun::star::lang; |
| |
| // ------------------------------------------------------------------------- |
| OAdoTable::OAdoTable(sdbcx::OCollection* _pTables,sal_Bool _bCase,OCatalog* _pCatalog,_ADOTable* _pTable) |
| : OTable_TYPEDEF(_pTables,_bCase,::rtl::OUString(),::rtl::OUString()) |
| ,m_pCatalog(_pCatalog) |
| { |
| construct(); |
| m_aTable = WpADOTable(_pTable); |
| // m_aTable.putref_ParentCatalog(_pCatalog->getCatalog()); |
| fillPropertyValues(); |
| |
| } |
| // ----------------------------------------------------------------------------- |
| OAdoTable::OAdoTable(sdbcx::OCollection* _pTables,sal_Bool _bCase,OCatalog* _pCatalog) |
| : OTable_TYPEDEF(_pTables,_bCase) |
| ,m_pCatalog(_pCatalog) |
| { |
| construct(); |
| m_aTable.Create(); |
| m_aTable.putref_ParentCatalog(_pCatalog->getCatalog()); |
| |
| } |
| // ----------------------------------------------------------------------------- |
| void SAL_CALL OAdoTable::disposing(void) |
| { |
| OTable_TYPEDEF::disposing(); |
| m_aTable.clear(); |
| } |
| // ------------------------------------------------------------------------- |
| void OAdoTable::refreshColumns() |
| { |
| TStringVector aVector; |
| |
| WpADOColumns aColumns; |
| if ( m_aTable.IsValid() ) |
| { |
| aColumns = m_aTable.get_Columns(); |
| aColumns.fillElementNames(aVector); |
| } |
| |
| if(m_pColumns) |
| m_pColumns->reFill(aVector); |
| else |
| m_pColumns = new OColumns(*this,m_aMutex,aVector,aColumns,isCaseSensitive(),m_pCatalog->getConnection()); |
| } |
| // ------------------------------------------------------------------------- |
| void OAdoTable::refreshKeys() |
| { |
| TStringVector aVector; |
| |
| WpADOKeys aKeys; |
| if(m_aTable.IsValid()) |
| { |
| aKeys = m_aTable.get_Keys(); |
| aKeys.fillElementNames(aVector); |
| } |
| |
| if(m_pKeys) |
| m_pKeys->reFill(aVector); |
| else |
| m_pKeys = new OKeys(*this,m_aMutex,aVector,aKeys,isCaseSensitive(),m_pCatalog->getConnection()); |
| } |
| // ------------------------------------------------------------------------- |
| void OAdoTable::refreshIndexes() |
| { |
| TStringVector aVector; |
| |
| WpADOIndexes aIndexes; |
| if(m_aTable.IsValid()) |
| { |
| aIndexes = m_aTable.get_Indexes(); |
| aIndexes.fillElementNames(aVector); |
| } |
| |
| if(m_pIndexes) |
| m_pIndexes->reFill(aVector); |
| else |
| m_pIndexes = new OIndexes(*this,m_aMutex,aVector,aIndexes,isCaseSensitive(),m_pCatalog->getConnection()); |
| } |
| //-------------------------------------------------------------------------- |
| Sequence< sal_Int8 > OAdoTable::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(); |
| } |
| |
| // com::sun::star::lang::XUnoTunnel |
| //------------------------------------------------------------------ |
| sal_Int64 OAdoTable::getSomething( const Sequence< sal_Int8 > & rId ) throw (RuntimeException) |
| { |
| return (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) |
| ? reinterpret_cast< sal_Int64 >( this ) |
| : OTable_TYPEDEF::getSomething(rId); |
| } |
| // ------------------------------------------------------------------------- |
| // XRename |
| void SAL_CALL OAdoTable::rename( const ::rtl::OUString& newName ) throw(SQLException, ElementExistException, RuntimeException) |
| { |
| ::osl::MutexGuard aGuard(m_aMutex); |
| checkDisposed(OTableDescriptor_BASE_TYPEDEF::rBHelper.bDisposed); |
| |
| m_aTable.put_Name(newName); |
| ADOS::ThrowException(*(m_pCatalog->getConnection()->getConnection()),*this); |
| |
| OTable_TYPEDEF::rename(newName); |
| } |
| // ----------------------------------------------------------------------------- |
| Reference< XDatabaseMetaData> OAdoTable::getMetaData() const |
| { |
| return m_pCatalog->getConnection()->getMetaData(); |
| } |
| // ------------------------------------------------------------------------- |
| // XAlterTable |
| void SAL_CALL OAdoTable::alterColumnByName( const ::rtl::OUString& colName, const Reference< XPropertySet >& descriptor ) throw(SQLException, NoSuchElementException, RuntimeException) |
| { |
| ::osl::MutexGuard aGuard(m_aMutex); |
| checkDisposed(OTableDescriptor_BASE_TYPEDEF::rBHelper.bDisposed); |
| |
| sal_Bool bError = sal_True; |
| OAdoColumn* pColumn = NULL; |
| if(::comphelper::getImplementation(pColumn,descriptor) && pColumn != NULL) |
| { |
| WpADOColumns aColumns = m_aTable.get_Columns(); |
| bError = !aColumns.Delete(colName); |
| bError = bError || !aColumns.Append(pColumn->getColumnImpl()); |
| } |
| if(bError) |
| ADOS::ThrowException(*(m_pCatalog->getConnection()->getConnection()),*this); |
| |
| m_pColumns->refresh(); |
| refreshColumns(); |
| } |
| // ------------------------------------------------------------------------- |
| void SAL_CALL OAdoTable::alterColumnByIndex( sal_Int32 index, const Reference< XPropertySet >& descriptor ) throw(SQLException, ::com::sun::star::lang::IndexOutOfBoundsException, RuntimeException) |
| { |
| ::osl::MutexGuard aGuard(m_aMutex); |
| checkDisposed(OTableDescriptor_BASE_TYPEDEF::rBHelper.bDisposed); |
| |
| Reference< XPropertySet > xOld; |
| m_pColumns->getByIndex(index) >>= xOld; |
| if(xOld.is()) |
| alterColumnByName(getString(xOld->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))),descriptor); |
| } |
| // ------------------------------------------------------------------------- |
| void OAdoTable::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue)throw (Exception) |
| { |
| if(m_aTable.IsValid()) |
| { |
| switch(nHandle) |
| { |
| case PROPERTY_ID_NAME: |
| m_aTable.put_Name(getString(rValue)); |
| break; |
| |
| case PROPERTY_ID_TYPE: |
| OTools::putValue( m_aTable.get_Properties(), |
| OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE), |
| getString(rValue)); |
| break; |
| |
| case PROPERTY_ID_DESCRIPTION: |
| OTools::putValue( m_aTable.get_Properties(), |
| ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Description")), |
| getString(rValue)); |
| break; |
| |
| case PROPERTY_ID_SCHEMANAME: |
| break; |
| |
| default: |
| throw Exception(); |
| } |
| } |
| OTable_TYPEDEF::setFastPropertyValue_NoBroadcast(nHandle,rValue); |
| } |
| // ------------------------------------------------------------------------- |
| void SAL_CALL OAdoTable::acquire() throw() |
| { |
| OTable_TYPEDEF::acquire(); |
| } |
| // ----------------------------------------------------------------------------- |
| void SAL_CALL OAdoTable::release() throw() |
| { |
| OTable_TYPEDEF::release(); |
| } |
| // ----------------------------------------------------------------------------- |
| ::rtl::OUString SAL_CALL OAdoTable::getName() throw(::com::sun::star::uno::RuntimeException) |
| { |
| return m_aTable.get_Name(); |
| } |
| |