/**************************************************************
 * 
 * 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;
}
// -----------------------------------------------------------------------------


