// @@@ 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 @@@
//
#include <windows.h>
#include "cee.h"
#include "idltype.h"
#include "odbccommon.h"
#include "Transport.h"
#include "inoutparams.h"
#include "marshalingdrvr_drvr.h"
#include "sql.h"
#include "sqlext.h"
#include "DrvrSrvr.h"

CEE_status 
odbcas_ASSvc_GetObjRefHdl_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ const CONNECTION_CONTEXT_def *inContext
		, /* In    */ const USER_DESC_def *userDesc
		, /* In    */ IDL_long srvrType
		, /* In    */ IDL_short retryCount
)
{
	IDL_long wlength;
	char *curptr;

	wlength = 0;
	VERSION_def version[4];
	VERSION_def* versionPtr = &version[0];


	IDL_long		datasourceLength = 0; // includes null terminator
	IDL_long		catalogLength = 0;    // includes null terminator
	IDL_long	 	schemaLength = 0;     // includes null terminator
	IDL_long		locationLength = 0;   // includes null terminator
	IDL_long		userRoleLength = 0;   // includes null terminator
    IDL_long		computerNameLength = 0; // includes null terminator
	IDL_long		windowTextLength = 0;   // includes null terminator
	IDL_long		connectOptionsLength = 0; // includes null terminator
	IDL_long		vprocLength = 0; // includes null terminator
	IDL_long		clientUserNameLength = 0; // includes null terminator
	IDL_unsigned_long inContextOptions1 = inContext->inContextOptions1;
	
	//
	// calculate length of the buffer for each parameter
	//
	//

	//  length of IDL_long datasourceLength
	//  length of SQL_IDENTIFIER_DEF datasource
	wlength += sizeof(datasourceLength);
    if (inContext->datasource[0] !=  '\0')
	{
		datasourceLength = strlen(inContext->datasource) + 1;
        wlength += datasourceLength;
	}
	
	//  length of IDL_long catalogLength
	//  length of SQL_IDENTIFIER_DEF catalog
	wlength += sizeof(catalogLength);
    if (inContext->catalog[0] !=  '\0')
	{
		catalogLength = strlen(inContext->catalog) + 1;
	    wlength += catalogLength;
	}

	//  length of IDL_long schemaLength
	//  length of SQL_IDENTIFIER_DEF schema
	wlength += sizeof(schemaLength);
    if (inContext->schema[0] !=  '\0')
	{
		schemaLength = strlen(inContext->schema) + 1;
	    wlength += schemaLength;
	}

	//  length of IDL_long locationLength
	//  length of SQL_IDENTIFIER_DEF location
    wlength += sizeof(locationLength);
    if (inContext->location[0] !=  '\0')
	{
		locationLength = strlen(inContext->location) + 1;
	    wlength += locationLength;
	}
	
	//  length of IDL_long userRoleLength
	//  length of SQL_IDENTIFIER_DEF userRole
	wlength += sizeof(userRoleLength);
    if (inContext->userRole[0] !=  '\0')
	{
		userRoleLength = strlen(inContext->userRole) + 1;
	    wlength += userRoleLength;
	}
  
	// length of IDL_short accessMode
	wlength += sizeof(inContext->accessMode);

	// length of IDL_short autoCommit
	wlength += sizeof(inContext->autoCommit);

	// length of IDL_long queryTimeoutSec
	wlength += sizeof(inContext->queryTimeoutSec);

	// length of IDL_long idleTimeoutSec
	wlength += sizeof(inContext->idleTimeoutSec);

	// length of IDL_long loginTimeoutSec
	wlength += sizeof(inContext->loginTimeoutSec);

	// length of IDL_short txnIsolationLevel
	wlength += sizeof(inContext->txnIsolationLevel);

	// length of IDL_short rowSetSize
	wlength += sizeof(inContext->rowSetSize);

	// length of IDL_long diagnosticFlag
	wlength += sizeof(inContext->diagnosticFlag);

	// lenght of IDL_unsigned_long
	wlength += sizeof(inContext->processId);

	//  length of IDL_long computerNameLength
	//  length of SQL_IDENTIFIER_DEF computerName
    wlength += sizeof(computerNameLength);
	if (inContext->computerName[0] !=  '\0')
	{
		computerNameLength = strlen(inContext->computerName) + 1;
	    wlength += computerNameLength;
	}

	//  length of IDL_long windowTextLength
	//  length of SQL_IDENTIFIER_DEF windowText
	wlength += sizeof(windowTextLength);
    if (inContext->windowText[0] !=  '\0')
	{
		windowTextLength = strlen(inContext->windowText) + 1;
	    wlength += windowTextLength;
	}

	// length of IDL_unsigned_long ctxACP
	wlength += sizeof(inContext->ctxACP);

	// length of IDL_unsigned_long ctxDataLang
	wlength += sizeof(inContext->ctxDataLang);

	// length of IDL_unsigned_long ctxErrorLang
	wlength += sizeof(inContext->ctxErrorLang);

	// length of IDL_short ctxCtrlInferNCHAR
	wlength += sizeof(inContext->ctxCtrlInferNCHAR);

	// length of IDL_short cpuToUse
	wlength += sizeof(inContext->cpuToUse);

	// length of IDL_short cpuToUseEnd
	wlength += sizeof(inContext->cpuToUseEnd);

	// length of IDL_long connectOptionsLength
	wlength += sizeof(connectOptionsLength);
	if(inContext->connectOptions != NULL)
	{
		connectOptionsLength = strlen(inContext->connectOptions) +1;
		wlength += connectOptionsLength;
	}

	// VERSION_LIST_def clientVersionList;
	// length of IDL_long versionListlength
	wlength += sizeof(inContext->clientVersionList._length);

	// Get the versionPtr
	versionPtr = inContext->clientVersionList._buffer;
	
	for (unsigned int i = 0; i < inContext->clientVersionList._length; i++)
	{
		// length of version[0] componentId
		wlength += sizeof(versionPtr->componentId);

		// length of version[0] majorVersion
		wlength += sizeof(versionPtr->majorVersion);

		// length of version[0] minorVersion
		wlength += sizeof(versionPtr->minorVersion);

		// length of version[0] buildId
		wlength += sizeof(versionPtr->buildId);
		
		// Get the next versionlist values
 		versionPtr++;
	}


	// 2nd Parameter

	IDL_unsigned_long userSidLength = 0;
	IDL_long domainNameLength = 0;
	IDL_long userNameLength = 0;
	IDL_long passwordLength = 0;


	// length of userDesc type
	wlength += sizeof(userDesc->userDescType);

	// length of userSid
	wlength += sizeof(userSidLength);
	if (userDesc->userSid._buffer != NULL && userDesc->userSid._length > 0)
	{
	   userSidLength = strlen((char *)userDesc->userSid._buffer) + 1;
	   wlength += userSidLength;
	}
	
	// length of domainName
    wlength += sizeof(domainNameLength);
	if (userDesc->domainName != NULL && userDesc->domainName[0] != '\0')
	{
		domainNameLength = strlen(userDesc->domainName) + 1;
		wlength += domainNameLength;
	}

	// length of userName
	wlength += sizeof(userNameLength);
	if (userDesc->userName != NULL && userDesc->userName[0] != '\0')
	{
		userNameLength = strlen(userDesc->userName) + 1;
		wlength += userNameLength;
	}

	// length of password
	wlength += sizeof(passwordLength);
	if (userDesc->password._buffer != NULL)
	{
	   passwordLength = strlen((char *)userDesc->password._buffer) + 1;
	   wlength += passwordLength;
	}

	// 3rd Parameter
	// length of serverType
	wlength += sizeof(srvrType);

	// 4th Parameter
	// length of retryCount
	wlength += sizeof(retryCount);

	// 5th Param: inContext Options

	wlength += sizeof(inContext->inContextOptions1);
	wlength += sizeof(inContext->inContextOptions2);


	// 6th Parameter: Vproc String
	//
	wlength += sizeof(vprocLength);
	vprocLength = strlen(inContext->clientVproc);
	if (vprocLength > 0)
	{
	   vprocLength = vprocLength+ 1;
	   wlength += vprocLength;
	}

	// 7th Parameter: clientUserName String
	//
	if(inContextOptions1 & INCONTEXT_OPT1_CLIENT_USERNAME)
	{
		wlength += sizeof(clientUserNameLength);
		clientUserNameLength = strlen(inContext->clientUserName);
		if (clientUserNameLength > 0)
		{
		   clientUserNameLength = clientUserNameLength + 1;
		   wlength += clientUserNameLength;
		}
	}

    // Mesage Length
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}
	curptr = buffer;
	

    // Swap and then copy the values
    
    // Copy datasource length
	LONG_swap(&datasourceLength);
	IDL_long_copy(&datasourceLength, curptr);
    // copy datasource
	if (inContext->datasource[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->datasource, curptr);
	}
	
	// copy catalog length
	LONG_swap(&catalogLength);
	IDL_long_copy(&catalogLength, curptr);
	// copy catalog
    if (inContext->catalog[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->catalog, curptr);
	}

	// copy schema length
	LONG_swap(&schemaLength);
	IDL_long_copy(&schemaLength, curptr);
	// copy schema
    if (inContext->schema[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->schema, curptr);
	}

	// copy location length
	LONG_swap(&locationLength);
	IDL_long_copy(&locationLength, curptr);
	// copy location
    if (inContext->location[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->location, curptr);
	}
	
	// copy userRole length
	LONG_swap(&userRoleLength);
	IDL_long_copy(&userRoleLength, curptr);
	// copy userRole
	if (inContext->userRole[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->userRole, curptr);
	}

	// copy accessMode
	SHORT_swap((IDL_short *)&inContext->accessMode);
	IDL_short_copy((IDL_short *)&inContext->accessMode, curptr);
	SHORT_swap((IDL_short *)&inContext->accessMode);  

	// copy autoCommit
	SHORT_swap((IDL_short *)&inContext->autoCommit);
	IDL_short_copy((IDL_short *)&inContext->accessMode, curptr);
	SHORT_swap((IDL_short *)&inContext->autoCommit);

	// copy queryTimeoutSec
	LONG_swap((IDL_long *)&inContext->queryTimeoutSec);
	IDL_long_copy((IDL_long *)&inContext->queryTimeoutSec, curptr);
	LONG_swap((IDL_long *)&inContext->queryTimeoutSec);

	// copy idleTimeoutSec
	LONG_swap((IDL_long *)&inContext->idleTimeoutSec);
	IDL_long_copy((IDL_long *)&inContext->idleTimeoutSec, curptr);
	LONG_swap((IDL_long *)&inContext->idleTimeoutSec);

	// copy loginTimeoutSec
	LONG_swap((IDL_long *)&inContext->loginTimeoutSec);
	IDL_long_copy((IDL_long *)&inContext->loginTimeoutSec, curptr);
	LONG_swap((IDL_long *)&inContext->loginTimeoutSec);

	// copy txnIsolationLevel
	SHORT_swap((IDL_short *)&inContext->txnIsolationLevel);
	IDL_short_copy((IDL_short *)&inContext->txnIsolationLevel, curptr);
	SHORT_swap((IDL_short *)&inContext->txnIsolationLevel);

	//copy rowSetSize
	SHORT_swap((IDL_short *)&inContext->rowSetSize);
	IDL_short_copy((IDL_short *)&inContext->rowSetSize, curptr);
	SHORT_swap((IDL_short *)&inContext->rowSetSize);

	// copy diagnosticFlag
	LONG_swap((IDL_long *)&inContext->diagnosticFlag);
	IDL_long_copy((IDL_long *)&inContext->diagnosticFlag, curptr);
	LONG_swap((IDL_long *)&inContext->diagnosticFlag);

	// copy processId
	ULONG_swap((IDL_unsigned_long *)&inContext->processId);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->processId, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->processId);


	// copy computerNameLength
	LONG_swap(&computerNameLength);
	IDL_long_copy(&computerNameLength, curptr);
	// copy computerName
	if (inContext->computerName[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->computerName, curptr);

	}

	// copy windowTextLength
	LONG_swap(&windowTextLength);
	IDL_long_copy(&windowTextLength, curptr);
	// copy windowText
	if (inContext->windowText !=  NULL)
	{
		IDL_charArray_copy(inContext->windowText, curptr);
	}
 
	// copy ctxACP
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxACP);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->ctxACP, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxACP);
	
	// copy ctxDataLang
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxDataLang);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->ctxDataLang, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxDataLang);

	// copy ctxErrorLang
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxErrorLang);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->ctxErrorLang, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxErrorLang);

	// copy ctxCtrlInferNCHAR
	SHORT_swap((IDL_short *)&inContext->ctxCtrlInferNCHAR);
	IDL_short_copy((IDL_short *)&inContext->ctxCtrlInferNCHAR, curptr);
	SHORT_swap((IDL_short *)&inContext->ctxCtrlInferNCHAR);

	// copy cpuToUse
	SHORT_swap((IDL_short *)&inContext->cpuToUse);
	IDL_short_copy((IDL_short *)&inContext->cpuToUse, curptr);
	SHORT_swap((IDL_short *)&inContext->cpuToUse);

	// copy cpuToUseEnd
	SHORT_swap((IDL_short *)&inContext->cpuToUseEnd);
	IDL_short_copy((IDL_short *)&inContext->cpuToUseEnd, curptr);
	SHORT_swap((IDL_short *)&inContext->cpuToUseEnd);


	// copy connectOptions
	LONG_swap(&connectOptionsLength);
	IDL_long_copy(&connectOptionsLength, curptr);
	if (connectOptionsLength > 0)
	{
		IDL_charArray_copy(inContext->connectOptions, curptr);
	}


	// copy versionList Length
	ULONG_swap((IDL_unsigned_long *)&inContext->clientVersionList._length);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->clientVersionList._length, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->clientVersionList._length);
	

	versionPtr = inContext->clientVersionList._buffer;
	
	for (unsigned int j = 0; j < inContext->clientVersionList._length; j++)
	{
		// copy componentId
		SHORT_swap(&versionPtr->componentId);
		IDL_short_copy(&versionPtr->componentId, curptr);
		SHORT_swap(&versionPtr->componentId);

		// copy majorVersion
		SHORT_swap(&versionPtr->majorVersion);
		IDL_short_copy(&versionPtr->majorVersion, curptr);
		SHORT_swap(&versionPtr->majorVersion);

		// copy minorVersion
		SHORT_swap(&versionPtr->minorVersion);
		IDL_short_copy(&versionPtr->minorVersion, curptr);
		SHORT_swap(&versionPtr->minorVersion);

		// copy buildId
		ULONG_swap(&versionPtr->buildId);
		IDL_unsigned_long_copy(&versionPtr->buildId, curptr);
		ULONG_swap(&versionPtr->buildId);
		
		// Get the next versionlist values
 		versionPtr++;
	}

	// Copy 2nd Parameter

	// copy userDesc Type

	LONG_swap((IDL_long *)&userDesc->userDescType);
	IDL_long_copy((IDL_long *)&userDesc->userDescType, curptr);
	LONG_swap((IDL_long *)&userDesc->userDescType);

	// copy userSidLength
	ULONG_swap((IDL_unsigned_long *)&userSidLength);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&userSidLength, curptr);
	
	// copy userSid
	if (userSidLength > 0)
	{
		IDL_charArray_copy((char *)userDesc->userSid._buffer, curptr);
	}
	
	// copy domainNameLength
	LONG_swap(&domainNameLength);
	IDL_long_copy(&domainNameLength, curptr);
	// copy domainName
	if (userDesc->domainName != NULL && userDesc->domainName[0] != '\0')
	{
		IDL_charArray_copy(userDesc->domainName, curptr);
	}

	// copy userNameLength
	LONG_swap(&userNameLength);
	IDL_long_copy(&userNameLength, curptr);
	// copy userName
	if (userDesc->userName != NULL && userDesc->userName[0] != '\0')
	{
		IDL_charArray_copy(userDesc->userName, curptr);
	}


	// copy passwordLength
	ULONG_swap((IDL_unsigned_long *)&passwordLength);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&passwordLength, curptr);

	// copy password
	if (userDesc->password._buffer != NULL)
	{
		IDL_charArray_copy((char *)userDesc->password._buffer, curptr);
	}
 
	// Copy 3rd Parameter
	// copy serverType
	LONG_swap(&srvrType);
	IDL_long_copy(&srvrType, curptr);
	LONG_swap(&srvrType);

	// Copy 4th Parameter
	// copy retryCount
	SHORT_swap(&retryCount);
	IDL_short_copy(&retryCount, curptr);
	SHORT_swap(&retryCount);

	//
	// 5th Param
	// Incontext options
	ULONG_swap((IDL_unsigned_long *)&inContext->inContextOptions1);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->inContextOptions1, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->inContextOptions1);

	ULONG_swap((IDL_unsigned_long *)&inContext->inContextOptions2);
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->inContextOptions2, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->inContextOptions2);



	// 6th Parameter: Vproc String
	LONG_swap(&vprocLength);
	IDL_long_copy(&vprocLength, curptr);
	LONG_swap(&vprocLength);
	if(vprocLength > 0)
	{
		IDL_charArray_copy((char *)inContext->clientVproc, curptr);
	}

	// 7th Parameter: Vproc String
	if(inContextOptions1 & INCONTEXT_OPT1_CLIENT_USERNAME)
	{
		LONG_swap(&clientUserNameLength);
		IDL_long_copy(&clientUserNameLength, curptr);
		LONG_swap(&clientUserNameLength);
		if(clientUserNameLength > 0)
		{
			IDL_charArray_copy((char *)inContext->clientUserName, curptr);
		}
	}

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

}


CEE_status
odbcas_ASSvc_StopSrvr_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ DIALOGUE_ID_def dialogueId
		, /* In    */ IDL_long srvrType
		, /* In    */ const IDL_char *srvrObjRef
		, /* In    */ IDL_long StopType
)
{

	IDL_char *curptr = NULL;
	IDL_long wlength =  0;
	IDL_long srvrObjRefLen = 0;

//
// calculate length of the buffer for each parameter
//

//
// length of DIALOGUE_ID_def dialogueId
//
	wlength += sizeof(dialogueId);

//
// length of IDL_long srvrType
//
	wlength += sizeof(srvrType);

//
// length of IDL_char *srvrObjRef
//
	wlength += sizeof(srvrObjRefLen);
	if (srvrObjRef != NULL)
	{
		srvrObjRefLen = strlen(srvrObjRef) + 1;
		wlength += srvrObjRefLen;
	}

//
// length of IDL_long StopType
//
	wlength += sizeof(StopType);

//
// message length
//
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}

	curptr = buffer;

	if(pSystem->swap() == SWAP_YES)
	{
		LONG_swap(&dialogueId);
		LONG_swap(&srvrType);
		LONG_swap(&srvrObjRefLen);
		LONG_swap(&StopType);
	}


//
// copy DIALOGUE_ID_def dialogueId
//
	IDL_long_copy(&dialogueId, curptr);

//
// copy IDL_long srvrType
//
	IDL_long_copy(&srvrType, curptr);

//	
// copy IDL_char* srvrObjRef
//
	IDL_long_copy(&srvrObjRefLen, curptr);
	if(srvrObjRefLen > 0)
	   IDL_charArray_copy(srvrObjRef, curptr);

//
// copy IDL_long StopType
//
	IDL_long_copy(&StopType, curptr);

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} // odbcas_ASSvc_StopSrvr_param_pst_()


CEE_status
odbc_SQLSvc_InitializeDialogue_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ const USER_DESC_def *userDesc
		, /* In    */ const CONNECTION_CONTEXT_def *inContext
		, /* In    */ DIALOGUE_ID_def dialogueId
  )
{
	IDL_long wlength;
	char *curptr;

	wlength = 0;
	VERSION_def version[4];
	VERSION_def* versionPtr = &version[0];


	IDL_long		datasourceLength = 0; // includes null terminator
	IDL_long		catalogLength = 0;    // includes null terminator
	IDL_long	 	schemaLength = 0;     // includes null terminator
	IDL_long		locationLength = 0;   // includes null terminator
	IDL_long		userRoleLength = 0;   // includes null terminator
		
	IDL_long		computerNameLength = 0; // includes null terminator
	IDL_long		windowTextLength = 0;   // includes null terminator
	IDL_long        connectOptionsLength = 0; // includes null terminator
	IDL_long		sessionNameLength = 0; // includes null terminator
	IDL_long		clientUserNameLength = 0; // includes null terminator
	IDL_unsigned_long inContextOptions1 = inContext->inContextOptions1;
	
	//
	// calculate length of the buffer for each parameter
	//
	//

	// 1st Parameter

	IDL_unsigned_long userSidLength = 0;
	IDL_long domainNameLength = 0;
	IDL_long userNameLength = 0;
	IDL_long passwordLength = 0;


	// length of userDesc type
	wlength += sizeof(userDesc->userDescType);

	// length of userSid
	wlength += sizeof(userSidLength);
	if (userDesc->userSid._buffer != NULL && userDesc->userSid._length > 0)
	{
	   userSidLength = strlen((char *)userDesc->userSid._buffer) + 1;
	   wlength += userSidLength;
	}
	
	// length of domainName
	wlength += sizeof(domainNameLength);
	if (userDesc->domainName[0] != '\0')
	{
		domainNameLength = strlen(userDesc->domainName) + 1;
		wlength += domainNameLength;
	}

	// length of userName
	wlength += sizeof(userNameLength);
	if (userDesc->userName != 0 && userDesc->userName[0] != '\0')
	{
		userNameLength = strlen(userDesc->userName) + 1;
		wlength += userNameLength;
	}

	// length of password
    wlength += sizeof(passwordLength);
	if (userDesc->password._buffer != NULL)
	{
	   //passwordLength = strlen((char *)userDesc->password._buffer) + 1;
	   passwordLength = userDesc->password._length + 1;
	   wlength += passwordLength;
	}


	// 2nd Parameter

	//  length of IDL_long datasourceLength
	//  length of SQL_IDENTIFIER_DEF datasource
    wlength += sizeof(datasourceLength);
    if (inContext->datasource[0] !=  '\0')
	{
		datasourceLength = strlen(inContext->datasource) + 1;
	    wlength += datasourceLength;
	}
	
	//  length of IDL_long catalogLength
	//  length of SQL_IDENTIFIER_DEF catalog
    wlength += sizeof(catalogLength);
    if (inContext->catalog[0] !=  '\0')
	{
		catalogLength = strlen(inContext->catalog) + 1;
	    wlength += catalogLength;
	}

	//  length of IDL_long schemaLength
	//  length of SQL_IDENTIFIER_DEF schema
    wlength += sizeof(schemaLength);
    if (inContext->schema[0] !=  '\0')
	{
		schemaLength = strlen(inContext->schema) + 1;
	    wlength += schemaLength;
	}

	//  length of IDL_long locationLength
	//  length of SQL_IDENTIFIER_DEF location
    wlength += sizeof(locationLength);
    if (inContext->location[0] !=  '\0')
	{
		locationLength = strlen(inContext->location) + 1;
	    wlength += locationLength;
	}
	
	//  length of IDL_long userRoleLength
	//  length of SQL_IDENTIFIER_DEF userRole
    wlength += sizeof(userRoleLength);
    if (inContext->userRole[0] !=  '\0')
	{
		userRoleLength = strlen(inContext->userRole) + 1;
	    wlength += userRoleLength;
	}
  
	// length of IDL_short accessMode
	wlength += sizeof(inContext->accessMode);

	// length of IDL_short autoCommit
	wlength += sizeof(inContext->autoCommit);

	// length of IDL_long queryTimeoutSec
	wlength += sizeof(inContext->queryTimeoutSec);

	// length of IDL_long idleTimeoutSec
	wlength += sizeof(inContext->idleTimeoutSec);

	// length of IDL_long loginTimeoutSec
	wlength += sizeof(inContext->loginTimeoutSec);

	// length of IDL_short txnIsolationLevel
	wlength += sizeof(inContext->txnIsolationLevel);

	// length of IDL_short rowSetSize
	wlength += sizeof(inContext->rowSetSize);

	// length of IDL_long diagnosticFlag
	wlength += sizeof(inContext->diagnosticFlag);

	// lenght of IDL_unsigned_long
	wlength += sizeof(inContext->processId);

	//  length of IDL_long computerNameLength
	//  length of SQL_IDENTIFIER_DEF computerName
    wlength += sizeof(computerNameLength);
	if (inContext->computerName[0] !=  '\0')
	{
		computerNameLength = strlen(inContext->computerName) + 1;
	    wlength += computerNameLength;
	}

	//  length of IDL_long windowTextLength
	//  length of SQL_IDENTIFIER_DEF windowText
    wlength += sizeof(windowTextLength);
    if (inContext->windowText[0] !=  '\0')
	{
		windowTextLength = strlen(inContext->windowText) + 1;
	    wlength += windowTextLength;
	}

	// length of IDL_unsigned_long ctxACP
	wlength += sizeof(inContext->ctxACP);

	// length of IDL_unsigned_long ctxDataLang
	wlength += sizeof(inContext->ctxDataLang);

	// length of IDL_unsigned_long ctxErrorLang
	wlength += sizeof(inContext->ctxErrorLang);

	// length of IDL_short ctxCtrlInferNCHAR
	wlength += sizeof(inContext->ctxCtrlInferNCHAR);

	// length of IDL_short cpuToUse
	wlength += sizeof(inContext->cpuToUse);

	// length of IDL_short cpuToUseEnd
	wlength += sizeof(inContext->cpuToUseEnd);


	// length of IDL_long connectOptionsLength
	wlength += sizeof(connectOptionsLength);

	if(inContext->connectOptions != NULL)
	{
		connectOptionsLength = strlen(inContext->connectOptions) +1;
		wlength += connectOptionsLength;
	}


	// VERSION_LIST_def clientVersionList;
	// length of IDL_long versionListlength
	wlength += sizeof(inContext->clientVersionList._length);

	// Get the versionPtr
	versionPtr = inContext->clientVersionList._buffer;
	
	for (unsigned int i = 0; i < inContext->clientVersionList._length; i++)
	{
		// length of version[0] componentId
		wlength += sizeof(versionPtr->componentId);

		// length of version[0] majorVersion
		wlength += sizeof(versionPtr->majorVersion);

		// length of version[0] minorVersion
		wlength += sizeof(versionPtr->minorVersion);

		// length of version[0] buildId
		wlength += sizeof(versionPtr->buildId);
		
		// Get the next versionlist values
 		versionPtr++;
	}



	// 3rd Parameter
	// length of dialogueId
	wlength += sizeof(dialogueId);

	//
	// 5th Param
	// Incontext options
	wlength += sizeof(inContext->inContextOptions1);
	wlength += sizeof(inContext->inContextOptions2);

	if(inContextOptions1 & INCONTEXT_OPT1_SESSIONNAME)
	{
		wlength += sizeof(sessionNameLength);
		sessionNameLength = strlen(inContext->sessionName);
		if(sessionNameLength > 0)
		{
			sessionNameLength += 1; // For the null terminator
			wlength += sessionNameLength;
		}
	}

	if(inContextOptions1 & INCONTEXT_OPT1_CLIENT_USERNAME)
	{
		wlength += sizeof(clientUserNameLength);
		clientUserNameLength = strlen(inContext->clientUserName);
		if(clientUserNameLength > 0)
		{
			clientUserNameLength += 1; // For the null terminator
			wlength += clientUserNameLength;
		}
	}

    // Mesage Length
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}
	curptr = buffer;
	

    // Swap and then copy the values

	// Copy 1st Parameter
	// copy userDesc Type

	LONG_swap((IDL_long *)&userDesc->userDescType,pSystem->swap());
	IDL_long_copy((IDL_long *)&userDesc->userDescType, curptr);
	LONG_swap((IDL_long *)&userDesc->userDescType,pSystem->swap());

	// copy userSidLength
	ULONG_swap((IDL_unsigned_long *)&userSidLength,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&userSidLength, curptr);
	
	// copy userSid
	if (userSidLength > 0)
	{
		IDL_charArray_copy((char *)userDesc->userSid._buffer, curptr);
	}
	
	// copy domainNameLength
	LONG_swap(&domainNameLength,pSystem->swap());
	IDL_long_copy(&domainNameLength, curptr);
	// copy domainName
	if (userDesc->domainName != NULL && userDesc->domainName[0] != '\0')
	{
		IDL_charArray_copy(userDesc->domainName, curptr);
	}

	// copy userNameLength
	LONG_swap(&userNameLength,pSystem->swap());
	IDL_long_copy(&userNameLength, curptr);
	// copy userName
	if (userDesc->userName != NULL && userDesc->userName[0] != '\0')
	{
		IDL_charArray_copy(userDesc->userName, curptr);
	}


	// copy passwordLength
	IDL_unsigned_long tmp_passwordLength = (IDL_unsigned_long) passwordLength;
	ULONG_swap((IDL_unsigned_long *)&passwordLength,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&passwordLength, curptr);
	// copy password
	if (userDesc->password._buffer != NULL)
	{
		//Modified by Arvind to support the blank and 0 values
		IDL_byteArray_copy(userDesc->password._buffer,tmp_passwordLength, curptr);
	}

    
	// Copy 2nd Parameter
    // Copy datasource length
	LONG_swap(&datasourceLength,pSystem->swap());
	IDL_long_copy(&datasourceLength, curptr);
    // copy datasource
	if (inContext->datasource[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->datasource, curptr);
	}
	
	// copy catalog length
	LONG_swap(&catalogLength,pSystem->swap());
	IDL_long_copy(&catalogLength, curptr);
	// copy catalog
    if (inContext->catalog[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->catalog, curptr);
	}

	// copy schema length
	LONG_swap(&schemaLength,pSystem->swap());
	IDL_long_copy(&schemaLength, curptr);
	// copy schema
    if (inContext->schema[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->schema, curptr);
	}

	// copy location length
	LONG_swap(&locationLength,pSystem->swap());
	IDL_long_copy(&locationLength, curptr);
	// copy location
    if (inContext->location[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->location, curptr);
	}
	
	// copy userRole length
	LONG_swap(&userRoleLength,pSystem->swap());
	IDL_long_copy(&userRoleLength, curptr);
	// copy userRole
	if (inContext->userRole[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->userRole, curptr);
	}

	// copy accessMode
	SHORT_swap((short *)&inContext->accessMode,pSystem->swap());
	IDL_short_copy((short *)&inContext->accessMode, curptr);
	SHORT_swap((short *)&inContext->accessMode,pSystem->swap());

	// copy autoCommit
	SHORT_swap((short *)&inContext->autoCommit,pSystem->swap());
	IDL_short_copy((short *)&inContext->autoCommit, curptr);
	SHORT_swap((short *)&inContext->autoCommit,pSystem->swap());

	// copy queryTimeoutSec
	LONG_swap((IDL_long *)&inContext->queryTimeoutSec,pSystem->swap());
	IDL_long_copy((IDL_long *)&inContext->queryTimeoutSec, curptr);
	LONG_swap((IDL_long *)&inContext->queryTimeoutSec,pSystem->swap());

	// copy idleTimeoutSec
	LONG_swap((IDL_long *)&inContext->idleTimeoutSec,pSystem->swap());
	IDL_long_copy((IDL_long *)&inContext->idleTimeoutSec, curptr);
	LONG_swap((IDL_long *)&inContext->idleTimeoutSec,pSystem->swap());

	// copy loginTimeoutSec
	LONG_swap((IDL_long *)&inContext->loginTimeoutSec,pSystem->swap());
	IDL_long_copy((IDL_long *)&inContext->loginTimeoutSec, curptr);
	LONG_swap((IDL_long *)&inContext->loginTimeoutSec,pSystem->swap());

	// copy txnIsolationLevel
	SHORT_swap((short *)&inContext->txnIsolationLevel,pSystem->swap());
	IDL_short_copy((short *)&inContext->txnIsolationLevel, curptr);
	SHORT_swap((short *)&inContext->txnIsolationLevel,pSystem->swap());

	//copy rowSetSize
	SHORT_swap((short *)&inContext->rowSetSize,pSystem->swap());
	IDL_short_copy((short *)&inContext->rowSetSize, curptr);
	SHORT_swap((short *)&inContext->rowSetSize,pSystem->swap());

	// copy diagnosticFlag
	LONG_swap((IDL_long *)&inContext->diagnosticFlag,pSystem->swap());
	IDL_long_copy((IDL_long *)&inContext->diagnosticFlag, curptr);
	LONG_swap((IDL_long *)&inContext->diagnosticFlag,pSystem->swap());

	// copy processId
	ULONG_swap((IDL_unsigned_long *)&inContext->processId,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->processId, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->processId,pSystem->swap());


	// copy computerNameLength
	LONG_swap(&computerNameLength,pSystem->swap());
	IDL_long_copy(&computerNameLength, curptr);
	// copy computerName
	if (inContext->computerName[0] !=  '\0')
	{
		IDL_charArray_copy(inContext->computerName, curptr);

	}

	// copy windowTextLength
	LONG_swap(&windowTextLength,pSystem->swap());
	IDL_long_copy(&windowTextLength, curptr);
	// copy windowText
	if (inContext->windowText !=  NULL)
	{
		IDL_charArray_copy(inContext->windowText, curptr);
	}
 
	// copy ctxACP
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxACP,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->ctxACP, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxACP,pSystem->swap());
	
	// copy ctxDataLang
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxDataLang,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->ctxDataLang, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxDataLang,pSystem->swap());

	// copy ctxErrorLang
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxErrorLang,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->ctxErrorLang, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->ctxErrorLang,pSystem->swap());

	// copy ctxCtrlInferNCHAR
	SHORT_swap((short *)&inContext->ctxCtrlInferNCHAR,pSystem->swap());
	IDL_short_copy((short *)&inContext->ctxCtrlInferNCHAR, curptr);
	SHORT_swap((short *)&inContext->ctxCtrlInferNCHAR,pSystem->swap());

	// copy cpuToUse
	SHORT_swap((IDL_short *)&inContext->cpuToUse,pSystem->swap());
	IDL_short_copy((IDL_short *)&inContext->cpuToUse, curptr);
	SHORT_swap((IDL_short *)&inContext->cpuToUse,pSystem->swap());

	// copy cpuToUseEnd
	SHORT_swap((IDL_short *)&inContext->cpuToUseEnd,pSystem->swap());
	IDL_short_copy((IDL_short *)&inContext->cpuToUseEnd, curptr);
	SHORT_swap((IDL_short *)&inContext->cpuToUseEnd,pSystem->swap());


	// copy connectOptions
	LONG_swap(&connectOptionsLength,pSystem->swap());
	IDL_long_copy(&connectOptionsLength, curptr);
	if (connectOptionsLength > 0)
	{
		IDL_charArray_copy(inContext->connectOptions, curptr);
	}

	// copy versionList Length
	ULONG_swap((IDL_unsigned_long *)&inContext->clientVersionList._length,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->clientVersionList._length, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->clientVersionList._length,pSystem->swap());
	

	versionPtr = inContext->clientVersionList._buffer;
	
	for (unsigned int j = 0; j < inContext->clientVersionList._length; j++)
	{
		// copy componentId
		SHORT_swap(&versionPtr->componentId,pSystem->swap());
		IDL_short_copy(&versionPtr->componentId, curptr);
		SHORT_swap(&versionPtr->componentId,pSystem->swap());

		// copy majorVersion
		SHORT_swap(&versionPtr->majorVersion,pSystem->swap());
		IDL_short_copy(&versionPtr->majorVersion, curptr);
		SHORT_swap(&versionPtr->majorVersion,pSystem->swap());

		// copy minorVersion
		SHORT_swap(&versionPtr->minorVersion,pSystem->swap());
		IDL_short_copy(&versionPtr->minorVersion, curptr);
		SHORT_swap(&versionPtr->minorVersion,pSystem->swap());

		// copy buildId
		ULONG_swap(&versionPtr->buildId,pSystem->swap());
		IDL_unsigned_long_copy(&versionPtr->buildId, curptr);
		ULONG_swap(&versionPtr->buildId,pSystem->swap());
		
		// Get the next versionlist values
 		versionPtr++;
	}


 
	// Copy 3rd Parameter
	// copy dialogueId
	LONG_swap(&dialogueId,pSystem->swap());
	IDL_long_copy(&dialogueId, curptr);
	LONG_swap(&dialogueId,pSystem->swap());

	ULONG_swap((IDL_unsigned_long *)&inContext->inContextOptions1,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->inContextOptions1, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->inContextOptions1,pSystem->swap());

	ULONG_swap((IDL_unsigned_long *)&inContext->inContextOptions2,pSystem->swap());
	IDL_unsigned_long_copy((IDL_unsigned_long *)&inContext->inContextOptions2, curptr);
	ULONG_swap((IDL_unsigned_long *)&inContext->inContextOptions2,pSystem->swap());

	if(inContextOptions1 & INCONTEXT_OPT1_SESSIONNAME)
	{
	LONG_swap(&sessionNameLength,pSystem->swap());
	IDL_long_copy(&sessionNameLength, curptr);
	if (sessionNameLength > 0)
		IDL_charArray_copy(inContext->sessionName, curptr);
	}

	if(inContextOptions1 & INCONTEXT_OPT1_CLIENT_USERNAME)
	{
		LONG_swap(&clientUserNameLength,pSystem->swap());
		IDL_long_copy(&clientUserNameLength, curptr);
		if (clientUserNameLength > 0)
			IDL_charArray_copy(inContext->clientUserName, curptr);
	}

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} // odbc_SQLSvc_InitializeDialogue_param_pst_()

CEE_status
odbc_SQLSvc_TerminateDialogue_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ DIALOGUE_ID_def dialogueId
  )
{
	IDL_long wlength;
	IDL_char *curptr;

	wlength = 0;

	//
	// calculate length of the buffer for each parameter
	//
	//

	// 1st Parameter

	// length of dialogueId
	wlength += sizeof(dialogueId);

    // Mesage Length
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}
	curptr = buffer;
	

    // Swap and then copy the values
	// Copy 1st Parameter
	// copy dialogueId
	LONG_swap(&dialogueId,pSystem->swap());
	IDL_long_copy(&dialogueId, curptr);
	LONG_swap(&dialogueId,pSystem->swap());

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} // odbc_SQLSvc_TerminateDialogue_param_pst_()


CEE_status
odbc_SQLDrvr_SetConnectionOption_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ DIALOGUE_ID_def dialogueId
		, /* In    */ IDL_short connectionOption
		, /* In    */ IDL_long optionValueNum
		, /* In    */ IDL_string optionValueStr
  )
{
	IDL_long wlength = 0;
	IDL_long optionValueStrLen = 0;
	IDL_char *curptr;

//
// calculate length of the buffer for each parameter
//
//

//
//  length of DIALOGUE_ID_def dialogueId
//
	wlength += sizeof(dialogueId);

//
// length of IDL_short connectionOption
// 
	wlength += sizeof (connectionOption);

//
// length IDL_long optionValueNum
//
	wlength += sizeof(optionValueNum);

//
// length of IDL_long optionValueStrLen + IDL_string optionValueStr
//
	wlength += sizeof(optionValueStrLen);

	if (optionValueStr != NULL)
		optionValueStrLen = strlen(optionValueStr) + 1;
	else
		optionValueStr = 0;

	wlength += optionValueStrLen;


//
// message length
//
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}

	curptr = buffer;

	if(pSystem->swap() == SWAP_YES)
	{
		LONG_swap(&dialogueId);
		SHORT_swap(&connectionOption);
		LONG_swap(&optionValueNum);
		LONG_swap(&optionValueStrLen);
	}

//
// copy DIALOGUE_ID_def dialogueId
//
	IDL_long_copy(&dialogueId, curptr);
//
// copy IDL_short connectionOption
//
	IDL_short_copy(&connectionOption, curptr);
//
//
// copy IDL_long optionValueNum
//
	IDL_long_copy(&optionValueNum, curptr);
//
//
//
// copy IDL_string optionValueStr
//
	IDL_long_copy(&optionValueStrLen, curptr);
	if (optionValueStr != NULL)
		IDL_charArray_copy(optionValueStr, curptr);

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} // odbc_SQLDrvr_SetConnectionOption_param_pst_()


CEE_status
odbc_SQLDrvr_Fetch_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ DIALOGUE_ID_def dialogueId
		, /* In    */ IDL_unsigned_long_long MaxRowCnt
		, /* In    */ IDL_unsigned_long_long MaxRowLen
		, /* In    */ IDL_long sqlAsyncEnable
		, /* In    */ IDL_long queryTimeout
		, /* In    */ Long stmtHandle
        , /* In    */ const IDL_char *stmtLabel
		, /* In    */ IDL_long stmtCharset
		, /* In    */ IDL_string cursorName
		, /* In    */ IDL_long cursorCharset
		, /* In    */ const IDL_char *setStmtOptions
)
{
	IDL_long	wlength = 0;
	IDL_char	*curptr = NULL;

	IDL_long stmtLabelLength      = 0;
	IDL_long cursorLength         = 0;
	IDL_long setStmtOptionsLength = 0;


//
// calculate length of the buffer for each parameter
//

//
//  length of DIALOGUE_ID_def dialogueId
//
	wlength += sizeof(dialogueId);

//
// length of IDL_long sqlAsyncEnable
//
	wlength += sizeof(sqlAsyncEnable);

//
// length of IDL_long queryTimeout
//
	wlength += sizeof(queryTimeout);

//
// length of IDL_long stmtHandle
// 
	wlength += sizeof(stmtHandle);

//
// length of IDL_long stmtLength
// length of IDL_char *stmtLabel
// length of IDL_long stmtCharset
// 
	wlength += sizeof(stmtLabelLength);
	if (stmtLabel != NULL)
	{
        stmtLabelLength = strlen(stmtLabel) + 1;
		wlength += stmtLabelLength;
		wlength += sizeof(stmtCharset);
	}
	else
	{
		stmtLabelLength = 0;
	}


//
// length of IDL_long MaxRowCnt
//
	wlength += sizeof(MaxRowCnt);

//
// length of IDL_long MaxRowLen
//
	wlength += sizeof(MaxRowLen);


//
// length of IDL_long cursorLength
// length IDL_string cursorName
// length of IDL_long cursorCharset
//
    wlength += sizeof(cursorLength);
	if (cursorName != NULL)
	{
		wlength += strlen(cursorName) +1;
		wlength += sizeof(cursorCharset);
	}

//
// length of IDL_long setStmtOptionsLength
// length of IDL_string setStmtOptions
// 
	wlength += sizeof(setStmtOptionsLength);
	if (setStmtOptions != NULL)
	{
		setStmtOptionsLength = strlen(setStmtOptions) + 1;
		wlength += setStmtOptionsLength;
	}


	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}

	curptr = buffer;

	if(pSystem->swap() == SWAP_YES)
	{
		LONG_swap(&dialogueId);
		LONG_swap(&sqlAsyncEnable);
		LONG_swap(&queryTimeout);
		LONG_swap(&stmtHandle);
		ULONGLONG_swap((unsigned __int64 *)&MaxRowCnt);
		ULONGLONG_swap((unsigned __int64 *)&MaxRowLen);
		LONG_swap(&stmtLabelLength);
		LONG_swap(&stmtCharset);
		LONG_swap(&cursorLength);
		LONG_swap(&cursorCharset);
		LONG_swap(&setStmtOptionsLength);
	}


//
// copy DIALOGUE_ID_def dialogueId
//
	IDL_long_copy(&dialogueId, curptr);
//
// copy IDL_long sqlAsyncEnable
//
	IDL_long_copy(&sqlAsyncEnable, curptr);
//
// copy IDL_long queryTimeout
//
	IDL_long_copy(&queryTimeout, curptr);

//
// copy IDL_long stmtHandle
//
	Long_copy(&stmtHandle, curptr);

//
// copy IDL_long stmtLabelLength
//
	IDL_long_copy(&stmtLabelLength, curptr);

	if (stmtLabel != NULL)
	{
//
// copy IDL_char *stmtLabel
//
		IDL_charArray_copy(stmtLabel, curptr);

//
// copy IDL_long stmtCharset
//
	
		IDL_long_copy(&stmtCharset, curptr);
	}

//
// copy IDL_long MaxRowCnt
//
	IDL_unsigned_long_long_copy(&MaxRowCnt, curptr);

//
// copy IDL_long MaxRowLen
//
	IDL_unsigned_long_long_copy(&MaxRowLen, curptr);

//
// copy IDL_long cursorLength
//
	IDL_long_copy(&cursorLength, curptr);

	if (cursorName != NULL)
	{
	//
	// copy IDL_string cursorName
	//
		IDL_charArray_copy(cursorName, curptr);
	//
	// copy IDL_long cursorCharset
	//
		IDL_long_copy(&cursorCharset, curptr);
	}

//
// copy IDL_long setStmtOptionsLength
//

	IDL_long_copy(&setStmtOptionsLength, curptr);
	if (setStmtOptions != NULL)
	{
//
// copy IDL_string setStmtOptions
//
		IDL_charArray_copy(setStmtOptions, curptr);
	}


	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} /* odbc_SQLDrvr_Fetch_param_pst_() */

CEE_status
odbc_SQLDrvr_Prepare_param_pst_(
			CInterface* pSystem
			, char*& buffer
			, long& message_length
			, /* In    */ DIALOGUE_ID_def dialogueId
			, /* In    */ IDL_long sqlAsyncEnable
			, /* In    */ IDL_long queryTimeout
			, /* In    */ IDL_long sqlStmtType
			, /* In    */ const IDL_char *stmtLabel
			, /* In    */ IDL_long stmtCharset
			, /* In    */ IDL_string cursorName
			, /* In    */ IDL_long cursorCharset
			, /* In    */ const IDL_char *moduleName
			, /* In    */ IDL_long moduleCharset
			, /* In    */ IDL_long_long moduleTimestamp
			, /* In    */ IDL_string sqlString
			, /* In    */ IDL_long sqlStringCharset
			, /* In    */ IDL_string setStmtOptions
			, /* In    */ const IDL_char *stmtExplainLabel
			, /* In    */ IDL_short stmtType
            , /* In    */ IDL_long maxRowsetSize
			, /* In    */ IDL_long holdableCursor
)
{
	IDL_long wlength = 0;

	IDL_long stmtLabelLength        = 0;
   	 IDL_long cursorNameLength       = 0;
    	IDL_long moduleNameLength       = 0;
	IDL_long sqlStringLength        = 0;
	IDL_long setStmtOptionsLength   = 0;
	IDL_long stmtExplainLabelLength = 0;
	IDL_long transactionIDLength    = 0;

	IDL_char *curptr  = NULL;


//
// calculate length of the buffer for each parameter
//


//
//  length of IDL_Long dialogueId
//
	wlength += sizeof(dialogueId);
//
// length of IDL_long sqlAsyncEnable
//
// NOTE - this field is not used by the server, so we will overload the value of 
//        holdableCursor in this field for now for drvr/srvr compatibility. 
//        In the future, if we do need to use the sqlAyncEnable, we need to take care
//        of holdableCursor
//
	wlength += sizeof (sqlAsyncEnable);
//
// length of IDL_long queryTimeout
//
	wlength += sizeof (queryTimeout);
//
// length of IDL_long stmtType
//
	wlength += sizeof (stmtType);
//
// length of IDL_long sqlStmtType
//
	wlength += sizeof (sqlStmtType);


//
// length of IDL_long stmtLength
// length of IDL_char *stmtLabel
// length of IDL_long stmtCharset
// 
	wlength += sizeof(stmtLabelLength);
	if (stmtLabel != NULL)
	{
        stmtLabelLength = strlen(stmtLabel) + 1;
		wlength += stmtLabelLength;
		wlength += sizeof(stmtCharset);
	}

//
// length of IDL_long cursorLength
// length IDL_string cursorName
// length of IDL_long cursorCharset
//
	wlength += sizeof(cursorNameLength);
	if (cursorName != NULL)
	{
		cursorNameLength = strlen(cursorName) + 1;
		wlength += cursorNameLength;
		wlength += sizeof(cursorCharset);
	}

//
// length of IDL_long moduleNameLength
// length of IDL_char *moduleName
// length of IDL_long moduleCharset
// length of IDL_long_long moduleTimestamp
// 
	wlength += sizeof(moduleNameLength);
	if (moduleName != NULL)
	{
		moduleNameLength = strlen(moduleName) + 1;
		wlength += moduleNameLength;
		wlength += sizeof(moduleCharset);
		wlength += sizeof(moduleTimestamp);
	}

//
// length of IDL_long sqlStringLength
// length of IDL_string sqlString
// length of IDL_long sqlStringCharset
// 
	wlength += sizeof(sqlStringLength);
	if (sqlString != NULL)
	{
		sqlStringLength = strlen(sqlString) + 1;
		wlength += sqlStringLength;
		wlength += sizeof(sqlStringCharset);
	}


//
// length of IDL_long setStmtOptionsLength
// length of IDL_string setStmtOptions
// 
	wlength += sizeof(setStmtOptionsLength);
	if (setStmtOptions != NULL)
	{
		setStmtOptionsLength = strlen(setStmtOptions) + 1;
		wlength += setStmtOptionsLength;
	}


//
// length of IDL_long stmtExplainLabelLength
// length of IDL_string stmtExplainLabel
// 
	wlength += sizeof(stmtExplainLabelLength);
	if (stmtExplainLabel != NULL)
	{
		stmtExplainLabelLength = strlen(stmtExplainLabel) + 1;
		wlength += stmtExplainLabelLength;
	}


//
// length of IDL_long maxRowsetSize
//
	wlength += sizeof (maxRowsetSize);

//
//  length of IDL_long transactionIDLength
//
//  NOTE - currently only JDBC sets txnID, so no need to reserve space for txnID
	wlength += sizeof(transactionIDLength);

//
// message length
//
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}

	curptr = buffer;

//
//  Swap all input
//  

	if(pSystem->swap() == SWAP_YES)
	{
			LONG_swap(&dialogueId);
			LONG_swap(&sqlAsyncEnable);
			LONG_swap(&queryTimeout);
			SHORT_swap(&stmtType);
			LONG_swap(&sqlStmtType);
			LONG_swap(&stmtLabelLength);
			LONG_swap(&stmtCharset);
			LONG_swap(&cursorNameLength);
			LONG_swap(&cursorCharset);
			LONG_swap(&moduleNameLength);
			LONG_swap(&moduleCharset);
			LONGLONG_swap(&moduleTimestamp);
			LONG_swap(&sqlStringLength);
			LONG_swap(&sqlStringCharset);
			LONG_swap(&setStmtOptionsLength);
			LONG_swap(&stmtExplainLabelLength);
			LONG_swap(&maxRowsetSize);
			LONG_swap(&holdableCursor);
	}

//
// copy DIALOGUE_ID_def dialogueId
//
	IDL_long_copy(&dialogueId, curptr);

//
// copy IDL_long sqlAsyncEnable
//
// NOTE - overloading the value of holdableCursor using sqlAsyncEnable field.
//
//	IDL_long_copy(&sqlAsyncEnable, curptr);
        IDL_long_copy(&holdableCursor, curptr);

//
// copy IDL_long queryTimeout
//
	IDL_long_copy(&queryTimeout, curptr);

//
// copy IDL_long stmtType
//
	IDL_short_copy(&stmtType, curptr);

//
// copy IDL_long sqlStmtType
//
	IDL_long_copy(&sqlStmtType, curptr);

//
// copy IDL_long stmtLabelLength
//
	IDL_long_copy(&stmtLabelLength, curptr);

	if (stmtLabel != NULL)
	{
//
// copy IDL_char *stmtLabel
//
		IDL_charArray_copy(stmtLabel, curptr);

//
// copy IDL_long stmtCharset
//
		IDL_long_copy(&stmtCharset, curptr);
	}

//
// copy IDL_long cursorLength
//
	IDL_long_copy(&cursorNameLength, curptr);

	if (cursorName != NULL)
	{
//
// copy IDL_string cursorName
//
		IDL_charArray_copy(cursorName, curptr);

//
// copy IDL_long cursorCharset
//
		IDL_long_copy(&cursorCharset, curptr);
	}

//
// copy IDL_long moduleNameLength
//
	IDL_long_copy(&moduleNameLength, curptr);

	if (moduleName != NULL)
	{
//
// copy IDL_char *moduleName
//
		IDL_charArray_copy(moduleName, curptr);
//
// copy IDL_long moduleCharset
//
		IDL_long_copy(&moduleCharset, curptr);
//
// copy IDL_long_long moduleTimestamp
//
		IDL_long_long_copy(&moduleTimestamp, curptr);
	}

//
// copy IDL_long sqlStringLength
//
	IDL_long_copy(&sqlStringLength, curptr);

	if (sqlString != NULL)
	{
//
// copy IDL_string sqlString
//
		IDL_charArray_copy(sqlString, curptr);
//
// copy IDL_long sqlStringCharset
//
		IDL_long_copy(&sqlStringCharset, curptr);
	}

 //
// copy IDL_long setStmtOptionsLength
//
	IDL_long_copy(&setStmtOptionsLength, curptr);

	if (setStmtOptions != NULL)
	{
//
// copy IDL_string setStmtOptions
//
		IDL_charArray_copy(setStmtOptions, curptr);
	}

//
// copy IDL_long stmtExplainLabelLength
//
	IDL_long_copy(&stmtExplainLabelLength, curptr);

	if (stmtExplainLabel != NULL)
	{
//
// copy IDL_string stmtExplainLabel
//
		IDL_charArray_copy(stmtExplainLabel, curptr);
	}


// copy IDL_long maxRowsetSize
//
	IDL_long_copy(&maxRowsetSize, curptr);

//
// copy IDL_long transactionIDLength
//
	IDL_long_copy(&transactionIDLength, curptr);

// Sanity Check
	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} // odbc_SQLDrvr_Prepare_param_pst_()


CEE_status
odbc_SQLDrvr_Close_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ DIALOGUE_ID_def dialogueId
		, /* In    */ const IDL_char *stmtLabel
		, /* In    */ IDL_unsigned_short freeResourceOpt
  )
{
	IDL_long wlength;
	IDL_char *curptr;

	wlength = 0;
	IDL_long stmtLabelLength = 0;
	//
	// calculate length of the buffer for each parameter
	//
	//

	// 1st Parameter
	// length of dialogueId
	wlength += sizeof(dialogueId);

	//
	// length of IDL_char *stmtLabel
	// 
	wlength += sizeof(stmtLabelLength);
	if (stmtLabel != NULL)
	{
		stmtLabelLength = strlen(stmtLabel)+1;
		wlength += stmtLabelLength;
	} 

	//
	// length of IDL_unsigned_short freeResourceOpt
	//
	wlength += sizeof (freeResourceOpt);

    // Mesage Length
	message_length = wlength;

	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}
	curptr = buffer;
	

    // Swap and then copy the values
	if(pSystem->swap() == SWAP_YES)
	{
		LONG_swap(&dialogueId);
		LONG_swap(&stmtLabelLength);
		USHORT_swap(&freeResourceOpt);
	}

	// Copy 1st Parameter
	// copy dialogueId
	IDL_long_copy(&dialogueId, curptr);
	
	//
	// copy IDL_char *stmtLabel
	//
	IDL_long_copy(&stmtLabelLength, curptr);
	if (stmtLabel != NULL) 
	{
		IDL_charArray_copy(stmtLabel, curptr);
	}

	//
	// copy IDL_unsigned_short freeResourceOpt
	//
	IDL_unsigned_short_copy(&freeResourceOpt, curptr);

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} /* odbc_SQLDrvr_Close_param_pst_() */

CEE_status
odbc_SQLDrvr_EndTransaction_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
	    , /* In    */ DIALOGUE_ID_def dialogueId
	    , /* In    */ IDL_unsigned_short transactionOpt
)
{
    IDL_long wlength = 0;
	IDL_char *curptr;

//
// calculate length of the buffer for each parameter
//

//
//  length of DIALOGUE_ID_def dialogueId
//
	wlength += sizeof (dialogueId);

//
// length of IDL_unsigned_short transactionOpt
//
	wlength += sizeof (transactionOpt);

//
// message length
//
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}

	curptr = buffer;

	if(pSystem->swap() == SWAP_YES)
	{
		LONG_swap(&dialogueId);
		USHORT_swap(&transactionOpt);
	}

//
// copy DIALOGUE_ID_def dialogueId
//
	IDL_long_copy(&dialogueId, curptr);

//
// copy IDL_short transactionOpt
//
	IDL_unsigned_short_copy(&transactionOpt, curptr);

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} // odbc_SQLDrvr_EndTransaction_param_pst_()

CEE_status
odbc_SQLDrvr_GetSQLCatalogs_param_pst_(
 		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ DIALOGUE_ID_def dialogueId
		, /* In    */ const IDL_char *stmtLabel
		, /* In    */ IDL_short APIType
		, /* In    */ const IDL_char *catalogNm
		, /* In    */ const IDL_char *schemaNm
		, /* In    */ const IDL_char *tableNm
		, /* In    */ const IDL_char *tableTypeList
		, /* In    */ const IDL_char *columnNm
		, /* In    */ IDL_long columnType
		, /* In    */ IDL_long rowIdScope
		, /* In    */ IDL_long nullable
		, /* In    */ IDL_long uniqueness
		, /* In    */ IDL_long accuracy
		, /* In    */ IDL_short sqlType
		, /* In    */ IDL_unsigned_long metadataId
	    , /* In    */ const IDL_char *fkcatalogNm
	    , /* In    */ const IDL_char *fkschemaNm
	    , /* In    */ const IDL_char *fktableNm
)
{
	IDL_long wlength = 0;
	IDL_char *curptr;

	IDL_long stmtLabelLen =0;
	IDL_long catalogNmLen =0;
	IDL_long schemaNmLen =0;
	IDL_long tableNmLen =0;
	IDL_long tableTypeListLen =0;
	IDL_long columnNmLen =0;
	IDL_long fkcatalogNmLen =0;
	IDL_long fkschemaNmLen = 0;
	IDL_long fktableNmLen = 0;

//
// calculate length of the buffer for each parameter
//

//
//  length of DIALOGUE_ID_def dialogueId
//
	wlength += sizeof (dialogueId);

//
// length of IDL_char *stmtLabel
// 
	wlength += sizeof (stmtLabelLen);
	if (stmtLabel != NULL)
	{
		stmtLabelLen = strlen(stmtLabel)+1;
		wlength += stmtLabelLen;
	}

//
// length of IDL_short APIType
//
	wlength += sizeof (APIType);

//
// length of IDL_char *catalogNm
// 
	wlength += sizeof(catalogNmLen);
	if (catalogNm != NULL)
	{
		catalogNmLen = strlen(catalogNm) +1;
		wlength += catalogNmLen;
	}

//
// length of IDL_char *schemaNm
// 
	wlength += sizeof(schemaNmLen);
	if (schemaNm != NULL)
	{
		schemaNmLen = strlen(schemaNm) +1;
		wlength += schemaNmLen;
	}

//
// length of IDL_char *tableNm
// 
	wlength += sizeof(tableNmLen);
	if (tableNm != NULL)
	{
		tableNmLen = strlen(tableNm)+1;
		wlength += tableNmLen;
	}

//
// length of IDL_char *tableTypeList
//
	wlength += sizeof(tableTypeListLen);
	if (tableTypeList != NULL)
	{
		tableTypeListLen = strlen(tableTypeList)+1;
		wlength += tableTypeListLen;
	}

//
// length of IDL_char *columnNm
// 
	wlength += sizeof(columnNmLen);
	if (columnNm != NULL)
	{
		columnNmLen = strlen(columnNm)+1;
		wlength += columnNmLen;
	}

//
// length of IDL_long columnType
//
	wlength += sizeof (columnType);

//
// length of IDL_long rowIdScope
//
	wlength += sizeof (rowIdScope);

//
// length of IDL_long nullable
//
	wlength += sizeof (nullable);

//
// length of IDL_long uniqueness
//
	wlength += sizeof (uniqueness);

//
// length of IDL_long accuracy
//
	wlength += sizeof (accuracy);

//
// length of IDL_short sqlType
//
	wlength += sizeof (sqlType);

//
// length of IDL_unsigned_long metadataId
//
	wlength += sizeof (metadataId);
//
// length of IDL_char *fkcatalogNm
//
	wlength += sizeof(fkcatalogNmLen);
	if (fkcatalogNm != NULL)
	{
		fkcatalogNmLen = strlen(fkcatalogNm)+1;
		wlength += fkcatalogNmLen;
	}

//
// length of IDL_char *fkschemaNm
//
	wlength += sizeof(fkschemaNmLen);
	if (fkschemaNm != NULL)
	{
		fkschemaNmLen = strlen(fkschemaNm)+1;
		wlength += fkschemaNmLen;
	}

//
// length of IDL_char *fktableNm
//
	wlength += sizeof(fktableNmLen);
	if (fktableNm != NULL)
	{
		fktableNmLen = strlen(fktableNm)+1;
		wlength += fktableNmLen;
	}


//
// message length
//
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}

	curptr = buffer;

	if(pSystem->swap() == SWAP_YES)
	{
		LONG_swap(&dialogueId);
		SHORT_swap(&APIType);
		LONG_swap(&columnType);
		LONG_swap(&rowIdScope);
		LONG_swap(&nullable);
		LONG_swap(&uniqueness);
		LONG_swap(&accuracy);
		SHORT_swap(&sqlType);
		ULONG_swap(&metadataId);
		LONG_swap(&stmtLabelLen);
		LONG_swap(&catalogNmLen);
		LONG_swap(&schemaNmLen);
		LONG_swap(&tableNmLen);
		LONG_swap(&tableTypeListLen);
		LONG_swap(&columnNmLen);
		LONG_swap(&fkcatalogNmLen);
		LONG_swap(&fkschemaNmLen);
		LONG_swap(&fktableNmLen);
	}

//
// copy DIALOGUE_ID_def dialogueId
//
	IDL_long_copy(&dialogueId, curptr);

//
// copy IDL_char *stmtLabel
//
	IDL_long_copy(&stmtLabelLen, curptr);
	if (stmtLabel != NULL)
		IDL_charArray_copy(stmtLabel, curptr);
	
//
// copy IDL_short APIType
//
	IDL_short_copy(&APIType, curptr);

//
// copy IDL_char *catalogNm
//
	IDL_long_copy(&catalogNmLen, curptr);
	if (catalogNm != NULL)
		IDL_charArray_copy(catalogNm, curptr);

//
// copy IDL_char *schemaNm
//
	IDL_long_copy(&schemaNmLen, curptr);
	if (schemaNm != NULL)
		IDL_charArray_copy(schemaNm, curptr);

//
// copy IDL_char *tableNm
//
	IDL_long_copy(&tableNmLen, curptr);
	if (tableNm != NULL)
		IDL_charArray_copy(tableNm, curptr);

//
// copy IDL_char *tableTypeList
//
	IDL_long_copy(&tableTypeListLen, curptr);
	if (tableTypeList != NULL)
		IDL_charArray_copy(tableTypeList, curptr);

//
// copy IDL_char *columnNm
//
	IDL_long_copy(&columnNmLen, curptr);
	if (columnNm != NULL)
		IDL_charArray_copy(columnNm, curptr);

//
// copy IDL_long columnType
//
	IDL_long_copy(&columnType, curptr);

//
// copy IDL_long rowIdScope
//
	IDL_long_copy(&rowIdScope, curptr);

//
// copy IDL_long nullable
//
	IDL_long_copy(&nullable, curptr);

//
// copy IDL_long uniqueness
//
	IDL_long_copy(&uniqueness, curptr);

//
// copy IDL_long accuracy
//
	IDL_long_copy(&accuracy, curptr);

//
// copy IDL_short sqlType
//
	IDL_short_copy(&sqlType, curptr);

//
// copy IDL_unsigned_long metadataId
//
	IDL_unsigned_long_copy(&metadataId, curptr);

//
// copy IDL_char *fkcatalogNm
//
	IDL_long_copy(&fkcatalogNmLen, curptr);
	if (fkcatalogNm != NULL)
		IDL_charArray_copy(fkcatalogNm, curptr);

//
// copy IDL_char *fkschemaNm
//
	IDL_long_copy(&fkschemaNmLen, curptr);
	if (fkschemaNm != NULL)
		IDL_charArray_copy(fkschemaNm, curptr);

//
// copy IDL_char *fktableNm
//
	IDL_long_copy(&fktableNmLen, curptr);
	if (fktableNm != NULL)
		IDL_charArray_copy(fktableNm, curptr);

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} // odbc_SQLDrvr_GetSQLCatalogs_param_pst_()


CEE_status
odbc_SQLDrvr_Execute_param_pst_(
		  CInterface* pSystem
		, IDL_char*& buffer
		, long& message_length
		, /* In    */ DIALOGUE_ID_def dialogueId
		, /* In    */ IDL_long sqlAsyncEnable
		, /* In    */ IDL_long holdableCursor		
		, /* In    */ IDL_long queryTimeout
		, /* In    */ IDL_long inputRowCnt
		, /* In    */ IDL_long maxRowsetSize
		, /* In    */ IDL_long sqlStmtType
		, /* In    */ Long stmtHandle
		, /* In    */ IDL_long stmtType
		, /* In    */ IDL_string sqlString
		, /* In    */ IDL_long sqlStringCharset
		, /* In    */ IDL_string cursorName
		, /* In    */ IDL_long cursorCharset
		, /* In    */ IDL_string stmtLabel
		, /* In    */ IDL_long stmtCharset
		, /* In    */ IDL_string stmtExplainLabel
		, /* In    */ IDL_long inValuesLength
		, /* In    */ BYTE *inValues
		, /* In    */ const SQLValueList_def *inputValueList
)
{

	IDL_char *curptr = NULL;
	IDL_long wlength =  0;
	IDL_long stmtLabelLength        = 0;
    	IDL_long cursorNameLength       = 0;
	IDL_long sqlStringLength        = 0;
	IDL_long setStmtOptionsLength   = 0;
	IDL_long stmtExplainLabelLength = 0;
	IDL_long transactionIDLength	= 0; // always since JDBC is the only one that will ever use this

	wlength = 0;
//
// calculate length of the buffer for each parameter
//

//
//  length of DIALOGUE_ID_def dialogueId
//
	wlength += sizeof(dialogueId);

//
// length of IDL_long sqlAsyncEnable
//
// NOTE - sqlAsynEnable is currently not used by the server, we will use this field to
//        overload the value of holdableCursor.
//        In the future, if this field is used, we need to take care of holdableCursor as well
	wlength += sizeof(sqlAsyncEnable);

//
// length of IDL_long queryTimeout
//
	wlength += sizeof(queryTimeout);

//
// length of IDL_long inputRowCnt
//
	wlength += sizeof(inputRowCnt);

//
// length of IDL_long maxRowsetSize
//
	wlength += sizeof(maxRowsetSize);

//
// length of IDL_long sqlStmtType
//
	wlength += sizeof(sqlStmtType);

//
// length of IDL_long stmtHandle
// 
	wlength += sizeof(stmtHandle);

//
// length of IDL_long stmtType
//
	wlength += sizeof(stmtType);

//
// length of IDL_long sqlStringLength
// length of IDL_string sqlString
// length of IDL_long sqlStringCharset
// 
	wlength += sizeof(sqlStringLength);
	if (sqlString != NULL)
	{
		sqlStringLength = strlen(sqlString) + 1;
		wlength += sqlStringLength;
		wlength += sizeof(sqlStringCharset);
	}


//
// length of IDL_long cursorLength
// length IDL_string cursorName
// length of IDL_long cursorCharset
//
	wlength += sizeof(cursorNameLength);
	if (cursorName != NULL)
	{
		cursorNameLength = strlen(cursorName)+1;
		wlength += cursorNameLength;
		wlength += sizeof(cursorCharset);
	}

//
// length of IDL_long stmtLabelLength
// length of IDL_char *stmtLabel
// length of IDL_long stmtCharset
// 
	wlength += sizeof(stmtLabelLength);
	if (stmtLabel != NULL)
	{
        stmtLabelLength = strlen(stmtLabel) + 1;
		wlength += stmtLabelLength;
		wlength += sizeof(stmtCharset);
	}

//
// length of IDL_long stmtExplainLabelLength
// length of IDL_string stmtExplainLabel
// 
	wlength += sizeof(stmtExplainLabelLength);
	if (stmtExplainLabel != NULL)
	{
		stmtExplainLabelLength = strlen(stmtExplainLabel) + 1;
		wlength += stmtExplainLabelLength;
	}


//
// length of IDL_long inValuesLength
// length of BYTE *inValues
//
	wlength += sizeof (inValuesLength);
	wlength += inValuesLength;


//
//  length of IDL_long transactionIDLength
//
	wlength += sizeof(transactionIDLength);

//
// message length
//
	message_length = wlength;
	buffer = pSystem->w_allocate(message_length);
	if (buffer == NULL)
	{
		return CEE_ALLOCFAIL;
	}

	curptr = buffer;

//  Swap

	if(pSystem->swap() == SWAP_YES)
	{
		LONG_swap(&dialogueId);
		LONG_swap(&sqlAsyncEnable);
		LONG_swap(&queryTimeout);
		LONG_swap(&inputRowCnt);
		LONG_swap(&maxRowsetSize);
		LONG_swap(&sqlStmtType);
		LONG_swap(&stmtHandle);
		LONG_swap(&stmtType);
		LONG_swap(&sqlStringLength);
		LONG_swap(&sqlStringCharset);
		LONG_swap(&cursorNameLength);
		LONG_swap(&cursorCharset);
		LONG_swap(&stmtLabelLength);
		LONG_swap(&stmtCharset);
		LONG_swap(&stmtExplainLabelLength);
		LONG_swap(&holdableCursor);
	}

//
// copy DIALOGUE_ID_def dialogueId
//
	IDL_long_copy(&dialogueId, curptr);

//
// copy IDL_long sqlAsyncEnable
//
// NOTE - overload value of holdableCuror in this field 
//
//	IDL_long_copy(&sqlAsyncEnable, curptr);
	IDL_long_copy(&holdableCursor, curptr);

//
// copy IDL_long queryTimeout
//
	IDL_long_copy(&queryTimeout, curptr);

//
// copy IDL_long inputRowCnt
//
	IDL_long_copy(&inputRowCnt, curptr);

//
// copy IDL_long maxRowsetSize
//
	IDL_long_copy(&maxRowsetSize, curptr);


//
// copy IDL_long sqlStmtType
//
	IDL_long_copy(&sqlStmtType, curptr);

//
// copy IDL_long stmtHandle
//
	Long_copy(&stmtHandle, curptr);

//
// copy IDL_long stmtType
//
	IDL_long_copy(&stmtType, curptr);

//
// copy IDL_long sqlStringLength
//
	IDL_long_copy(&sqlStringLength, curptr);

	if (sqlString != NULL)
	{
//
// copy IDL_string sqlString
//
		IDL_charArray_copy(sqlString, curptr);
//
// copy IDL_long sqlStringCharset
//
		IDL_long_copy(&sqlStringCharset, curptr);
	}


//
// copy IDL_long cursorLength
//
	IDL_long_copy(&cursorNameLength, curptr);

	if (cursorName != NULL)
	{
//
// copy IDL_string cursorName
//
		IDL_charArray_copy(cursorName, curptr);

//
// copy IDL_long cursorCharset
//
		IDL_long_copy(&cursorCharset, curptr);
	}

//
// copy IDL_long stmtLabelLength
//
	IDL_long_copy(&stmtLabelLength, curptr);

	if (stmtLabel != NULL)
	{
//
// copy IDL_char *stmtLabel
//
		IDL_charArray_copy(stmtLabel, curptr);

//
// copy IDL_long stmtCharset
//
		IDL_long_copy(&stmtCharset, curptr);
	}

//
// copy IDL_long stmtExplainLabelLength
//
	IDL_long_copy(&stmtExplainLabelLength, curptr);

	if (stmtExplainLabel != NULL)
	{
//
// copy IDL_string stmtExplainLabel
//
		IDL_charArray_copy(stmtExplainLabel, curptr);
	}

//
// copy IDL_long inValuesLength
//
	LONG_swap(&inValuesLength,pSystem->swap());
	IDL_long_copy(&inValuesLength, curptr);
	LONG_swap(&inValuesLength,pSystem->swap());

	if (inValues != NULL)
	{
//
// copy BYTE *inputValueList
//
		IDL_byteArray_copy(inValues, inValuesLength, curptr);
	}

//
// copy IDL_long transactionIDLength
//
	IDL_long_copy(&transactionIDLength, curptr);

	if (curptr > buffer + message_length)
	{
		return CEE_INTERNALFAIL;
	}

	return CEE_SUCCESS;

} /* odbc_SQLDrvr_Execute_param_pst_() */


/************************************************************************************************************
 *                                                                                                          *
 * Keeping these functions around for the collapsed driver - get rid of these when it is not needed anymore *
 *                                                                                                          *
 ************************************************************************************************************/

