/**********************************************************************
// @@@ 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: ODBC.IDL 
//
// PURPOSE: Describes the ODBC RPC services.
//
// Modification History
//	15Jan98			Changed MonitorCallContext method to include diaglogueId
//
//	22Aug97			Changed some of the typedefs into basic types, since these typedefs
//				are declared elsewhere. Modified Error as an Exception instead of
//				out parameters. Other changes to fit to compile without any error
//	09Sep97			Added a new method SetConnectionOption and added a stmtType parameter
//				in Prepare. (StmtType could be INTERNAL_STMT or EXTERNAL_STMT
//	13Sep97			Added a new method GetSQLGetTypeInfo.
//	22Sep97			Removed  Association Services, moved to own IDL

#ifndef ODBCSVC_DEFINED
#define ODBCSVC_DEFINED
#include "odbcCommon.idl"

module odbc {

#define ODBCsvc_uuid ((UUID_def) "9101c0ac-e07a-11d0-a543-0060b01ad6ae")

interface SQLSvc {

	exception ParamError {string ParamDesc;};
	exception SQLError {ERROR_DESC_LIST_def errorList;};
	exception SQLInvalidHandle{};
	exception SQLNeedData{};
	exception SQLNoDataFound {};
	exception InvalidUser{ERROR_DESC_LIST_def errorList;};
	exception SQLRetryCompile{ERROR_DESC_LIST_def errorList;};
	exception InvalidConnection {};
//	exception RGError {RES_HIT_DESC_def resGov;};
	exception ProcessStopError {string ErrorText;};
	exception SQLStillExecuting{};
	exception SQLQueryCancelled{long sqlcode;};
	exception CancelNotPossible {};
	exception CancelSQLError { long sqlcode;};
	exception TransactionError{};
	exception StatisticsError{};
	exception StatisticsAlreadyDisabled{};
	exception StatisticsAlreadyEnabled{};
	exception TraceError{};
	exception TraceAlreadyDisabled{};
	exception TraceAlreadyEnabled{};

    void InitializeDialogue(
			in  USER_DESC_def			userDesc,
			in  CONNECTION_CONTEXT_def  inContext,
			in	DIALOGUE_ID_def			dialogueId,
			out	OUT_CONNECTION_CONTEXT_def outContext)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle, SQLNeedData, InvalidUser); 
	
	void TerminateDialogue (
			in  DIALOGUE_ID_def			dialogueId)
			raises (ParamError, InvalidConnection, SQLError); 

	void MonitorCall(in DIALOGUE_ID_def dialogueId);

	void SetConnectionOption(
 	        in  DIALOGUE_ID_def			dialogueId,
	        in  short					connectionOption,
			in  long					optionValueNum,
			in  string					optionValueStr,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle);

   void EndTransaction (
			in  DIALOGUE_ID_def			dialogueId,
		    in  unsigned short			transactionOpt,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle, TransactionError);  

   	void Prepare (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in	STMT_NAME_def			stmtExplainLabel,
			in  short					stmtType,
			in  string					sqlString,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			out long					estimatedCost,
			out	SQLItemDescList_def		inputDesc,
			out	SQLItemDescList_def		outputDesc,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLStillExecuting, SQLQueryCancelled, TransactionError); 

	void ExecDirect (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in	string					cursorName,
			in	STMT_NAME_def			stmtExplainLabel,
			in	short					stmtType,
			in  short					sqlStmtType,
			in  string					sqlString,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			out long					estimatedCost,
			out SQLItemDescList_def		outputDesc,
			out long					rowsAffected,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLStillExecuting, SQLQueryCancelled, TransactionError); 

	void ExecuteN (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in  string					cursorName,
			in  short					sqlStmtType,
			in  long					inputRowCnt,
			in	SQLValueList_def		inputValueList,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			out long					rowsAffected,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle, SQLNeedData, 
						SQLRetryCompile, SQLStillExecuting, SQLQueryCancelled, TransactionError); 

	void FetchN (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in	long					maxRowCnt,
			in	long					maxRowLen,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			out long					rowsAffected,
			out	SQLValueList_def		outputValueList,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle, 
					SQLNoDataFound, SQLStillExecuting, SQLQueryCancelled, TransactionError); 

    void Close (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in	unsigned short			freeResourceOpt,
			out long					rowsAffected,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, TransactionError); 
	
	void CancelStatement (
			in  DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, CancelSQLError, SQLInvalidHandle, CancelNotPossible); 


	void SetDiagInfo (
			in DIALOGUE_ID_def		dialogueId,
			in long					DiagnosticFlag,
			in	string				ClientPCName);

	void StopServer(in DIALOGUE_ID_def	dialogueId,
				  in long				StopType,
				  in string				ReasonText)
		raises (ParamError, ProcessStopError);

	void SetTestPoint(
			in DIALOGUE_ID_def		dialogueId,
			in short				TestPoint,
			in unsigned long	    Operation)
			raises (ParamError, InvalidConnection);

	void ClearTestPoint(
			in DIALOGUE_ID_def		dialogueId,
			in short				TestPoint,
			in unsigned short		Operation)
			raises (ParamError, InvalidConnection);

	void GetSQLCatalogs (
			in  DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def			stmtLabel,
			in  short					APIType,
			in  SQL_IDENTIFIER_def		catalogNm,
			in  SQL_IDENTIFIER_def		schemaNm,
			in  SQL_IDENTIFIER_def		tableNm,
			in  string<128>             tableTypeList,
			in  SQL_IDENTIFIER_def		columnNm,
			in  long					columnType,
			in  long					rowIdScope,
			in  long					nullable,
			in  long					uniqueness,
			in  long					accuracy,
			in  short					sqlType,
			in	unsigned long			metadataId,					
			in  SQL_IDENTIFIER_def		fkcatalogNm,
			in  SQL_IDENTIFIER_def		fkschemaNm,
			in  SQL_IDENTIFIER_def		fktableNm,
			out	STMT_NAME_def			catStmtLabel,
			out SQLItemDescList_def		outputDesc,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle);
//
// General Parameter Interface
//
	void GeneralParam(
			in GEN_ParamList_def	paramList)
			raises (ParamError);

//
// Performance
//
	void FetchPerf (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in	long					maxRowCnt,
			in	long					maxRowLen,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			out long					rowsAffected,
			out	SQL_DataValue_def		outputDataValue,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle, 
					SQLNoDataFound, SQLStillExecuting, SQLQueryCancelled, TransactionError);

//
// Rowset
//
	void FetchRowset (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in	long					maxRowCnt,
			in	long					maxRowLen,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			out long					rowsAffected,
			out	SQL_DataValue_def		outputDataValue,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle, 
					SQLNoDataFound, SQLStillExecuting, SQLQueryCancelled, TransactionError);
					 
   	void PrepareRowset (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in	STMT_NAME_def			stmtExplainLabel,
			in  short					stmtType,
			in	short					sqlStmtType,
			in  string					sqlString,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			in	long					maxRowsetSize,
			out long					estimatedCost,
			out	SQLItemDescList_def		inputDesc,
			out	SQLItemDescList_def		outputDesc,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLStillExecuting, SQLQueryCancelled, TransactionError); 

	void ExecDirectRowset (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in	string					cursorName,
			in	STMT_NAME_def			stmtExplainLabel,
			in	short					stmtType,
			in  short					sqlStmtType,
			in  string					sqlString,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			in	long					maxRowsetSize,
			out long					estimatedCost,
			out SQLItemDescList_def		outputDesc,
			out long					rowsAffected,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLStillExecuting, SQLQueryCancelled, TransactionError); 

	void ExecuteRowset (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in  string					cursorName,
			in  short					sqlStmtType,
			in  long					inputRowCnt,
			in	SQL_DataValue_def		inputDataValue,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			out long					rowsAffected,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle, SQLNeedData, 
						SQLRetryCompile, SQLStillExecuting, SQLQueryCancelled, TransactionError);
						 
	void EnableServerTrace(in DIALOGUE_ID_def	dialogueId,
				  in long				TraceType)
		raises (ParamError, TraceError, TraceAlreadyEnabled);

	void DisableServerTrace(in DIALOGUE_ID_def	dialogueId,
				  in long				TraceType)
		raises (ParamError, TraceError, TraceAlreadyDisabled);

	void EnableServerStatistics(
			in DIALOGUE_ID_def	dialogueId,
			in long				StatisticsType)
			raises (ParamError, StatisticsError, StatisticsAlreadyEnabled);

	void DisableServerStatistics(
			in DIALOGUE_ID_def	dialogueId)
			raises (ParamError, StatisticsError, StatisticsAlreadyDisabled);

	void UpdateServerContext(in SRVR_CONTEXT_def	srvrContext)
			raises (ParamError, SQLError);

	void ExecuteCall (
			in	DIALOGUE_ID_def			dialogueId,
			in  STMT_NAME_def           stmtLabel,
			in  string					cursorName,
			in  short					sqlStmtType,
			in  long					inputRowCnt,
			in	SQLValueList_def		inputValueList,
			in  short					sqlAsyncEnable,
			in	long					queryTimeout,
			out	SQLValueList_def		outputValueList,
			out long					rowsAffected,
			out ERROR_DESC_LIST_def		sqlWarning)
			raises (ParamError, InvalidConnection, SQLError, SQLInvalidHandle, SQLNeedData, 
						SQLRetryCompile, SQLStillExecuting, SQLQueryCancelled, TransactionError); 

    }; // end of SQL interface
}; // end of ODBC module

#endif
