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


