/**************************************************************
 *
 * 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 <comphelper/sequence.hxx>
#include "ado/ADatabaseMetaDataResultSet.hxx"
#include "ado/ADatabaseMetaDataResultSetMetaData.hxx"
#include <com/sun/star/sdbc/DataType.hpp>
#include <com/sun/star/sdbc/ColumnValue.hpp>
#include <com/sun/star/sdbc/KeyRule.hpp>
#include <com/sun/star/sdbc/ProcedureResult.hpp>
#include <com/sun/star/sdbc/IndexType.hpp>
#include <comphelper/property.hxx>
#include <com/sun/star/lang/DisposedException.hpp>
#include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
#include <com/sun/star/sdbc/ResultSetType.hpp>
#include <com/sun/star/sdbc/FetchDirection.hpp>
#include <cppuhelper/typeprovider.hxx>
#include <comphelper/seqstream.hxx>
#include "connectivity/dbexception.hxx"


#include <oledb.h>

using namespace dbtools;
using namespace connectivity::ado;
using namespace cppu;
using namespace ::comphelper;
//------------------------------------------------------------------------------
using namespace ::com::sun::star::lang;
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
using namespace com::sun::star::beans;
using namespace com::sun::star::sdbc;

// -------------------------------------------------------------------------
ODatabaseMetaDataResultSet::ODatabaseMetaDataResultSet(ADORecordset* _pRecordSet)
	:ODatabaseMetaDataResultSet_BASE(m_aMutex)
	,OPropertySetHelper(ODatabaseMetaDataResultSet_BASE::rBHelper)
	,m_aStatement(NULL)
	,m_xMetaData(NULL)
	,m_pRecordSet(_pRecordSet)
	,m_bEOF(sal_False)
{
	osl_incrementInterlockedCount( &m_refCount );
	m_aColMapping.push_back(-1);
	if(_pRecordSet)
	{
		m_pRecordSet->AddRef();
		VARIANT_BOOL bIsAtBOF;
		m_pRecordSet->get_BOF(&bIsAtBOF);
		m_bOnFirstAfterOpen = bIsAtBOF != VARIANT_TRUE;
	}
	else
		m_bOnFirstAfterOpen = sal_False;
	osl_decrementInterlockedCount( &m_refCount );
	//	allocBuffer();
}

// -------------------------------------------------------------------------
ODatabaseMetaDataResultSet::~ODatabaseMetaDataResultSet()
{
	if(m_pRecordSet)
		m_pRecordSet->Release();
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::disposing(void)
{
	OPropertySetHelper::disposing();

	::osl::MutexGuard aGuard(m_aMutex);
	if(m_pRecordSet)
		m_pRecordSet->Close();
	m_aStatement	= NULL;
m_xMetaData.clear();
}
// -------------------------------------------------------------------------
Any SAL_CALL ODatabaseMetaDataResultSet::queryInterface( const Type & rType ) throw(RuntimeException)
{
	Any aRet = OPropertySetHelper::queryInterface(rType);
	return aRet.hasValue() ? aRet : ODatabaseMetaDataResultSet_BASE::queryInterface(rType);
}
// -------------------------------------------------------------------------
::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL ODatabaseMetaDataResultSet::getTypes(  ) throw(::com::sun::star::uno::RuntimeException)
{
	::cppu::OTypeCollection aTypes(	::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet > *)0 ),
									::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XFastPropertySet > *)0 ),
									::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > *)0 ));

	return ::comphelper::concatSequences(aTypes.getTypes(),ODatabaseMetaDataResultSet_BASE::getTypes());
}
// -----------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::checkRecordSet() throw(SQLException)
{
	if(!m_pRecordSet)
		throwFunctionSequenceException(*this);
}
// -------------------------------------------------------------------------

sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::findColumn( const ::rtl::OUString& columnName ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed );


	Reference< XResultSetMetaData > xMeta = getMetaData();
	sal_Int32 nLen = xMeta->getColumnCount();
	sal_Int32 i = 1;
	for(;i<=nLen;++i)
		if(xMeta->isCaseSensitive(i) ? columnName == xMeta->getColumnName(i) :
			columnName.equalsIgnoreAsciiCase(xMeta->getColumnName(i)))
			break;
	return i;
}
#define BLOCK_SIZE 256
// -------------------------------------------------------------------------
Reference< ::com::sun::star::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getBinaryStream( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	columnIndex = mapColumn(columnIndex);
	WpADOField aField = ADOS::getField(m_pRecordSet,columnIndex);
	if((aField.GetAttributes() & adFldLong) == adFldLong)
	{
		//Copy the data only up to the Actual Size of Field.
		sal_Int32 nSize = aField.GetActualSize();
		Sequence<sal_Int8> aData(nSize);
		long index = 0;
		while(index < nSize)
		{
			m_aValue = aField.GetChunk(BLOCK_SIZE);
			if(m_aValue.isNull())
				break;
			UCHAR chData;
			for(long index2 = 0;index2 < BLOCK_SIZE;++index2)
			{
				HRESULT hr = ::SafeArrayGetElement(m_aValue.parray,&index2,&chData);
				if(SUCCEEDED(hr))
				{
					//Take BYTE by BYTE and advance Memory Location
					aData.getArray()[index++] = chData;
				}
				else
					break;
			}
		}
		return index ? Reference< ::com::sun::star::io::XInputStream >(new SequenceInputStream(aData)) : Reference< ::com::sun::star::io::XInputStream >();
	}
	// else we ask for a bytesequence
	aField.get_Value(m_aValue);
	if(m_aValue.isNull())
		return NULL;
	return new SequenceInputStream(m_aValue);
}
// -------------------------------------------------------------------------
Reference< ::com::sun::star::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getCharacterStream( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
{
    ::dbtools::throwFeatureNotImplementedException( "XRow::getCharacterStream", *this );
	return NULL;
}

// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSet::getBoolean( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );

	if ( !m_aValueRange.empty()  && columnIndex == 11 && (m_aValueRangeIter = m_aValueRange.find(columnIndex)) != m_aValueRange.end() )
	{
		getValue(2);
		if ( static_cast<sal_Int16>(m_aValue) != adCurrency )
			return sal_False;
	}
	return getValue(columnIndex);
}
// -------------------------------------------------------------------------

sal_Int8 SAL_CALL ODatabaseMetaDataResultSet::getByte( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );

	getValue(columnIndex);

	columnIndex = mapColumn(columnIndex);

	if(m_aValue.isNull())
		return 0;
	if ( !m_aValueRange.empty() && (m_aValueRangeIter = m_aValueRange.find(columnIndex)) != m_aValueRange.end())
		return (sal_Int8)(*m_aValueRangeIter).second[(sal_Int32)m_aValue];
	else if(m_aStrValueRange.size() && (m_aStrValueRangeIter = m_aStrValueRange.find(columnIndex)) != m_aStrValueRange.end())
		return (sal_Int8)(*m_aStrValueRangeIter).second[m_aValue];

	return m_aValue;
}
// -------------------------------------------------------------------------

Sequence< sal_Int8 > SAL_CALL ODatabaseMetaDataResultSet::getBytes( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	return getValue(columnIndex);
}
// -------------------------------------------------------------------------

::com::sun::star::util::Date SAL_CALL ODatabaseMetaDataResultSet::getDate( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	return getValue(columnIndex);
}
// -------------------------------------------------------------------------

double SAL_CALL ODatabaseMetaDataResultSet::getDouble( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	return getValue(columnIndex);
}
// -------------------------------------------------------------------------

float SAL_CALL ODatabaseMetaDataResultSet::getFloat( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	return getValue(columnIndex);
}
// -------------------------------------------------------------------------

sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::getInt( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );


	getValue(columnIndex);

	columnIndex = mapColumn(columnIndex);
	if(m_aValue.isNull())
		return 0;

	if(m_aValueRange.size() && (m_aValueRangeIter = m_aValueRange.find(columnIndex)) != m_aValueRange.end())
		return (*m_aValueRangeIter).second[(sal_Int32)m_aValue];
	else if(m_aStrValueRange.size() && (m_aStrValueRangeIter = m_aStrValueRange.find(columnIndex)) != m_aStrValueRange.end())
		return (*m_aStrValueRangeIter).second[m_aValue];

	return m_aValue;
}
// -------------------------------------------------------------------------

sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::getRow(  ) throw(SQLException, RuntimeException)
{
    ::dbtools::throwFeatureNotImplementedException( "XResultSet::getRow", *this );
	return 0;
}
// -------------------------------------------------------------------------

sal_Int64 SAL_CALL ODatabaseMetaDataResultSet::getLong( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
{
    ::dbtools::throwFeatureNotImplementedException( "XRow::getLong", *this );
	return sal_Int64(0);
}
// -------------------------------------------------------------------------

Reference< XResultSetMetaData > SAL_CALL ODatabaseMetaDataResultSet::getMetaData(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	if(!m_xMetaData.is())
		m_xMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);

	return m_xMetaData;
}
// -------------------------------------------------------------------------
Reference< XArray > SAL_CALL ODatabaseMetaDataResultSet::getArray( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
{
    ::dbtools::throwFeatureNotImplementedException( "XRow::getRow", *this );
	return NULL;
}

// -------------------------------------------------------------------------

Reference< XClob > SAL_CALL ODatabaseMetaDataResultSet::getClob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
{
    ::dbtools::throwFeatureNotImplementedException( "XRow::getRow", *this );
	return NULL;
}
// -------------------------------------------------------------------------
Reference< XBlob > SAL_CALL ODatabaseMetaDataResultSet::getBlob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
{
    ::dbtools::throwFeatureNotImplementedException( "XRow::getRow", *this );
	return NULL;
}
// -------------------------------------------------------------------------

Reference< XRef > SAL_CALL ODatabaseMetaDataResultSet::getRef( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
{
    ::dbtools::throwFeatureNotImplementedException( "XRow::getRow", *this );
	return NULL;
}
// -------------------------------------------------------------------------

Any SAL_CALL ODatabaseMetaDataResultSet::getObject( sal_Int32 columnIndex, const Reference< ::com::sun::star::container::XNameAccess >& /*typeMap*/ ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	columnIndex = mapColumn(columnIndex);
	return Any();
}
// -------------------------------------------------------------------------

sal_Int16 SAL_CALL ODatabaseMetaDataResultSet::getShort( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );

	getValue(columnIndex);

	columnIndex = mapColumn(columnIndex);
	if(m_aValue.isNull())
		return 0;

	if(m_aValueRange.size() && (m_aValueRangeIter = m_aValueRange.find(columnIndex)) != m_aValueRange.end())
		return (sal_Int16)(*m_aValueRangeIter).second[(sal_Int32)m_aValue];
	else if(m_aStrValueRange.size() && (m_aStrValueRangeIter = m_aStrValueRange.find(columnIndex)) != m_aStrValueRange.end())
		return (sal_Int16)(*m_aStrValueRangeIter).second[m_aValue];

	return m_aValue;
}
// -------------------------------------------------------------------------

::rtl::OUString SAL_CALL ODatabaseMetaDataResultSet::getString( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );

	getValue(columnIndex);


	columnIndex = mapColumn(columnIndex);
	if(m_aValue.isNull())
		return ::rtl::OUString();
	if(m_aIntValueRange.size() && (m_aIntValueRangeIter = m_aIntValueRange.find(columnIndex)) != m_aIntValueRange.end())
		return (*m_aIntValueRangeIter).second[m_aValue];

	return m_aValue;
}

// -------------------------------------------------------------------------


::com::sun::star::util::Time SAL_CALL ODatabaseMetaDataResultSet::getTime( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	return getValue(columnIndex);
}
// -------------------------------------------------------------------------


::com::sun::star::util::DateTime SAL_CALL ODatabaseMetaDataResultSet::getTimestamp( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	return getValue(columnIndex);
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isAfterLast(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	VARIANT_BOOL bIsAtEOF;
	m_pRecordSet->get_EOF(&bIsAtEOF);
	return bIsAtEOF == VARIANT_TRUE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isFirst(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	return m_nRowPos == 1;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isLast(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	return sal_True;
}
// -------------------------------------------------------------------------
void SAL_CALL ODatabaseMetaDataResultSet::beforeFirst(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	if(first())
		previous();
}
// -------------------------------------------------------------------------
void SAL_CALL ODatabaseMetaDataResultSet::afterLast(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	if(last())
		next();
	m_bEOF = sal_True;
}
// -------------------------------------------------------------------------

void SAL_CALL ODatabaseMetaDataResultSet::close(  ) throw(SQLException, RuntimeException)
{
	{
		::osl::MutexGuard aGuard( m_aMutex );
		checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	}
	dispose();
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSet::first(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);


	if(!m_pRecordSet)
		return sal_False;

    sal_Bool bRet = SUCCEEDED(m_pRecordSet->MoveFirst());
	if ( bRet )
		m_nRowPos = 1;
	return bRet;
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSet::last(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed );


	return m_pRecordSet && SUCCEEDED(m_pRecordSet->MoveLast()) ? sal_True : sal_False;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSet::absolute( sal_Int32 row ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);


	if(first())
	{
		OLEVariant aEmpty;
		aEmpty.setNoArg();
		sal_Bool bRet = SUCCEEDED(m_pRecordSet->Move(row,aEmpty));
		if(bRet)
			m_nRowPos = row;
		return bRet;
	}
	return sal_False;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSet::relative( sal_Int32 row ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);


	if(!m_pRecordSet)
		return sal_False;

	OLEVariant aEmpty;
	aEmpty.setNoArg();
	sal_Bool bRet = SUCCEEDED(m_pRecordSet->Move(row,aEmpty));
	if(bRet)
		m_nRowPos += row;
	return bRet;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSet::previous(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);


	if(!m_pRecordSet)
		return sal_False;

	sal_Bool bRet = SUCCEEDED(m_pRecordSet->MovePrevious());
	if(bRet)
		--m_nRowPos;
	return bRet;
}
// -------------------------------------------------------------------------
Reference< XInterface > SAL_CALL ODatabaseMetaDataResultSet::getStatement(  ) throw(SQLException, RuntimeException)
{
	return m_aStatement.get();
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowDeleted(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	RecordStatusEnum eRec;
	m_pRecordSet->get_Status((sal_Int32*)&eRec);
	return (eRec & adRecDeleted) == adRecDeleted;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowInserted(  ) throw(SQLException, RuntimeException)
{	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	RecordStatusEnum eRec;
	m_pRecordSet->get_Status((sal_Int32*)&eRec);
	return (eRec & adRecNew) == adRecNew;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowUpdated(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	RecordStatusEnum eRec;
	m_pRecordSet->get_Status((sal_Int32*)&eRec);
	return (eRec & adRecModified) == adRecModified;
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isBeforeFirst(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);


	if(!m_pRecordSet)
		return sal_True;

	VARIANT_BOOL bIsAtBOF;
	m_pRecordSet->get_BOF(&bIsAtBOF);
	return bIsAtBOF == VARIANT_TRUE;
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSet::next(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);


	if(!m_pRecordSet)
		return sal_False;

	if(m_bOnFirstAfterOpen)
	{
		m_bOnFirstAfterOpen = sal_False;
		return sal_True;
	}
	else
		return SUCCEEDED(m_pRecordSet->MoveNext());
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSet::wasNull(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	return m_aValue.isNull();
}
// -------------------------------------------------------------------------
void SAL_CALL ODatabaseMetaDataResultSet::refreshRow(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	m_pRecordSet->Resync(adAffectCurrent,adResyncAllValues);
}
// -------------------------------------------------------------------------

void SAL_CALL ODatabaseMetaDataResultSet::cancel(  ) throw(RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();


	m_pRecordSet->Cancel();
}
// -------------------------------------------------------------------------
void SAL_CALL ODatabaseMetaDataResultSet::clearWarnings(  ) throw(SQLException, RuntimeException)
{
}
// -------------------------------------------------------------------------
Any SAL_CALL ODatabaseMetaDataResultSet::getWarnings(  ) throw(SQLException, RuntimeException)
{
	return Any();
}
//------------------------------------------------------------------------------
sal_Int32 ODatabaseMetaDataResultSet::getResultSetConcurrency() const
	throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
	return ResultSetConcurrency::READ_ONLY;
}
//------------------------------------------------------------------------------
sal_Int32 ODatabaseMetaDataResultSet::getResultSetType() const
	throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
	return ResultSetType::FORWARD_ONLY;
}
//------------------------------------------------------------------------------
sal_Int32 ODatabaseMetaDataResultSet::getFetchDirection() const
	throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
	return FetchDirection::FORWARD;
}
//------------------------------------------------------------------------------
sal_Int32 ODatabaseMetaDataResultSet::getFetchSize() const
	throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
	sal_Int32 nValue=-1;
	if(m_pRecordSet)
		m_pRecordSet->get_CacheSize(&nValue);
	return nValue;
}
//------------------------------------------------------------------------------
::rtl::OUString ODatabaseMetaDataResultSet::getCursorName() const
	throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
	return ::rtl::OUString();
}

//------------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setFetchDirection(sal_Int32 /*_par0*/)
	throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
    ::dbtools::throwFeatureNotImplementedException( "ResultSet::FetchDirection", *this );
}
//------------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setFetchSize(sal_Int32 _par0)
	throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
	if(m_pRecordSet)
		m_pRecordSet->put_CacheSize(_par0);
}
// -------------------------------------------------------------------------
::cppu::IPropertyArrayHelper* ODatabaseMetaDataResultSet::createArrayHelper( ) const
{

	Sequence< com::sun::star::beans::Property > aProps(5);
	com::sun::star::beans::Property* pProperties = aProps.getArray();
	sal_Int32 nPos = 0;
	DECL_PROP0(CURSORNAME,			::rtl::OUString);
	DECL_PROP0(FETCHDIRECTION,		sal_Int32);
	DECL_PROP0(FETCHSIZE,			sal_Int32);
	DECL_PROP0(RESULTSETCONCURRENCY,sal_Int32);
	DECL_PROP0(RESULTSETTYPE,		sal_Int32);

	return new ::cppu::OPropertyArrayHelper(aProps);
}
// -------------------------------------------------------------------------
::cppu::IPropertyArrayHelper & ODatabaseMetaDataResultSet::getInfoHelper()
{
	return *const_cast<ODatabaseMetaDataResultSet*>(this)->getArrayHelper();
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaDataResultSet::convertFastPropertyValue(
							Any & rConvertedValue,
							Any & rOldValue,
							sal_Int32 nHandle,
							const Any& rValue )
								throw (::com::sun::star::lang::IllegalArgumentException)
{
	switch(nHandle)
	{
		case PROPERTY_ID_CURSORNAME:
		case PROPERTY_ID_RESULTSETCONCURRENCY:
		case PROPERTY_ID_RESULTSETTYPE:
			throw ::com::sun::star::lang::IllegalArgumentException();
			break;
		case PROPERTY_ID_FETCHDIRECTION:
			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchDirection());
		case PROPERTY_ID_FETCHSIZE:
			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchSize());
		default:
			;
	}
	return sal_False;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setFastPropertyValue_NoBroadcast(
								sal_Int32 nHandle,
								const Any& /*rValue*/
												 )
												 throw (Exception)
{
	switch(nHandle)
	{
		case PROPERTY_ID_CURSORNAME:
		case PROPERTY_ID_RESULTSETCONCURRENCY:
		case PROPERTY_ID_RESULTSETTYPE:
		case PROPERTY_ID_FETCHDIRECTION:
		case PROPERTY_ID_FETCHSIZE:
			throw Exception();
			break;
		default:
			OSL_ENSURE(0,"setFastPropertyValue_NoBroadcast: Illegal handle value!");
	}
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::getFastPropertyValue(
								Any& rValue,
								sal_Int32 nHandle
									 ) const
{
	switch(nHandle)
	{
		case PROPERTY_ID_CURSORNAME:
			rValue <<= getCursorName();
			break;
		case PROPERTY_ID_RESULTSETCONCURRENCY:
			rValue <<= getResultSetConcurrency();
			break;
		case PROPERTY_ID_RESULTSETTYPE:
			rValue <<= getResultSetType();
			break;
		case PROPERTY_ID_FETCHDIRECTION:
			rValue <<= getFetchDirection();
			break;
		case PROPERTY_ID_FETCHSIZE:
			rValue <<= getFetchSize();
			break;
	}
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setProceduresMap()
{

	for(sal_Int32 i=1;i<4;i++)
		m_aColMapping.push_back(i);
	m_aColMapping.push_back(5);
	m_aColMapping.push_back(7);
	m_aColMapping.push_back(8);
	m_aColMapping.push_back(6);
	m_aColMapping.push_back(4);

	TInt2IntMap aMap;
	aMap[DB_PT_UNKNOWN]		= ProcedureResult::UNKNOWN;
	aMap[DB_PT_PROCEDURE]	= ProcedureResult::NONE;
	aMap[DB_PT_FUNCTION]	= ProcedureResult::RETURN;
	m_aValueRange[4] = aMap;

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setProceduresMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setCatalogsMap()
{
	m_aColMapping.push_back(1);

	m_xMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setSchemasMap()
{
	m_aColMapping.push_back(2);

	m_xMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setColumnPrivilegesMap()
{

	m_aColMapping.push_back(3);
	m_aColMapping.push_back(4);
	m_aColMapping.push_back(5);
	m_aColMapping.push_back(6);
	m_aColMapping.push_back(2);
	m_aColMapping.push_back(9);
	m_aColMapping.push_back(10);

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setColumnPrivilegesMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setColumnsMap()
{

	for(sal_Int32 i=1;i<5;++i)
		m_aColMapping.push_back(i);

	m_aColMapping.push_back(12);
	m_aColMapping.push_back(12); // is used as TYPE_NAME

	m_aColMapping.push_back(14);
	m_aColMapping.push_back(6);
	m_aColMapping.push_back(17);
	m_aColMapping.push_back(18);

	m_aColMapping.push_back(11);
	m_aColMapping.push_back(29);
	m_aColMapping.push_back(9);
	m_aColMapping.push_back(18);
	m_aColMapping.push_back(18);

	m_aColMapping.push_back(15);
	m_aColMapping.push_back(7);
	m_aColMapping.push_back(11);

	TInt2IntMap aMap;
	aMap[adEmpty]			= ADOS::MapADOType2Jdbc(adEmpty);
	aMap[adTinyInt]			= ADOS::MapADOType2Jdbc(adTinyInt);
	aMap[adSmallInt]		= ADOS::MapADOType2Jdbc(adSmallInt);
	aMap[adInteger]			= ADOS::MapADOType2Jdbc(adInteger);
	aMap[adBigInt]			= ADOS::MapADOType2Jdbc(adBigInt);
	aMap[adUnsignedTinyInt]	= ADOS::MapADOType2Jdbc(adUnsignedTinyInt);
	aMap[adUnsignedSmallInt]= ADOS::MapADOType2Jdbc(adUnsignedSmallInt);
	aMap[adUnsignedInt]		= ADOS::MapADOType2Jdbc(adUnsignedInt);
	aMap[adUnsignedBigInt]	= ADOS::MapADOType2Jdbc(adUnsignedBigInt);
	aMap[adSingle]			= ADOS::MapADOType2Jdbc(adSingle);
	aMap[adDouble]			= ADOS::MapADOType2Jdbc(adDouble);
	aMap[adCurrency]		= ADOS::MapADOType2Jdbc(adCurrency);
	aMap[adDecimal]			= ADOS::MapADOType2Jdbc(adDecimal);
	aMap[adNumeric]			= ADOS::MapADOType2Jdbc(adNumeric);
	aMap[adBoolean]			= ADOS::MapADOType2Jdbc(adBoolean);
	aMap[adError]			= ADOS::MapADOType2Jdbc(adError);
	aMap[adUserDefined]		= ADOS::MapADOType2Jdbc(adUserDefined);
	aMap[adVariant]			= ADOS::MapADOType2Jdbc(adVariant);
	aMap[adIDispatch]		= ADOS::MapADOType2Jdbc(adIDispatch);
	aMap[adIUnknown]		= ADOS::MapADOType2Jdbc(adIUnknown);
	aMap[adGUID]			= ADOS::MapADOType2Jdbc(adGUID);
	aMap[adDate]			= ADOS::MapADOType2Jdbc(adDate);
	aMap[adDBDate]			= ADOS::MapADOType2Jdbc(adDBDate);
	aMap[adDBTime]			= ADOS::MapADOType2Jdbc(adDBTime);
	aMap[adDBTimeStamp]		= ADOS::MapADOType2Jdbc(adDBTimeStamp);
	aMap[adBSTR]			= ADOS::MapADOType2Jdbc(adBSTR);
	aMap[adChar]			= ADOS::MapADOType2Jdbc(adChar);
	aMap[adVarChar]			= ADOS::MapADOType2Jdbc(adVarChar);
	aMap[adLongVarChar]		= ADOS::MapADOType2Jdbc(adLongVarChar);
	aMap[adWChar]			= ADOS::MapADOType2Jdbc(adWChar);
	aMap[adVarWChar]		= ADOS::MapADOType2Jdbc(adVarWChar);
	aMap[adLongVarWChar]	= ADOS::MapADOType2Jdbc(adLongVarWChar);
	aMap[adBinary]			= ADOS::MapADOType2Jdbc(adBinary);
	aMap[adVarBinary]		= ADOS::MapADOType2Jdbc(adVarBinary);
	aMap[adLongVarBinary]	= ADOS::MapADOType2Jdbc(adLongVarBinary);
	aMap[adChapter]			= ADOS::MapADOType2Jdbc(adChapter);
	aMap[adFileTime]		= ADOS::MapADOType2Jdbc(adFileTime);
	aMap[adPropVariant]		= ADOS::MapADOType2Jdbc(adPropVariant);
	aMap[adVarNumeric]		= ADOS::MapADOType2Jdbc(adVarNumeric);
//	aMap[adArray]			= ADOS::MapADOType2Jdbc(adArray);

	m_aValueRange[12] = aMap;

	::std::map< sal_Int32,::rtl::OUString> aMap2;
	aMap2[0] = ::rtl::OUString::createFromAscii("YES");
	aMap2[1] = ::rtl::OUString::createFromAscii("NO");
	m_aIntValueRange[18] = aMap2;

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setColumnsMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setTablesMap()
{

	for(sal_Int32 i=1;i<5;i++)
		m_aColMapping.push_back(i);
	m_aColMapping.push_back(6);

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setTablesMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setProcedureColumnsMap()
{

	for(sal_Int32 i=1;i<5;i++)
		m_aColMapping.push_back(i);
	m_aColMapping.push_back(6);
	m_aColMapping.push_back(10);
	m_aColMapping.push_back(16);
	m_aColMapping.push_back(13);
	m_aColMapping.push_back(11);
	m_aColMapping.push_back(12);

	m_aColMapping.push_back(9);
	m_aColMapping.push_back(14);

	TInt2IntMap aMap;
	aMap[DBTYPE_EMPTY] = DataType::SQLNULL;
	aMap[DBTYPE_NULL] = DataType::SQLNULL;
	aMap[DBTYPE_I2] = DataType::SMALLINT;
	aMap[DBTYPE_I4] = DataType::INTEGER;
	aMap[DBTYPE_R4] = DataType::FLOAT;
	aMap[DBTYPE_R8] = DataType::DOUBLE;
	aMap[DBTYPE_CY] = DataType::BIGINT;
	aMap[DBTYPE_DATE] = DataType::DATE;
	aMap[DBTYPE_BSTR] = DataType::VARCHAR;
	aMap[DBTYPE_IDISPATCH] = DataType::OBJECT;
	aMap[DBTYPE_ERROR] = DataType::OTHER;
	aMap[DBTYPE_BOOL] = DataType::BIT;
	aMap[DBTYPE_VARIANT] = DataType::STRUCT;
	aMap[DBTYPE_IUNKNOWN] = DataType::OTHER;
	aMap[DBTYPE_DECIMAL] = DataType::DECIMAL;
	aMap[DBTYPE_UI1] = DataType::TINYINT;
	aMap[DBTYPE_ARRAY] = DataType::ARRAY;
	aMap[DBTYPE_BYREF] = DataType::REF;
	aMap[DBTYPE_I1] = DataType::CHAR;
	aMap[DBTYPE_UI2] = DataType::SMALLINT;
	aMap[DBTYPE_UI4] = DataType::INTEGER;

	// aMap[The] = ;
	// aMap[in] = ;
	aMap[DBTYPE_I8] = DataType::BIGINT;
	aMap[DBTYPE_UI8] = DataType::BIGINT;
	aMap[DBTYPE_GUID] = DataType::OTHER;
	aMap[DBTYPE_VECTOR] = DataType::OTHER;
	aMap[DBTYPE_FILETIME] = DataType::OTHER;
	aMap[DBTYPE_RESERVED] = DataType::OTHER;

	// aMap[The] = ;
	aMap[DBTYPE_BYTES] = DataType::VARBINARY;
	aMap[DBTYPE_STR] = DataType::LONGVARCHAR;
	aMap[DBTYPE_WSTR] = DataType::LONGVARCHAR;
	aMap[DBTYPE_NUMERIC] = DataType::NUMERIC;
	aMap[DBTYPE_UDT] = DataType::OTHER;
	aMap[DBTYPE_DBDATE] = DataType::DATE;
	aMap[DBTYPE_DBTIME] = DataType::TIME;
	aMap[DBTYPE_DBTIMESTAMP] = DataType::TIMESTAMP;
	aMap[DBTYPE_HCHAPTER] = DataType::OTHER;
	aMap[DBTYPE_PROPVARIANT] = DataType::OTHER;
	aMap[DBTYPE_VARNUMERIC] = DataType::NUMERIC;

	m_aValueRange[10] = aMap;

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setProcedureColumnsMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setPrimaryKeysMap()
{

	sal_Int32 i=1;
	for(;i<5;i++)
		m_aColMapping.push_back(i);
	m_aColMapping.push_back(7);
	m_aColMapping.push_back(8);

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setProcedureColumnsMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setIndexInfoMap()
{

	sal_Int32 i=1;
	for(;i<4;i++)
		m_aColMapping.push_back(i);
	m_aColMapping.push_back(8);
	m_aColMapping.push_back(4);
	m_aColMapping.push_back(6);
	m_aColMapping.push_back(10);
	m_aColMapping.push_back(17);
	m_aColMapping.push_back(18);
	m_aColMapping.push_back(21);
	m_aColMapping.push_back(22);
	m_aColMapping.push_back(23);
	m_aColMapping.push_back(24);

	TInt2IntMap aMap;
	aMap[DBPROPVAL_IT_HASH] = IndexType::HASHED;
	aMap[DBPROPVAL_IT_CONTENT] = IndexType::OTHER;
	aMap[DBPROPVAL_IT_OTHER] = IndexType::OTHER;
	aMap[DBPROPVAL_IT_BTREE] = IndexType::OTHER;

	m_aValueRange[10] = aMap;

	TInt2IntMap aMap2;
	aMap[0] = 1;
	aMap[1] = 0;
	m_aValueRange[8] = aMap2;

	::std::map< sal_Int32,::rtl::OUString> aMap3;
	aMap3[0]					= ::rtl::OUString();
	aMap3[DB_COLLATION_ASC]		= ::rtl::OUString::createFromAscii("A");
	aMap3[DB_COLLATION_DESC]	= ::rtl::OUString::createFromAscii("D");

	m_aIntValueRange[21] = aMap3;

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setIndexInfoMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setTablePrivilegesMap()
{

	sal_Int32 i=3;
	for(;i<6;i++)
		m_aColMapping.push_back(i);
	m_aColMapping.push_back(1);
	m_aColMapping.push_back(2);
	m_aColMapping.push_back(6);
	m_aColMapping.push_back(7);

	::std::map< sal_Int32,::rtl::OUString> aMap;
	aMap[0] = ::rtl::OUString::createFromAscii("YES");
	aMap[1] = ::rtl::OUString::createFromAscii("NO");
	m_aIntValueRange[7] = aMap;


	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setTablePrivilegesMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setCrossReferenceMap()
{

	sal_Int32 i=1;
	for(;i<5;i++)
		m_aColMapping.push_back(i);
	for(i=7;i<11;i++)
		m_aColMapping.push_back(i);

	m_aColMapping.push_back(13);
	m_aColMapping.push_back(14);
	m_aColMapping.push_back(15);
	m_aColMapping.push_back(17);
	m_aColMapping.push_back(16);
	m_aColMapping.push_back(18);

	::std::map< ::rtl::OUString,sal_Int32> aMap;
	aMap[ ::rtl::OUString::createFromAscii("CASCADE")] = KeyRule::CASCADE;
	aMap[ ::rtl::OUString::createFromAscii("RESTRICT")] = KeyRule::RESTRICT;
	aMap[ ::rtl::OUString::createFromAscii("SET NULL")] = KeyRule::SET_NULL;
	aMap[ ::rtl::OUString::createFromAscii("SET DEFAULT")] = KeyRule::SET_DEFAULT;
	aMap[ ::rtl::OUString::createFromAscii("NO ACTION")] = KeyRule::NO_ACTION;

	m_aStrValueRange[14] = aMap;
	m_aStrValueRange[15] = aMap;

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setCrossReferenceMap();
	m_xMetaData = pMetaData;
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSet::setTypeInfoMap(sal_Bool _bJetEngine)
{
	sal_Int32 i=1;
	for(;i<19;i++)
		m_aColMapping.push_back(i);

	::std::map< ::rtl::OUString,sal_Int32> aMap1;
	aMap1[ ::rtl::OUString()] = 10;

	m_aStrValueRange[18] = aMap1;

	TInt2IntMap aMap;
	aMap[adEmpty]			= ADOS::MapADOType2Jdbc(adEmpty);
	aMap[adTinyInt]			= ADOS::MapADOType2Jdbc(adTinyInt);
	aMap[adSmallInt]		= ADOS::MapADOType2Jdbc(adSmallInt);
	aMap[adInteger]			= ADOS::MapADOType2Jdbc(adInteger);
	aMap[adBigInt]			= ADOS::MapADOType2Jdbc(adBigInt);
	aMap[adUnsignedTinyInt]	= ADOS::MapADOType2Jdbc(adUnsignedTinyInt);
	aMap[adUnsignedSmallInt]= ADOS::MapADOType2Jdbc(adUnsignedSmallInt);
	aMap[adUnsignedInt]		= ADOS::MapADOType2Jdbc(adUnsignedInt);
	aMap[adUnsignedBigInt]	= ADOS::MapADOType2Jdbc(adUnsignedBigInt);
	aMap[adSingle]			= ADOS::MapADOType2Jdbc(adSingle);
	aMap[adDouble]			= ADOS::MapADOType2Jdbc(adDouble);
	aMap[adCurrency]		= ADOS::MapADOType2Jdbc(adCurrency);
	aMap[adDecimal]			= ADOS::MapADOType2Jdbc(adDecimal);
	aMap[adNumeric]			= ADOS::MapADOType2Jdbc(adNumeric);
	aMap[adBoolean]			= ADOS::MapADOType2Jdbc(adBoolean);
	aMap[adError]			= ADOS::MapADOType2Jdbc(adError);
	aMap[adUserDefined]		= ADOS::MapADOType2Jdbc(adUserDefined);
	aMap[adVariant]			= ADOS::MapADOType2Jdbc(adVariant);
	aMap[adIDispatch]		= ADOS::MapADOType2Jdbc(adIDispatch);
	aMap[adIUnknown]		= ADOS::MapADOType2Jdbc(adIUnknown);
	aMap[adGUID]			= ADOS::MapADOType2Jdbc(adGUID);
	aMap[adDate]			= _bJetEngine ? ADOS::MapADOType2Jdbc(adDBTimeStamp) : ADOS::MapADOType2Jdbc(adDate);
	aMap[adDBDate]			= ADOS::MapADOType2Jdbc(adDBDate);
	aMap[adDBTime]			= ADOS::MapADOType2Jdbc(adDBTime);
	aMap[adDBTimeStamp]		= ADOS::MapADOType2Jdbc(adDBTimeStamp);
	aMap[adBSTR]			= ADOS::MapADOType2Jdbc(adBSTR);
	aMap[adChar]			= ADOS::MapADOType2Jdbc(adChar);
	aMap[adVarChar]			= ADOS::MapADOType2Jdbc(adVarChar);
	aMap[adLongVarChar]		= ADOS::MapADOType2Jdbc(adLongVarChar);
	aMap[adWChar]			= ADOS::MapADOType2Jdbc(adWChar);
	aMap[adVarWChar]		= ADOS::MapADOType2Jdbc(adVarWChar);
	aMap[adLongVarWChar]	= ADOS::MapADOType2Jdbc(adLongVarWChar);
	aMap[adBinary]			= ADOS::MapADOType2Jdbc(adBinary);
	aMap[adVarBinary]		= ADOS::MapADOType2Jdbc(adVarBinary);
	aMap[adLongVarBinary]	= ADOS::MapADOType2Jdbc(adLongVarBinary);
	aMap[adChapter]			= ADOS::MapADOType2Jdbc(adChapter);
	aMap[adFileTime]		= ADOS::MapADOType2Jdbc(adFileTime);
	aMap[adPropVariant]		= ADOS::MapADOType2Jdbc(adPropVariant);
	aMap[adVarNumeric]		= ADOS::MapADOType2Jdbc(adVarNumeric);
//	aMap[adArray]			= ADOS::MapADOType2Jdbc(adArray);

	m_aValueRange[2] = aMap;

	TInt2IntMap aColumnValueMapping;
	aColumnValueMapping[VARIANT_FALSE]		= ColumnValue::NO_NULLS;
	aColumnValueMapping[VARIANT_TRUE]		= ColumnValue::NULLABLE;
	m_aValueRange[7] = aColumnValueMapping;

	// now adjust the column mapping
	// OJ 24.01.2002  96860
	TInt2IntMap aSerachMapping;
	aSerachMapping[DB_UNSEARCHABLE]		= ColumnSearch::NONE;
	aSerachMapping[DB_LIKE_ONLY]		= ColumnSearch::CHAR;
	aSerachMapping[DB_ALL_EXCEPT_LIKE]	= ColumnSearch::BASIC;
	aSerachMapping[DB_SEARCHABLE]		= ColumnSearch::FULL;

	m_aValueRange[9] = aSerachMapping;

	TInt2IntMap aCurrencyMapping;
	m_aValueRange[11] = aCurrencyMapping;

	ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
	pMetaData->setTypeInfoMap();
	m_xMetaData = pMetaData;
}
// -----------------------------------------------------------------------------
void SAL_CALL ODatabaseMetaDataResultSet::acquire() throw()
{
	ODatabaseMetaDataResultSet_BASE::acquire();
}
// -----------------------------------------------------------------------------
void SAL_CALL ODatabaseMetaDataResultSet::release() throw()
{
	ODatabaseMetaDataResultSet_BASE::release();
}
// -----------------------------------------------------------------------------
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL ODatabaseMetaDataResultSet::getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException)
{
	return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
}
// -----------------------------------------------------------------------------
OLEVariant ODatabaseMetaDataResultSet::getValue(sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);

	checkRecordSet();

	WpADOField aField = ADOS::getField(m_pRecordSet,columnIndex);
	aField.get_Value(m_aValue);
	return m_aValue;
}
// -----------------------------------------------------------------------------
