/**************************************************************
 * 
 * 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/ADatabaseMetaData.hxx"
#include "ado/ADatabaseMetaDataResultSetMetaData.hxx"
#include "ado/Awrapado.hxx"
#include "ado/AGroup.hxx"
#include "ado/adoimp.hxx"
#include "ado/AIndex.hxx"
#include "ado/AKey.hxx"
#include "ado/ATable.hxx"
#include <com/sun/star/sdbc/DataType.hpp>
#include <com/sun/star/sdbc/ProcedureResult.hpp>
#include <com/sun/star/sdbc/ColumnValue.hpp>
#ifdef DELETE
#undef DELETE
#endif
#include <com/sun/star/sdbcx/Privilege.hpp>
#include <com/sun/star/sdbcx/PrivilegeObject.hpp>
#include <com/sun/star/sdbc/KeyRule.hpp>
#include <com/sun/star/sdbcx/KeyType.hpp>

using namespace connectivity::ado;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::uno;

// -------------------------------------------------------------------------
void ODatabaseMetaData::fillLiterals()
{
	ADORecordset *pRecordset = NULL;
	OLEVariant  vtEmpty;
	vtEmpty.setNoArg();
	m_pADOConnection->OpenSchema(adSchemaDBInfoLiterals,vtEmpty,vtEmpty,&pRecordset);

	ADOS::ThrowException(*m_pADOConnection,*this);

	OSL_ENSURE(pRecordset,"fillLiterals: no resultset!");
	if ( pRecordset )
	{
		WpADORecordset aRecordset(pRecordset);

		aRecordset.MoveFirst();
		OLEVariant  aValue;
		LiteralInfo aInfo;
		while(!aRecordset.IsAtEOF())
		{
			WpOLEAppendCollection<ADOFields, ADOField, WpADOField>	aFields(aRecordset.GetFields());
			WpADOField aField(aFields.GetItem(1));
			aInfo.pwszLiteralValue = aField.get_Value();
			aField = aFields.GetItem(5);
			aInfo.fSupported = aField.get_Value();
			aField = aFields.GetItem(6);
			aInfo.cchMaxLen = aField.get_Value().getUInt32();

			aField = aFields.GetItem(4);
			sal_uInt32 nId = aField.get_Value().getUInt32();
			m_aLiteralInfo[nId] = aInfo;

			aRecordset.MoveNext();
		}
		aRecordset.Close();
	}
}
// -------------------------------------------------------------------------
sal_Int32 ODatabaseMetaData::getMaxSize(sal_uInt32 _nId)
{
	if(!m_aLiteralInfo.size())
		fillLiterals();

	sal_Int32 nSize = 0;
	::std::map<sal_uInt32,LiteralInfo>::const_iterator aIter = m_aLiteralInfo.find(_nId);
	if(aIter != m_aLiteralInfo.end() && (*aIter).second.fSupported)
		nSize = ((*aIter).second.cchMaxLen == (-1)) ? 0 : (*aIter).second.cchMaxLen;
	return nSize;
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::isCapable(sal_uInt32 _nId)
{
	if(!m_aLiteralInfo.size())
		fillLiterals();
	sal_Bool bSupported = sal_False;
	::std::map<sal_uInt32,LiteralInfo>::const_iterator aIter = m_aLiteralInfo.find(_nId);
	if(aIter != m_aLiteralInfo.end())
		bSupported = (*aIter).second.fSupported;
	return bSupported;
}

// -------------------------------------------------------------------------
::rtl::OUString ODatabaseMetaData::getLiteral(sal_uInt32 _nId)
{
	if(!m_aLiteralInfo.size())
		fillLiterals();
	::rtl::OUString sStr;
	::std::map<sal_uInt32,LiteralInfo>::const_iterator aIter = m_aLiteralInfo.find(_nId);
	if(aIter != m_aLiteralInfo.end() && (*aIter).second.fSupported)
		sStr = (*aIter).second.pwszLiteralValue;
	return sStr;
}
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setColumnPrivilegesMap()
{
	m_mColumns[8] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("IS_GRANTABLE"),
		ColumnValue::NULLABLE,
		3,3,0,
		DataType::VARCHAR);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setColumnsMap()
{
	m_mColumns[6] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("TYPE_NAME"),
		ColumnValue::NO_NULLS,
		0,0,0,
		DataType::VARCHAR);
	m_mColumns[11] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("NULLABLE"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
	m_mColumns[12] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("REMARKS"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
	m_mColumns[13] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("COLUMN_DEF"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
	m_mColumns[14] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("SQL_DATA_TYPE"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
	m_mColumns[15] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("SQL_DATETIME_SUB"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
	m_mColumns[16] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("CHAR_OCTET_LENGTH"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setTablesMap()
{
	m_mColumns[5] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("REMARKS"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setProcedureColumnsMap()
{
	m_mColumns[12] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("NULLABLE"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setPrimaryKeysMap()
{
	m_mColumns[5] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("KEY_SEQ"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
	m_mColumns[6] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("PK_NAME"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setIndexInfoMap()
{
	m_mColumns[4] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("NON_UNIQUE"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::BIT);
	m_mColumns[5] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("INDEX_QUALIFIER"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
	m_mColumns[10] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("ASC_OR_DESC"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setTablePrivilegesMap()
{
	m_mColumns[6] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("PRIVILEGE"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
	m_mColumns[7] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("IS_GRANTABLE"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setCrossReferenceMap()
{
	m_mColumns[9] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("KEY_SEQ"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setTypeInfoMap()
{
	m_mColumns[3] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("PRECISION"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
	m_mColumns[7] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("NULLABLE"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
	m_mColumns[12] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("AUTO_INCREMENT"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::BIT);
	m_mColumns[16] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("SQL_DATA_TYPE"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
	m_mColumns[17] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("SQL_DATETIME_SUB"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
	m_mColumns[18] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("NUM_PREC_RADIX"),
		ColumnValue::NO_NULLS,
		1,1,0,
		DataType::INTEGER);
}
// -------------------------------------------------------------------------
void ODatabaseMetaDataResultSetMetaData::setProceduresMap()
{
	m_mColumns[7] = OColumn(::rtl::OUString(),::rtl::OUString::createFromAscii("REMARKS"),
		ColumnValue::NULLABLE,
		0,0,0,
		DataType::VARCHAR);
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSetMetaData::isSearchable( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.isSearchable();
	return sal_True;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaDataResultSetMetaData::isAutoIncrement( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.isAutoIncrement();
	return sal_False;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaDataResultSetMetaData::getColumnServiceName( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getColumnServiceName();
	return ::rtl::OUString();
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaDataResultSetMetaData::getTableName( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getTableName();
	return ::rtl::OUString();
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaDataResultSetMetaData::getCatalogName( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getCatalogName();
	return ::rtl::OUString();
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaDataResultSetMetaData::getColumnTypeName( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getColumnTypeName();
	return ::rtl::OUString();
}
// -------------------------------------------------------------------------

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

::rtl::OUString SAL_CALL ODatabaseMetaDataResultSetMetaData::getSchemaName( sal_Int32 column ) throw(SQLException, RuntimeException)
{
	if(m_mColumns.size() && (m_mColumnsIter = m_mColumns.find(column)) != m_mColumns.end())
		return (*m_mColumnsIter).second.getSchemaName();
	return ::rtl::OUString();
}
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
ObjectTypeEnum OAdoGroup::MapObjectType(sal_Int32 _ObjType)
{
	ObjectTypeEnum eNumType= adPermObjTable;
	switch(_ObjType)
	{
        case PrivilegeObject::TABLE:
			break;
        case PrivilegeObject::VIEW:
			eNumType = adPermObjView;
			break;
        case PrivilegeObject::COLUMN:
			eNumType = adPermObjColumn;
			break;
	}
	return eNumType;
}
// -------------------------------------------------------------------------
sal_Int32 OAdoGroup::MapRight(RightsEnum _eNum)
{
	sal_Int32 nRight = 0;
	if(_eNum & adRightRead)
                nRight |= Privilege::SELECT;
	if(_eNum & adRightInsert)
                nRight |= Privilege::INSERT;
	if(_eNum & adRightUpdate)
                nRight |= Privilege::UPDATE;
	if(_eNum & adRightDelete)
                nRight |= Privilege::DELETE;
	if(_eNum & adRightReadDesign)
                nRight |= Privilege::READ;
	if(_eNum & adRightCreate)
                nRight |= Privilege::CREATE;
	if(_eNum & adRightWriteDesign)
                nRight |= Privilege::ALTER;
	if(_eNum & adRightReference)
                nRight |= Privilege::REFERENCE;
	if(_eNum & adRightDrop)
                nRight |= Privilege::DROP;

	return nRight;
}
// -------------------------------------------------------------------------
RightsEnum OAdoGroup::Map2Right(sal_Int32 _eNum)
{
	sal_Int32 nRight = adRightNone;
        if(_eNum & Privilege::SELECT)
		nRight |= adRightRead;

        if(_eNum & Privilege::INSERT)
		nRight |= adRightInsert;

        if(_eNum & Privilege::UPDATE)
		nRight |= adRightUpdate;

        if(_eNum & Privilege::DELETE)
		nRight |= adRightDelete;

        if(_eNum & Privilege::READ)
		nRight |= adRightReadDesign;

        if(_eNum & Privilege::CREATE)
		nRight |= adRightCreate;

        if(_eNum & Privilege::ALTER)
		nRight |= adRightWriteDesign;

        if(_eNum & Privilege::REFERENCE)
		nRight |= adRightReference;

        if(_eNum & Privilege::DROP)
		nRight |= adRightDrop;

	return (RightsEnum)nRight;
}
// -------------------------------------------------------------------------
void WpADOIndex::Create()
{
	HRESULT         hr = -1;

	_ADOIndex* pIndex = NULL;
	hr = CoCreateInstance(ADOS::CLSID_ADOINDEX_25,
						  NULL,
						  CLSCTX_INPROC_SERVER,
						  ADOS::IID_ADOINDEX_25,
						  (void**)&pIndex );


	if( !FAILED( hr ) )
	{
		operator=( pIndex );
		pIndex->Release();
	}
}
// -------------------------------------------------------------------------
void OAdoIndex::fillPropertyValues()
{
	if(m_aIndex.IsValid())
	{
		m_Name				= m_aIndex.get_Name();
		m_IsUnique			= m_aIndex.get_Unique();
        m_IsPrimaryKeyIndex = m_aIndex.get_PrimaryKey();
		m_IsClustered		= m_aIndex.get_Clustered();
	}
}
// -----------------------------------------------------------------------------
void WpADOKey::Create()
{
	HRESULT         hr = -1;
	_ADOKey* pKey = NULL;
	hr = CoCreateInstance(ADOS::CLSID_ADOKEY_25,
						  NULL,
						  CLSCTX_INPROC_SERVER,
						  ADOS::IID_ADOKEY_25,
						  (void**)&pKey );


	if( !FAILED( hr ) )
	{
		operator=( pKey );
		pKey->Release();
	}
}
// -------------------------------------------------------------------------
void OAdoKey::fillPropertyValues()
{
	if(m_aKey.IsValid())
	{
		m_aProps->m_Type			= MapKeyRule(m_aKey.get_Type());
		m_Name			            = m_aKey.get_Name();
		m_aProps->m_ReferencedTable	= m_aKey.get_RelatedTable();
		m_aProps->m_UpdateRule		= MapRule(m_aKey.get_UpdateRule());
		m_aProps->m_DeleteRule		= MapRule(m_aKey.get_DeleteRule());
	}
}
// -------------------------------------------------------------------------
sal_Int32 OAdoKey::MapRule(const RuleEnum& _eNum)
{
        sal_Int32 eNum = KeyRule::NO_ACTION;
	switch(_eNum)
	{
		case adRICascade:
			eNum = KeyRule::CASCADE;
			break;
		case adRISetNull:
            eNum = KeyRule::SET_NULL;
			break;
		case adRINone:
            eNum = KeyRule::NO_ACTION;
			break;
		case adRISetDefault:
            eNum = KeyRule::SET_DEFAULT;
			break;
	}
	return eNum;
}
// -------------------------------------------------------------------------
RuleEnum OAdoKey::Map2Rule(const sal_Int32& _eNum)
{
	RuleEnum eNum = adRINone;
	switch(_eNum)
	{
		case KeyRule::CASCADE:
			eNum = adRICascade;
			break;
        case KeyRule::SET_NULL:
			eNum = adRISetNull;
			break;
        case KeyRule::NO_ACTION:
			eNum = adRINone;
			break;
        case KeyRule::SET_DEFAULT:
			eNum = adRISetDefault;
			break;
	}
	return eNum;
}
// -------------------------------------------------------------------------
sal_Int32 OAdoKey::MapKeyRule(const KeyTypeEnum& _eNum)
{
	sal_Int32 nKeyType = KeyType::PRIMARY;
	switch(_eNum)
	{
		case adKeyPrimary:
			nKeyType = KeyType::PRIMARY;
			break;
		case adKeyForeign:
			nKeyType = KeyType::FOREIGN;
			break;
		case adKeyUnique:
			nKeyType = KeyType::UNIQUE;
			break;
	}
	return nKeyType;
}
// -------------------------------------------------------------------------
KeyTypeEnum OAdoKey::Map2KeyRule(const sal_Int32& _eNum)
{
    KeyTypeEnum eNum( adKeyPrimary );
	switch(_eNum)
	{
		case KeyType::PRIMARY:
			eNum = adKeyPrimary;
			break;
        case KeyType::FOREIGN:
			eNum = adKeyForeign;
			break;
        case KeyType::UNIQUE:
			eNum = adKeyUnique;
			break;
        default:
            OSL_ENSURE( false, "OAdoKey::Map2KeyRule: invalid key type!" );
	}
	return eNum;
}
// -----------------------------------------------------------------------------
void WpADOTable::Create()
{
	HRESULT         hr = -1;
	_ADOTable* pTable = NULL;
	hr = CoCreateInstance(ADOS::CLSID_ADOTABLE_25,
						  NULL,
						  CLSCTX_INPROC_SERVER,
						  ADOS::IID_ADOTABLE_25,
						  (void**)&pTable );


	if( !FAILED( hr ) )
	{
		operator=( pTable );
		pTable->Release();
	}
}
// -------------------------------------------------------------------------
::rtl::OUString WpADOCatalog::GetObjectOwner(const ::rtl::OUString& _rName, ObjectTypeEnum _eNum)
{
	OLEVariant _rVar;
	_rVar.setNoArg();
	OLEString aBSTR;
	OLEString sStr1(_rName);
	pInterface->GetObjectOwner(sStr1,_eNum,_rVar,&aBSTR);
	return aBSTR;
}
// -----------------------------------------------------------------------------
void OAdoTable::fillPropertyValues()
{
	if(m_aTable.IsValid())
	{
		m_Name	= m_aTable.get_Name();
		m_Type	= m_aTable.get_Type();
		{
			WpADOCatalog aCat(m_aTable.get_ParentCatalog());
			if(aCat.IsValid())
				m_CatalogName = aCat.GetObjectOwner(m_aTable.get_Name(),adPermObjTable);
		}
		{
			WpADOProperties aProps = m_aTable.get_Properties();
			if(aProps.IsValid())
				m_Description = OTools::getValue(aProps,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Description")));
		}
	}
}
// -----------------------------------------------------------------------------
void WpADOUser::Create()
{
	HRESULT         hr = -1;
	_ADOUser* pUser = NULL;
	hr = CoCreateInstance(ADOS::CLSID_ADOUSER_25,
						  NULL,
						  CLSCTX_INPROC_SERVER,
						  ADOS::IID_ADOUSER_25,
						  (void**)&pUser );


	if( !FAILED( hr ) )
	{
		operator=( pUser );
		pUser->Release();
	}
}
// -------------------------------------------------------------------------


