/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_connectivity.hxx"
#include "ado/ADatabaseMetaDataResultSetMetaData.hxx"
#include "ado/Awrapado.hxx"
#include "connectivity/dbexception.hxx"


using namespace connectivity;
using namespace connectivity::ado;
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
using namespace com::sun::star::beans;
using namespace com::sun::star::sdbc;

// -------------------------------------------------------------------------
ODatabaseMetaDataResultSetMetaData::~ODatabaseMetaDataResultSetMetaData()
{
	if(m_pRecordSet)
		m_pRecordSet->Release();
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaDataResultSetMetaData::getColumnDisplaySize( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	sal_Int32 nSize = 0;
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		nSize = (*m_mColumnsIter).second.getColumnDisplaySize();
	else if(m_pRecordSet)
	{
		WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
		if(aField.IsValid())
			nSize = aField.GetActualSize();
	}
	return nSize;
}
// -------------------------------------------------------------------------

sal_Int32 SAL_CALL ODatabaseMetaDataResultSetMetaData::getColumnType( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	sal_Int32  nType = 0;
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		nType = (*m_mColumnsIter).second.getColumnType();
	else if(m_pRecordSet)
	{
		WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
		nType = ADOS::MapADOType2Jdbc(aField.GetADOType());
	}
	return nType;
}
// -------------------------------------------------------------------------

sal_Int32 SAL_CALL ODatabaseMetaDataResultSetMetaData::getColumnCount(  ) throw(SQLException, RuntimeException)
{
	if(!m_pRecordSet)
		return 0;
	if(m_nColCount != -1)
		return m_nColCount;

	if(m_vMapping.size())
		return m_mColumns.size();

	ADOFields* pFields	= NULL;
	m_pRecordSet->get_Fields(&pFields);
	WpOLEAppendCollection<ADOFields, ADOField, WpADOField>	aFields(pFields);
	m_nColCount = aFields.GetItemCount();
	return m_nColCount;
}
// -------------------------------------------------------------------------

::rtl::OUString SAL_CALL ODatabaseMetaDataResultSetMetaData::getColumnName( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getColumnName();
	if(!m_pRecordSet)
		return ::rtl::OUString();
	WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
	if(aField.IsValid())
		return aField.GetName();

	return ::rtl::OUString();
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaDataResultSetMetaData::getColumnLabel( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getColumnLabel();
	return getColumnName(column);
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSetMetaData::isCurrency( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.isCurrency();
	if(!m_pRecordSet)
		return 0;
	WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
	if(aField.IsValid())
	{
		return (aField.GetAttributes() & adFldFixed) == adFldFixed;
	}
	return sal_False;
}
// -------------------------------------------------------------------------


sal_Bool SAL_CALL ODatabaseMetaDataResultSetMetaData::isSigned( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.isSigned();
	if(!m_pRecordSet)
		return 0;
	WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
	if(aField.IsValid())
	{
		return (aField.GetAttributes() & adFldNegativeScale) == adFldNegativeScale;
	}
	return sal_False;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaDataResultSetMetaData::getPrecision( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getPrecision();
	if(!m_pRecordSet)
		return 0;
	WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
	if(aField.IsValid())
		return aField.GetPrecision();
	return 0;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaDataResultSetMetaData::getScale( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getScale();

	if(!m_pRecordSet)
		return 0;

	WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
	if(aField.IsValid())
		return aField.GetNumericScale();
	return 0;
}
// -------------------------------------------------------------------------

sal_Int32 SAL_CALL ODatabaseMetaDataResultSetMetaData::isNullable( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.isNullable();

	if(!m_pRecordSet)
		return 0;

	WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
	if(aField.IsValid())
	{
		return (aField.GetAttributes() & adFldIsNullable) == adFldIsNullable;
	}
	return sal_False;
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSetMetaData::isReadOnly( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.isReadOnly();

	if(!m_pRecordSet)
		return 0;

	WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
	if(aField.IsValid())
	{
		//	return (aField.GetStatus() & adFieldReadOnly) == adFieldReadOnly;
	}
	return sal_False;
}
// -------------------------------------------------------------------------

sal_Bool SAL_CALL ODatabaseMetaDataResultSetMetaData::isDefinitelyWritable( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.isDefinitelyWritable();

	if(!m_pRecordSet)
		return 0;

	WpADOField aField = ADOS::getField(m_pRecordSet,m_vMapping[column]);
	if(aField.IsValid())
	{
		return (aField.GetAttributes() & adFldUpdatable) == adFldUpdatable;
	}
	return sal_False;
;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSetMetaData::isWritable( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.isWritable();
	return isDefinitelyWritable(column);
}
// -----------------------------------------------------------------------------
