| /************************************************************** |
| * |
| * 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/AColumn.hxx" |
| #include "ado/AConnection.hxx" |
| #include "ado/Awrapado.hxx" |
| #include <cppuhelper/typeprovider.hxx> |
| #include <comphelper/sequence.hxx> |
| #include <com/sun/star/sdbc/ColumnValue.hpp> |
| #include <comphelper/extract.hxx> |
| #include <comphelper/types.hxx> |
| #include "ado/ACatalog.hxx" |
| |
| using namespace ::comphelper; |
| |
| 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; |
| |
| void WpADOColumn::Create() |
| { |
| HRESULT hr = -1; |
| |
| _ADOColumn* pColumn = NULL; |
| hr = CoCreateInstance(ADOS::CLSID_ADOCOLUMN_25, |
| NULL, |
| CLSCTX_INPROC_SERVER, |
| ADOS::IID_ADOCOLUMN_25, |
| (void**)&pColumn ); |
| |
| |
| if( !FAILED( hr ) ) |
| { |
| operator=( pColumn ); |
| pColumn->Release( ); |
| } |
| } |
| // ------------------------------------------------------------------------- |
| OAdoColumn::OAdoColumn(sal_Bool _bCase,OConnection* _pConnection,_ADOColumn* _pColumn) |
| : connectivity::sdbcx::OColumn(::rtl::OUString(),::rtl::OUString(),::rtl::OUString(),::rtl::OUString(),0,0,0,0,sal_False,sal_False,sal_False,_bCase) |
| ,m_pConnection(_pConnection) |
| { |
| construct(); |
| OSL_ENSURE(_pColumn,"Column can not be null!"); |
| m_aColumn = WpADOColumn(_pColumn); |
| // m_aColumn.put_ParentCatalog(_pConnection->getAdoCatalog()->getCatalog()); |
| fillPropertyValues(); |
| } |
| // ------------------------------------------------------------------------- |
| OAdoColumn::OAdoColumn(sal_Bool _bCase,OConnection* _pConnection) |
| : connectivity::sdbcx::OColumn(_bCase) |
| ,m_pConnection(_pConnection) |
| { |
| m_aColumn.Create(); |
| m_aColumn.put_ParentCatalog(_pConnection->getAdoCatalog()->getCatalog()); |
| construct(); |
| fillPropertyValues(); |
| m_Type = DataType::OTHER; |
| } |
| |
| //-------------------------------------------------------------------------- |
| Sequence< sal_Int8 > OAdoColumn::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 OAdoColumn::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 ) |
| : OColumn_ADO::getSomething(rId); |
| } |
| // ------------------------------------------------------------------------- |
| void OAdoColumn::construct() |
| { |
| sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY; |
| |
| registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISASCENDING), PROPERTY_ID_ISASCENDING, nAttrib,&m_IsAscending, ::getBooleanCppuType()); |
| registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RELATEDCOLUMN), PROPERTY_ID_RELATEDCOLUMN, nAttrib,&m_ReferencedColumn, ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL))); |
| } |
| // ----------------------------------------------------------------------------- |
| void OAdoColumn::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue)throw (Exception) |
| { |
| if(m_aColumn.IsValid()) |
| { |
| const sal_Char* pAdoPropertyName = NULL; |
| |
| switch(nHandle) |
| { |
| case PROPERTY_ID_ISASCENDING: |
| m_aColumn.put_SortOrder(::cppu::any2bool(rValue) ? adSortAscending : adSortDescending); |
| break; |
| case PROPERTY_ID_RELATEDCOLUMN: |
| { |
| ::rtl::OUString aVal; |
| rValue >>= aVal; |
| m_aColumn.put_RelatedColumn(aVal); |
| } |
| break; |
| case PROPERTY_ID_NAME: |
| { |
| ::rtl::OUString aVal; |
| rValue >>= aVal; |
| m_aColumn.put_Name(aVal); |
| } |
| break; |
| case PROPERTY_ID_TYPE: |
| { |
| sal_Int32 nVal=0; |
| rValue >>= nVal; |
| m_aColumn.put_Type(ADOS::MapJdbc2ADOType(nVal,m_pConnection->getEngineType())); |
| } |
| break; |
| case PROPERTY_ID_TYPENAME: |
| // rValue <<= m_pTable->getCatalog()->getConnection()->getTypeInfo()->find(); |
| break; |
| case PROPERTY_ID_PRECISION: |
| { |
| sal_Int32 nVal=0; |
| rValue >>= nVal; |
| m_aColumn.put_Precision(nVal); |
| } |
| break; |
| case PROPERTY_ID_SCALE: |
| { |
| sal_Int32 nVal=0; |
| rValue >>= nVal; |
| if ( !m_IsCurrency ) |
| m_aColumn.put_NumericScale((sal_Int8)nVal); |
| } |
| break; |
| case PROPERTY_ID_ISNULLABLE: |
| { |
| sal_Int32 nVal=0; |
| rValue >>= nVal; |
| if ( nVal == ColumnValue::NULLABLE ) |
| m_aColumn.put_Attributes( adColNullable ); |
| } |
| break; |
| case PROPERTY_ID_ISROWVERSION: |
| break; |
| |
| case PROPERTY_ID_ISAUTOINCREMENT: |
| OTools::putValue( m_aColumn.get_Properties(), ::rtl::OUString::createFromAscii( "Autoincrement" ), getBOOL( rValue ) ); |
| break; |
| |
| case PROPERTY_ID_IM001: |
| case PROPERTY_ID_DESCRIPTION: |
| pAdoPropertyName = "Description"; |
| break; |
| |
| case PROPERTY_ID_DEFAULTVALUE: |
| pAdoPropertyName = "Default"; |
| break; |
| } |
| |
| if ( pAdoPropertyName ) |
| OTools::putValue( m_aColumn.get_Properties(), ::rtl::OUString::createFromAscii( pAdoPropertyName ), getString( rValue ) ); |
| } |
| OColumn_ADO::setFastPropertyValue_NoBroadcast(nHandle,rValue); |
| } |
| // ----------------------------------------------------------------------------- |
| void OAdoColumn::fillPropertyValues() |
| { |
| if(m_aColumn.IsValid()) |
| { |
| m_IsAscending = m_aColumn.get_SortOrder() == adSortAscending; |
| m_ReferencedColumn = m_aColumn.get_RelatedColumn(); |
| m_Name = m_aColumn.get_Name(); |
| m_Precision = m_aColumn.get_Precision(); |
| m_Scale = m_aColumn.get_NumericScale(); |
| m_IsNullable = ((m_aColumn.get_Attributes() & adColNullable) == adColNullable) ? ColumnValue::NULLABLE : ColumnValue::NO_NULLS; |
| |
| DataTypeEnum eType = m_aColumn.get_Type(); |
| m_IsCurrency = (eType == adCurrency); |
| if ( m_IsCurrency && !m_Scale) |
| m_Scale = 4; |
| m_Type = ADOS::MapADOType2Jdbc(eType); |
| |
| sal_Bool bForceTo = sal_True; |
| const OTypeInfoMap* pTypeInfoMap = m_pConnection->getTypeInfo(); |
| const OExtendedTypeInfo* pTypeInfo = OConnection::getTypeInfoFromType(*m_pConnection->getTypeInfo(),eType,::rtl::OUString(),m_Precision,m_Scale,bForceTo); |
| if ( pTypeInfo ) |
| m_TypeName = pTypeInfo->aSimpleType.aTypeName; |
| else if ( eType == adVarBinary && ADOS::isJetEngine(m_pConnection->getEngineType()) ) |
| { |
| ::comphelper::TStringMixEqualFunctor aCase(sal_False); |
| OTypeInfoMap::const_iterator aFind = ::std::find_if(pTypeInfoMap->begin(), |
| pTypeInfoMap->end(), |
| ::std::compose1( |
| ::std::bind2nd(aCase, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VarBinary"))), |
| ::std::compose1( |
| ::std::mem_fun(&OExtendedTypeInfo::getDBName), |
| ::std::select2nd<OTypeInfoMap::value_type>()) |
| ) |
| |
| ); |
| |
| if ( aFind != pTypeInfoMap->end() ) // change column type if necessary |
| { |
| eType = aFind->first; |
| pTypeInfo = aFind->second; |
| } |
| |
| if ( !pTypeInfo ) |
| { |
| pTypeInfo = OConnection::getTypeInfoFromType(*m_pConnection->getTypeInfo(),adBinary,::rtl::OUString(),m_Precision,m_Scale,bForceTo); |
| eType = adBinary; |
| } |
| |
| if ( pTypeInfo ) |
| { |
| m_TypeName = pTypeInfo->aSimpleType.aTypeName; |
| m_Type = ADOS::MapADOType2Jdbc(eType); |
| } |
| } |
| |
| |
| // fill some specific props |
| { |
| WpADOProperties aProps( m_aColumn.get_Properties() ); |
| |
| if ( aProps.IsValid() ) |
| { |
| m_IsAutoIncrement = OTools::getValue( aProps, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Autoincrement")) ); |
| |
| m_Description = OTools::getValue( aProps, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Description")) ); |
| |
| m_DefaultValue = OTools::getValue( aProps, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Default")) ); |
| |
| #if OSL_DEBUG_LEVEL > 0 |
| sal_Int32 nCount = aProps.GetItemCount(); |
| for (sal_Int32 i = 0; i<nCount; ++i) |
| { |
| WpADOProperty aProp = aProps.GetItem(i); |
| ::rtl::OUString sName = aProp.GetName(); |
| ::rtl::OUString sVal = aProp.GetValue(); |
| } |
| #endif |
| } |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| WpADOColumn OAdoColumn::getColumnImpl() const |
| { |
| return m_aColumn; |
| } |
| // ----------------------------------------------------------------------------- |
| // ----------------------------------------------------------------------------- |
| void SAL_CALL OAdoColumn::acquire() throw() |
| { |
| OColumn_ADO::acquire(); |
| } |
| // ----------------------------------------------------------------------------- |
| void SAL_CALL OAdoColumn::release() throw() |
| { |
| OColumn_ADO::release(); |
| } |
| // ----------------------------------------------------------------------------- |
| |
| |
| |