/**************************************************************
 * 
 * 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 <com/sun/star/sdbcx/Privilege.hpp>
#include <com/sun/star/sdbcx/PrivilegeObject.hpp>
#include "connectivity/dbexception.hxx"
#include "ado/Awrapado.hxx"
#include "ado/adoimp.hxx"
#include <osl/diagnose.h>
#include <com/sun/star/sdbc/DataType.hpp>


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


#define MYADOID(l) {l, 0,0x10,0x80,0,0,0xAA,0,0x6D,0x2E,0xA4};

const CLSID ADOS::CLSID_ADOCONNECTION_21	=	MYADOID(0x00000514);
const IID	ADOS::IID_ADOCONNECTION_21		=	MYADOID(0x00000550);

const CLSID ADOS::CLSID_ADOCOMMAND_21		=	MYADOID(0x00000507);
const IID	ADOS::IID_ADOCOMMAND_21			=	MYADOID(0x0000054E);

const CLSID ADOS::CLSID_ADORECORDSET_21		=	MYADOID(0x00000535);
const IID	ADOS::IID_ADORECORDSET_21		=	MYADOID(0x0000054F);

const CLSID ADOS::CLSID_ADOCATALOG_25		=	MYADOID(0x00000602);
const IID ADOS::IID_ADOCATALOG_25			=	MYADOID(0x00000603);

const CLSID ADOS::CLSID_ADOINDEX_25			=	MYADOID(0x0000061E);
const IID ADOS::IID_ADOINDEX_25				=	MYADOID(0x0000061F);

const CLSID ADOS::CLSID_ADOTABLE_25			=	MYADOID(0x00000609);
const IID ADOS::IID_ADOTABLE_25				=	MYADOID(0x00000610);

const CLSID ADOS::CLSID_ADOKEY_25			=	MYADOID(0x00000621);
const IID ADOS::IID_ADOKEY_25				=	MYADOID(0x00000622);

const CLSID ADOS::CLSID_ADOCOLUMN_25		=	MYADOID(0x0000061B);
const IID ADOS::IID_ADOCOLUMN_25			=	MYADOID(0x0000061C);

const CLSID ADOS::CLSID_ADOGROUP_25			=	MYADOID(0x00000615);
const IID ADOS::IID_ADOGROUP_25				=	MYADOID(0x00000616);

const CLSID ADOS::CLSID_ADOUSER_25			=	MYADOID(0x00000618);
const IID ADOS::IID_ADOUSER_25				=	MYADOID(0x00000619);

const CLSID ADOS::CLSID_ADOVIEW_25			=	MYADOID(0x00000612);
const IID ADOS::IID_ADOVIEW_25				=	MYADOID(0x00000613);

OLEString& ADOS::GetKeyStr()
{
	static OLEString sKeyStr(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("gxwaezucfyqpwjgqbcmtsncuhwsnyhiohwxz")));
	return sKeyStr;
}

// -------------------------------------------------------------------------
sal_Int32 ADOS::MapADOType2Jdbc(DataTypeEnum eType)
{
	sal_Int32 nType = DataType::VARCHAR;;
	switch (eType)
	{
		case adUnsignedSmallInt:
		case adSmallInt:			nType = DataType::SMALLINT;		break;
		case adUnsignedInt:
		case adInteger:				nType = DataType::INTEGER;		break;
		case adUnsignedBigInt:
		case adBigInt:				nType = DataType::BIGINT;		break;
		case adSingle:				nType = DataType::FLOAT;		break;
		case adDouble:				nType = DataType::DOUBLE;		break;
		case adCurrency:			nType = DataType::DOUBLE;		break;
		case adVarNumeric:
		case adNumeric:				nType = DataType::NUMERIC;		break;
		case adDecimal:				nType = DataType::DECIMAL;		break;
		case adDBDate:				nType = DataType::DATE;			break;
		case adDBTime:				nType = DataType::TIME;			break;
		case adDate:
		case adDBTimeStamp:			nType = DataType::TIMESTAMP;	break;
		case adBoolean:				nType = DataType::BOOLEAN;		break;
//		case adArray:				nType = DataType::ARRAY;		break;
		case adBinary:				nType = DataType::BINARY;		break;
		case adGUID:				nType = DataType::OBJECT;		break;
		case adBSTR:
		case adVarWChar:
		case adWChar:
		case adVarChar:				nType = DataType::VARCHAR;		break;
		case adLongVarWChar:
		case adLongVarChar:			nType = DataType::LONGVARCHAR;	break;
		case adVarBinary:			nType = DataType::VARBINARY;	break;
		case adLongVarBinary:		nType = DataType::LONGVARBINARY;break;
		case adChar:				nType = DataType::CHAR;			break;
		case adUnsignedTinyInt:
		case adTinyInt:				nType = DataType::TINYINT;		break;
		case adEmpty:				nType = DataType::SQLNULL;		break;
		case adUserDefined:
		case adPropVariant:
		case adFileTime:
		case adChapter:
		case adIDispatch:
		case adIUnknown:
		case adError:
		case adVariant:
									nType = DataType::OTHER;		break;
		default:
			OSL_ENSURE(0,"MapADOType2Jdbc: Unknown Type!");
			;
	}
	return nType;
}
// -------------------------------------------------------------------------
DataTypeEnum ADOS::MapJdbc2ADOType(sal_Int32 _nType,sal_Int32 _nJetEngine)
{
	switch (_nType)
	{
		case DataType::SMALLINT:		return adSmallInt;			break;
		case DataType::INTEGER:			return adInteger;			break;
		case DataType::BIGINT:			return adBigInt;			break;
		case DataType::FLOAT:			return adSingle;			break;
		case DataType::DOUBLE:			return adDouble;			break;
		case DataType::NUMERIC:			return adNumeric;			break;
		case DataType::DECIMAL:			return adDecimal;			break;
		case DataType::DATE:			return isJetEngine(_nJetEngine) ? adDate : adDBDate;			break;
		case DataType::TIME:			return adDBTime;			break;
		case DataType::TIMESTAMP:		return isJetEngine(_nJetEngine) ? adDate : adDBTimeStamp;		break;
        case DataType::BOOLEAN:
		case DataType::BIT:				return adBoolean;			break;
		case DataType::BINARY:			return adBinary;			break;
		case DataType::VARCHAR:			return adVarWChar;			break;
		case DataType::CLOB:
		case DataType::LONGVARCHAR:		return adLongVarWChar;		break;
		case DataType::VARBINARY:		return adVarBinary;			break;
		case DataType::BLOB:
		case DataType::LONGVARBINARY:	return adLongVarBinary;		break;
		case DataType::CHAR:			return adWChar;				break;
		case DataType::TINYINT:			return isJetEngine(_nJetEngine) ? adUnsignedTinyInt : adTinyInt;break;
		case DataType::OBJECT:			return adGUID;		break;
	default:
		OSL_ENSURE(0,"MapJdbc2ADOType: Unknown Type!");
			;
	}
	return adEmpty;
}
// -----------------------------------------------------------------------------
const int JET_ENGINETYPE_UNKNOWN	= 0;
const int JET_ENGINETYPE_JET10		= 1;
const int JET_ENGINETYPE_JET11		= 2;
const int JET_ENGINETYPE_JET20		= 3;
const int JET_ENGINETYPE_JET3X		= 4;
const int JET_ENGINETYPE_JET4X		= 5;
const int JET_ENGINETYPE_DBASE3		= 10;
const int JET_ENGINETYPE_DBASE4		= 11;
const int JET_ENGINETYPE_DBASE5		= 12;
const int JET_ENGINETYPE_EXCEL30	= 20;
const int JET_ENGINETYPE_EXCEL40	= 21;
const int JET_ENGINETYPE_EXCEL50	= 22;
const int JET_ENGINETYPE_EXCEL80	= 23;
const int JET_ENGINETYPE_EXCEL90	= 24;
const int JET_ENGINETYPE_EXCHANGE4	= 30;
const int JET_ENGINETYPE_LOTUSWK1	= 40;
const int JET_ENGINETYPE_LOTUSWK3	= 41;
const int JET_ENGINETYPE_LOTUSWK4	= 42;
const int JET_ENGINETYPE_PARADOX3X	= 50;
const int JET_ENGINETYPE_PARADOX4X	= 51;
const int JET_ENGINETYPE_PARADOX5X	= 52;
const int JET_ENGINETYPE_PARADOX7X	= 53;
const int JET_ENGINETYPE_TEXT1X		= 60;
const int JET_ENGINETYPE_HTML1X		= 70;

sal_Bool ADOS::isJetEngine(sal_Int32 _nEngineType)
{
	sal_Bool bRet = sal_False;
	switch(_nEngineType)
	{
		case JET_ENGINETYPE_UNKNOWN:
		case JET_ENGINETYPE_JET10:
		case JET_ENGINETYPE_JET11:
		case JET_ENGINETYPE_JET20:
		case JET_ENGINETYPE_JET3X:
		case JET_ENGINETYPE_JET4X:
		case JET_ENGINETYPE_DBASE3:
		case JET_ENGINETYPE_DBASE4:
		case JET_ENGINETYPE_DBASE5:
		case JET_ENGINETYPE_EXCEL30:
		case JET_ENGINETYPE_EXCEL40:
		case JET_ENGINETYPE_EXCEL50:
		case JET_ENGINETYPE_EXCEL80:
		case JET_ENGINETYPE_EXCEL90:
		case JET_ENGINETYPE_EXCHANGE4:
		case JET_ENGINETYPE_LOTUSWK1:
		case JET_ENGINETYPE_LOTUSWK3:
		case JET_ENGINETYPE_LOTUSWK4:
		case JET_ENGINETYPE_PARADOX3X:
		case JET_ENGINETYPE_PARADOX4X:
		case JET_ENGINETYPE_PARADOX5X:
		case JET_ENGINETYPE_PARADOX7X:
		case JET_ENGINETYPE_TEXT1X:
		case JET_ENGINETYPE_HTML1X:
			bRet = sal_True;
			break;
	}
	return bRet;
}
// -----------------------------------------------------------------------------
ObjectTypeEnum ADOS::mapObjectType2Ado(sal_Int32 objType)
{
	ObjectTypeEnum eType = adPermObjTable;
	switch(objType)
	{
		case PrivilegeObject::TABLE:
			eType = adPermObjTable;
			break;
		case PrivilegeObject::VIEW:
			eType = adPermObjView;
			break;
		case PrivilegeObject::COLUMN:
			eType = adPermObjColumn;
			break;
	}
	return eType;
}
// -----------------------------------------------------------------------------
sal_Int32 ADOS::mapAdoType2Object(ObjectTypeEnum objType)
{
	sal_Int32 nType = PrivilegeObject::TABLE;
	switch(objType)
	{
		case adPermObjTable:
			nType = PrivilegeObject::TABLE;
			break;
		case adPermObjView:
			nType = PrivilegeObject::VIEW;
			break;
		case adPermObjColumn:
			nType = PrivilegeObject::COLUMN;
			break;
        default:
            OSL_ENSURE( false, "ADOS::mapAdoType2Object: privilege type cannot be translated!" );
            break;
	}
	return nType;
}
#ifdef DELETE
#undef DELETE
#endif
// -----------------------------------------------------------------------------
sal_Int32 ADOS::mapAdoRights2Sdbc(RightsEnum eRights)
{
	sal_Int32 nRights = 0;
	if((eRights & adRightInsert) == adRightInsert)
		nRights |= Privilege::INSERT;
	if((eRights & adRightDelete) == adRightDelete)
		nRights |= ::com::sun::star::sdbcx::Privilege::DELETE;
	if((eRights & adRightUpdate) == adRightUpdate)
		nRights |= Privilege::UPDATE;
	if((eRights & adRightWriteDesign) == adRightWriteDesign)
		nRights |= Privilege::ALTER;
	if((eRights & adRightRead) == adRightRead)
		nRights |= Privilege::SELECT;
	if((eRights & adRightReference) == adRightReference)
		nRights |= Privilege::REFERENCE;
	if((eRights & adRightDrop) == adRightDrop)
		nRights |= Privilege::DROP;

	return nRights;
}
// -----------------------------------------------------------------------------
sal_Int32 ADOS::mapRights2Ado(sal_Int32 nRights)
{
	sal_Int32 eRights = adRightNone;

	if((nRights & Privilege::INSERT) == Privilege::INSERT)
		eRights |= adRightInsert;
	if((nRights & Privilege::DELETE) == Privilege::DELETE)
		eRights |= adRightDelete;
	if((nRights & Privilege::UPDATE) == Privilege::UPDATE)
		eRights |= adRightUpdate;
	if((nRights & Privilege::ALTER) == Privilege::ALTER)
		eRights |= adRightWriteDesign;
	if((nRights & Privilege::SELECT) == Privilege::SELECT)
		eRights |= adRightRead;
	if((nRights & Privilege::REFERENCE) == Privilege::REFERENCE)
		eRights |= adRightReference;
	if((nRights & Privilege::DROP) == Privilege::DROP)
		eRights |= adRightDrop;

	return eRights;
}
// -----------------------------------------------------------------------------
WpADOField ADOS::getField(ADORecordset* _pRecordSet,sal_Int32 _nColumnIndex) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
{
	if ( !_pRecordSet )
		return WpADOField();

	ADOFields* pFields	= NULL;
	_pRecordSet->get_Fields(&pFields);
	WpOLEAppendCollection<ADOFields, ADOField, WpADOField>	aFields(pFields);
	if(_nColumnIndex <= 0 || _nColumnIndex > aFields.GetItemCount())
		::dbtools::throwInvalidIndexException(NULL);
	WpADOField aField(aFields.GetItem(_nColumnIndex-1));
	if(!aField.IsValid())
		::dbtools::throwInvalidIndexException(NULL);
	return aField;
}
// -----------------------------------------------------------------------------




