/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// 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.
//
// @@@ END COPYRIGHT @@@
********************************************************************/
/**************************************************************************
**************************************************************************/
//
//
#ifndef CDESC_H
#define CDESC_H

#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <string>
//#include <deque>
#include <vector>
#include "DrvrGlobal.h"
#include "CHandle.h"
#include "odbcCommon.h"
#include "CConnect.h"

#define MAX_IDENTIFIER_LEN	512
using namespace std;

class CDesc;
class CStmt;


class CDescRec {

public:
	CDescRec(SQLSMALLINT DescMode,CDesc* DescDesc);
	~CDescRec();
	unsigned long setDescRec(short DescMode,
				SQLSMALLINT	Type,
				SQLSMALLINT	SubType,
				SQLLEN		Length,
				SQLSMALLINT	Precision,
				SQLSMALLINT	Scale,
				SQLPOINTER	DataPtr,
				SQLLEN		*StringLengthPtr,
				SQLLEN		*IndicatorPtr);
	unsigned long setDescRec(short DescMode,
					SQLSMALLINT TargetType,
					SQLPOINTER TargetValuePtr,
					SQLLEN	   BufferLength,
					SQLLEN	   *StrLen_or_IndPtr);
	unsigned long CDescRec::BindParameter(short DescMode,
			SQLSMALLINT InputOutputType,
			SQLSMALLINT ValueType,
			SQLPOINTER  ParameterValuePtr,
			SQLLEN		BufferLength,
			SQLLEN		*StrLen_or_IndPtr);
	unsigned long BindParameter(short DescMode,
					SQLSMALLINT ParameterType, 
					SQLULEN		ColumnSize,
					SQLSMALLINT DecimalDigits);
	unsigned long setDescRec(short DescMode, SQLItemDesc_def *SQLItemDesc);
	unsigned long checkConsistency(short DescMode);
	unsigned long CopyDesc(CDescRec *srcDescRec);
	unsigned long SetDescField(short DescMode,
					SQLSMALLINT FieldIdentifier,
					SQLPOINTER ValuePtr,
					SQLINTEGER BufferLength);
	inline void deleteTranslatedDataPtr() {
		if (m_TranslatedDataPtr != NULL)
		{
			delete[] m_TranslatedDataPtr;
			m_TranslatedDataPtr = NULL;
		}
	};
	void setTranslateOption(SQLSMALLINT CDataType);
private:
	SQLSMALLINT	m_DescType;
	SQLSMALLINT	m_DescConciseType;
	SQLSMALLINT	m_DescDatetimeIntervalCode;
	SQLINTEGER	m_DescOctetLength;
	SQLUINTEGER	m_DescLength;
	SQLINTEGER	m_DescPrecision;
	SQLSMALLINT	m_DescScale;
	SQLINTEGER	m_DescDatetimeIntervalPrecision;
	SQLSMALLINT	m_DescFixedPrecScale;
	SQLSMALLINT	m_DescNullable;
	SQLPOINTER	m_DescDataPtr;
	SQLLEN		*m_DescIndicatorPtr;
	SQLINTEGER	m_DescDisplaySize;
	SQLLEN		*m_DescOctetLengthPtr;
	SQLSMALLINT	m_DescParameterType;
	SQLCHAR		m_DescBaseColumnName[MAX_IDENTIFIER_LEN+1];
	SQLCHAR		m_DescName[MAX_IDENTIFIER_LEN+1];
	
	// These items are returned from SQL and are stored as separate entities.
	// These items should not be copied or overwritten by SQLCopyDesc or any other means
	// Overwrtting this items may cause unexpected behavior
	SQLINTEGER	m_SQLCharset;
	SQLINTEGER	m_ODBCCharset;
	SQLSMALLINT m_SQLDataType;
	SQLSMALLINT m_ODBCDataType;
	SQLINTEGER m_SQLPrecision;
	SQLINTEGER	m_ODBCPrecision;
	SQLSMALLINT	m_ODBCScale;
	SQLSMALLINT m_SQLDatetimeCode;
	SQLINTEGER	m_SQLOctetLength;
	SQLSMALLINT	m_SQLUnsigned;
	SQLINTEGER	m_SQLMaxLength;
	
	SQLINTEGER	m_DescAutoUniqueValue;
	SQLINTEGER	m_DescCaseSensitive;
	SQLINTEGER	m_DescNumPrecRadix;
	SQLSMALLINT	m_DescSearchable;
	SQLSMALLINT	m_DescUnnamed;
	SQLSMALLINT	m_DescUnsigned;
	SQLSMALLINT	m_DescUpdatable;

	SQLCHAR		m_DescTypeName[MAX_IDENTIFIER_LEN+1];
	SQLCHAR		m_DescBaseTableName[MAX_IDENTIFIER_LEN+1];
	SQLCHAR		m_DescCatalogName[MAX_IDENTIFIER_LEN+1];
	SQLCHAR		m_DescLabel[MAX_IDENTIFIER_LEN+1];
	SQLCHAR		m_DescTableName[MAX_IDENTIFIER_LEN+1];
	
	SQLCHAR		m_DescLiteralPrefix[20];
	SQLCHAR		m_DescLiteralSuffix[20];
	SQLCHAR		m_DescLocalTypeName[MAX_IDENTIFIER_LEN+1];
	SQLCHAR		m_DescSchemaName[MAX_IDENTIFIER_LEN];

	SQLINTEGER	m_DescReturnedLength;	// Used by SQLGetData - Length of data returned already
									// SQL_NO_DATA means the data is alreay sent
	CDesc*		m_DescDesc;
	DWORD		m_translateOptionFromSQL; 
	DWORD		m_translateOptionToSQL;	  
  	CHAR		*m_TranslatedDataPtr; 

	friend class CDesc;	
};


typedef CDescRec *CDescRecPtr;

//typedef deque<CDescRecPtr> CDESCRECLIST;
typedef vector<CDescRecPtr> CDESCRECLIST;

class CDesc : public CHandle {

public:
	CDesc(SQLHANDLE InputHandle, short DescMode, SQLSMALLINT DescAllocType, CStmt *pStmt = NULL);
	~CDesc();
	void clear();
	void deleteRecords();
	SQLRETURN SetDescRec(SQLSMALLINT	RecNumber,
					SQLSMALLINT	Type,
					SQLSMALLINT	SubType,
					SQLLEN		Length,
					SQLSMALLINT	Precision,
					SQLSMALLINT	Scale,
					SQLPOINTER	DataPtr,
					SQLLEN		*StringLengthPtr,
					SQLLEN		*IndicatorPtr);
	SQLRETURN GetDescRec(SQLSMALLINT	RecNumber, 
					SQLWCHAR *NameW,
					SQLSMALLINT	BufferLength,
					SQLSMALLINT	*StringLengthPtr,
					SQLSMALLINT	*TypePtr,
					SQLSMALLINT	*SubTypePtr,
					SQLLEN		*LengthPtr,
					SQLSMALLINT	*PrecisionPtr,
					SQLSMALLINT	*ScalePtr,
					SQLSMALLINT	*NullablePtr);
	SQLRETURN SetDescField(SQLSMALLINT RecNumber,
					SQLSMALLINT FieldIdentifier,
					SQLPOINTER ValuePtr,
					SQLINTEGER BufferLength);
	unsigned long SetDescField(SQLSMALLINT RecNumber);
	SQLRETURN GetDescField(SQLSMALLINT RecNumber,
					SQLSMALLINT FieldIdentifier,
					SQLPOINTER ValuePtr,
					SQLINTEGER BufferLength,
					SQLINTEGER *StringLengthPtr);
	unsigned long BindCol(SQLSMALLINT ColumnNumber,
					SQLSMALLINT TargetType,
					SQLPOINTER TargetValuePtr,
					SQLLEN BufferLength,
					SQLLEN *StrLen_or_IndPtr);
	unsigned long BindParameter(SQLSMALLINT ParameterNumber, 
					SQLSMALLINT InputOutputType,
					SQLSMALLINT ValueType,
					SQLPOINTER  ParameterValuePtr,
					SQLLEN	BufferLength,
					SQLLEN *StrLen_or_Ind);
	unsigned long BindParameter(SQLSMALLINT ParameterNumber, 
					SQLSMALLINT ParameterType, 
					SQLULEN		ColumnSize,
					SQLSMALLINT DecimalDigits);
	unsigned long setDescRec(const SQLItemDescList_def *SQLDesc);
	unsigned long getDescRec(SQLUSMALLINT ColumnNumber, 
			SQLWCHAR *ColumnName,
			SQLSMALLINT BufferLength, 
			SQLSMALLINT *NameLengthPtr,
		    SQLSMALLINT *DataTypePtr, 
			SQLULEN *ColumnSizePtr,
			SQLSMALLINT *DecimalDigitsPtr,
			SQLSMALLINT *NullablePtr,
			UCHAR		*errorMsg,
			SWORD		errorMsgMax);
	SQLRETURN BuildValueList(CStmt *pHandle,  //Changed object ptr type in order to access CStmt::DrvrSqlRowIdMap
			SQLSMALLINT	ImpParamCount,
			CDesc		*IPD,
			SQLINTEGER	ODBCAppVersion,
			SQLSMALLINT &ParamNumber, 
			SQLULEN		&RowNumber,
			SQLValueList_def *InputValueList,
			BYTE		*&ParamBuffer);
	unsigned long GetParamType(SQLSMALLINT RowNumber, 
			SQLSMALLINT ParamNumber,
			SQLSMALLINT &DataType,
			SQLLEN	*&StrLenPtr);
	unsigned long GetParamSQLInfo(SQLSMALLINT RowNumber,
			SQLSMALLINT	ParamNumber,
			SQLSMALLINT	&ParameterType,
			SQLSMALLINT	&ODBCDataType);
	SQLRETURN CopyData(CHandle		*pHandle,
			SQLSMALLINT	ImpColumnCount,
			CDesc		*IRD,
			SQLULEN		 RowsFetched,
			SQLULEN		 &CurrentRowFetched,
			SQLULEN		&RowNumber,
			SQLULEN		&RowsetSize);
	SQLRETURN ExtendedCopyData(CHandle	*pHandle,
			SQLSMALLINT	ImpColumnCount,
			CDesc		*IRD,
			SQLULEN		RowsFetched,
			SQLULEN		&CurrentRowFetched,
			SQLULEN		&RowNumber,
			SQLULEN		&RowsetSize,
			SQLUSMALLINT* RowStatusArray);
	unsigned long GetData(SQLValue_def *SQLValue,
			SQLUSMALLINT ColumnNumber,
			SQLSMALLINT TargetType,
			SQLPOINTER	TargetValuePtr, 
			SQLLEN		BufferLength,
			SQLLEN		*StrLen_or_IndPtr,
			UCHAR		*errorMsg,
			SWORD		errorMsgMax,
			BOOL		ColumnwiseData);
	unsigned long AssignDataAtExecValue(SQLValue_def *DataAtExecData,
			CDesc		*APD,
			SQLINTEGER	ODBCAppVersion,
			SQLSMALLINT ParamNumber, 
			SQLSMALLINT RowNumber,
			SQLValueList_def *OutputValueList,
			UCHAR		*errorMsg,
			SWORD		errorMsgMax);
	unsigned long ParamData(SQLSMALLINT RowNumber, SQLSMALLINT ParamNumber, SQLPOINTER *ValuePtrPtr);
	SQLRETURN CopyDesc(SQLHDESC SourceDescHandle);
	SQLRETURN SetPos(SQLSMALLINT NumResultCols);

	inline SQLINTEGER getRecLength() { return m_DescRecLength; };
	inline void setRowsProcessed(SQLUINTEGER RowsProcessed) { 
		if (m_DescRowsProcessedPtr != NULL) 
			*m_DescRowsProcessedPtr = RowsProcessed;
	};
	inline void setDescArrayStatus(SQLULEN MaxRowNumber, SQLUSMALLINT value = SQL_ROW_IGNORE ) {
		if (m_DescArrayStatusPtr != NULL)
			for( SQLULEN i=0; i < MaxRowNumber; i++)
				*(m_DescArrayStatusPtr + i) = value;
	};
	inline void setDescArrayStatusAt(SQLULEN RowNumber, SQLUSMALLINT value) {
		if (m_DescArrayStatusPtr != NULL)
			*(m_DescArrayStatusPtr + RowNumber) = value;
	};
	inline SQLUINTEGER getDescArrayStatusFrom(SQLULEN RowNumber) {
		if (m_DescArrayStatusPtr != NULL)
			return *(m_DescArrayStatusPtr + RowNumber);
		return SQL_ERROR;
	};
	inline BOOL	getByteSwap() { return m_ConnectHandle->getByteSwap(); };
	inline DWORD getDataLang() { return m_ConnectHandle->getDataLang(); };
	inline DWORD getErrorMsgLang() { return m_ConnectHandle->getErrorMsgLang(); };
	inline char *getReplacementChar() { return m_ConnectHandle->getReplacementChar(); };
	inline long getDescCount(){	return m_DescCount;}
	BOOL getDescRecSQLData(long colnumber,
		SQLINTEGER& SQLCharset, SQLSMALLINT& SQLDataType, 
		SQLSMALLINT& SQLDatetimeCode, SQLINTEGER& SQLOctetLength, 
		SQLSMALLINT& SQLPrecision, SQLSMALLINT& SQLUnsigned);
	BOOL getDescRecBulkSQLData(long colnumber,
		SQLINTEGER& SQLCharset, SQLSMALLINT& SQLDataType, 
		SQLSMALLINT& SQLDatetimeCode, SQLINTEGER& SQLOctetLength, 
		SQLSMALLINT& SQLPrecision, SQLSMALLINT& SQLUnsigned);
	BOOL getDescParamRecData(long colnumber,
		SQLINTEGER& SQLCharset, SQLSMALLINT& SQLDataType, 
		SQLSMALLINT& SQLDatetimeCode, SQLINTEGER& SQLMaxLength, 
		SQLSMALLINT& SQLPrecision, SQLSMALLINT& SQLUnsigned,
		SQLSMALLINT& SQLNullable);
	BOOL getDescRowRecData(long colnumber, 
		SQLINTEGER& SQLCharset, SQLSMALLINT& SQLDataType, 
		SQLSMALLINT& SQLDatetimeCode, SQLINTEGER& SQLMaxLength, 
		SQLSMALLINT& SQLPrecision, SQLSMALLINT& SQLUnsigned,
		SQLSMALLINT& SQLNullable);
	BOOL getDescRowRecData(long colnumber, SQLSMALLINT& SQLDataType, 
		SQLINTEGER& SQLMaxLength, SQLSMALLINT& SQLNullable) ;

	inline CConnect* getDescConnect(){return m_ConnectHandle;}
	inline DWORD getTranslateOption() { return m_ConnectHandle->getTranslateOption(); };

	SQLINTEGER returnedLength(long colnumber);

private:
	short			m_DescMode;
	SQLSMALLINT		m_DescAllocType;
	SQLULEN			m_DescArraySize;
	SQLUSMALLINT	*m_DescArrayStatusPtr;
	SQLINTEGER		m_DescBindType;
	SQLLEN			*m_DescBindOffsetPtr;
	SQLSMALLINT		m_DescCount;
	SQLULEN			*m_DescRowsProcessedPtr;
	CDESCRECLIST	m_DescRecCollect;

	SQLINTEGER		m_DescRecLength;		// This field accumaltes the OctetLength of all
											// DescRec entries, which is equivalent to RecLength
	CStmt			*m_AssociatedStmt;		// Stmt Associated for IRD and IPD
	CConnect		*m_ConnectHandle;
	CHAR			*m_replacementChar;		
	SQLINTEGER		m_ODBCAppVersion;		
	DWORD			m_drvrCharSet;			
};

struct CacheDescInfo
{
	SQLINTEGER SQLCharset;
	SQLSMALLINT SQLDataType;
	SQLSMALLINT SQLDatetimeCode;
	SQLINTEGER SQLOctetLength;
	SQLSMALLINT SQLPrecision;
	SQLSMALLINT SQLUnsigned;
	SQLINTEGER bufferLength;
};
typedef CacheDescInfo CacheDescStruct;

#endif
