/**********************************************************************
// @@@ 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 @@@
**********************************************************************/
/**************************************************************************
**************************************************************************/
//
// MODULE: ASSOCSVC.IDL 
//
// PURPOSE: Describes the ODBC ASSOCIATION services (AS).
//
// Modification History
//
// 	Rewrote all the method definitions since old definitions were not applicable
//	with the new approach 
//
#ifndef ASSOCSVC_H_
#define ASSOCSVC_H_

#include "odbcCommon.idl"
#include "odbcsrvrcommon.idl"

typedef struct DATASOURCE_STATUS_t
{	
	SQL_IDENTIFIER_def	DSName;
	DS_AUTOMATION_def	DSAutomation;
	short				defaultFlag;
	long				DSState;
	long				MaxSrvrCnt;
	long				InitSrvrCnt;
	long				AvailSrvrCnt;
	long				StartAheadCnt;
	long				CurrentSrvrRegistered;
	long				CurrentSrvrConnected;
	TIME_def			StateChangeTime;
} DATASOURCE_STATUS_def;

typedef struct SRVR_STATUS_t
{	
	long				srvrType;
	IDL_OBJECT_def		srvrObjRef;
	short				nodeId;
	unsigned long		srvrProcessId;
	SQL_IDENTIFIER_def	DSName;
	char				processName[MAX_PROCESS_NAME_LEN];
	long				srvrState;
	char				computerName[MAX_COMPUTERNAME_LENGTH*4+1];
	unsigned long		clientProcessId;
	string				userName;
	string				windowText;
	DIALOGUE_ID_def 	dialogueId;
	TIME_def			lastUpdatedTime;
	VERSION_def			srvrVersion;	
} SRVR_STATUS_def;

typedef struct AS_CFG_STATUS_t
{	
	short ASNodeId;
	long ASProcessId;
	long ASSrvrState;
	char ASProcessName[MAX_PROCESS_NAME_LEN];
	IDL_OBJECT_def ASSrvrObjRef;
	TIME_def ASLastUpdatedTime;
	VERSION_def		ASVersion;
	short CfgNodeId;
	long CfgProcessId;
	long CfgSrvrState;
	char CfgProcessName[MAX_PROCESS_NAME_LEN];
	IDL_OBJECT_def CfgSrvrObjRef;
  	TIME_def CfgLastUpdatedTime;
	VERSION_def		CfgVersion;	
} AS_CFG_STATUS_def;

typedef sequence<DATASOURCE_STATUS_def> DATASOURCE_STATUS_LIST_def;

typedef sequence<SRVR_STATUS_def> SRVR_STATUS_LIST_def;

module odbcas {

#define AS_uuid ((UUID_def) "9101c0ac-e07a-11d0-a543-0060b01ad6ae")

// note clusterNm is unused but defined in the hopes that the
// cluster will have its own identify 

interface ASSvc 
	{                  
	exception ASParamError {string ErrorText;};
	exception ASTimeout {string ErrorText;};
	exception ASNoSrvrHdl {};
	exception ASRejectRegistry{string ErrorText;};
    exception ASRegistryFailed{};
	exception ASTryAgain{};
    exception ASStateChangeError{string ErrorText;};
	exception SQLError {ERROR_DESC_LIST_def errorList;};
	exception PortNotAvailable {};
	exception DSNotFound {};
	exception DSAlreadyStopped {};
	exception DSAlreadyStarted {} ;
	exception DSStateChangeError {};
	exception ProcessStopError {};
	exception ASNotAvailable {string ErrorText;};
	exception DSNotAvailable {string ErrorText;};
	exception SrvrNotFound {};
	exception SrvrInUseByAnotherClient{};
	exception InvalidUser{};
	exception SrvrCreateError{};
	exception CfgSrvrFailed{};
	exception LogonUserFailure{long errorCode;};
	exception TraceAlreadyEnabled {};
	exception TraceAlreadyDisabled {} ;
	exception TraceEnableError {};
	exception TraceDisableError {};
												             
    void RegProcess (
		 in  VERSION_def			intfVersion,
		 in  long					srvrType,
		 in	 IDL_OBJECT_def			srvrObjRef,
		 in  PROCESS_ID_def			nskProcessInfo,
		 out SRVR_CONTEXT_def		srvrContext)
     raises (ASParamError,
			ASTimeout,
			ASRegistryFailed,
			ASRejectRegistry);

	// RetryCount will determine if the connection request is coming from the
	// same client or it is a new client, to decide if the association server need
	// to start a new server when needed.
	// datasource is the datasource to which the client is connected.
	void GetObjRefHdl(
	    in  CONNECTION_CONTEXT_def  inContext,
		in  USER_DESC_def			userDesc,
		in	long					srvrType,
		in	short					retryCount,
		out IDL_OBJECT_def			srvrObjRef,
		out DIALOGUE_ID_def			dialogueId,
		out SQL_IDENTIFIER_def		dataSource,
		out	USER_SID_def			userSid,
		out	VERSION_LIST_def		versionList,
		out long					isoMapping,
		out short					srvrNodeId,
		out short					srvrProcessId,
		out long long				timestamp)
	raises (ASParamError, 
			ASTimeout,
			ASNoSrvrHdl,
			ASTryAgain,
			ASNotAvailable,
			DSNotAvailable,
			PortNotAvailable,
			InvalidUser,
			LogonUserFailure);

	void UpdateSrvrState (
		in	long	srvrType,
		in	IDL_OBJECT_def	srvrObjRef,
		in  long	srvrState,
		in  long	userID,
		in	char	userSID[MAX_TEXT_SID_LEN+1],
		out long	TraceType,
		out long	StatisticsType,
		out long	ContextType,
		out SRVR_CONTEXT_def srvrContext)
	raises (ASParamError,
			ASTimeout,
			ASStateChangeError);

	void SrvrMonitorCall(in long srvrType,
						in IDL_OBJECT_def srvrObjRef,
						in long DSId);

	void StartAS (out ERROR_DESC_LIST_def sqlWarning) 
		raises (ASParamError, DSAlreadyStarted, DSStateChangeError, PortNotAvailable, 
				SQLError, ASTryAgain, SrvrCreateError, CfgSrvrFailed);

	void StopAS (in long StopType,
				in string ReasonText)
		raises (ASParamError, DSStateChangeError, ProcessStopError);
		
	void StartDS(in SQL_IDENTIFIER_def DSName,
				 out ERROR_DESC_LIST_def sqlWarning)
		raises (ASParamError, DSNotFound, DSAlreadyStarted, DSStateChangeError, PortNotAvailable, 
				SQLError, SrvrCreateError);

	void StopDS(in SQL_IDENTIFIER_def DSName,
				in long StopType,
				in string ReasonText)
		raises (ASParamError, DSNotFound, DSAlreadyStopped, DSStateChangeError, ProcessStopError);

	void StatusAS(out AS_CFG_STATUS_def AsCfgStatus);

	void StatusDS (in SQL_IDENTIFIER_def DSName,
					out DATASOURCE_STATUS_def DSStatus)
		raises (ASParamError, DSNotFound);

	void StatusDSDetail (in SQL_IDENTIFIER_def DSName,
						out SRVR_STATUS_LIST_def srvrListStatus)
		raises (ASParamError, DSNotFound, ASNotAvailable, DSNotAvailable);

	void StatusSrvrAll (out SRVR_STATUS_LIST_def srvrListStatus)
		raises (ASParamError, ASNotAvailable);

	void StopSrvr(in DIALOGUE_ID_def dialogueId,
				  in long	srvrType,
				  in IDL_OBJECT_def	srvrObjRef,
				  in long StopType)
		raises (ASParamError, ASNotAvailable, SrvrNotFound, SrvrInUseByAnotherClient, ProcessStopError);

	void StatusDSAll (out DATASOURCE_STATUS_LIST_def DSListStatus)
		raises (ASParamError);

	// Initially thought this method should be 'DoIDie' 
	// wanted an optimistic method name. 'ShouldILive' Still didn't sound right
	// and hence 'WouldLikeToLive'

	void WouldLikeToLive (in long	srvrType,
						in IDL_OBJECT_def srvrObjRef,
						out long lifePermit)
		raises (ASParamError);

// for testing AS

	void SetTestPoint(
			in DIALOGUE_ID_def		dialogueId,
			in short				TestPoint,
			in unsigned long	    Operation)
			raises (ASParamError);

	void ClearTestPoint(
			in DIALOGUE_ID_def		dialogueId,
			in short				TestPoint,
			in unsigned short		Operation)
			raises (ASParamError);

	void DataSourceConfigChanged ( in IDL_OBJECT_def dataSourceName,
						in long dataSourceOperation, in long dataSourceOperationValue)
		raises (ASParamError);

//
// General Parameter Interface
//
	void GeneralParam(
			in GEN_ParamList_def	paramList)
			raises (ASParamError);

	void EnableTrace(in SQL_IDENTIFIER_def DSName, in DIALOGUE_ID_def dialogueId, in IDL_OBJECT_def srvrObjRef, in long traceType)
		raises (ASParamError, DSNotFound, DSAlreadyStopped, TraceAlreadyEnabled, TraceEnableError);

	void DisableTrace(in SQL_IDENTIFIER_def DSName, in DIALOGUE_ID_def dialogueId, in IDL_OBJECT_def srvrObjRef, in long traceType)
		raises (ASParamError, DSNotFound, DSAlreadyStopped, TraceAlreadyDisabled, TraceDisableError);

	void GetVersionAS(out VPROC_def ASVersion);

    };  // end of interface ASSvc

};
#endif
