/**********************************************************************
// @@@ 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:  ODBCCfg.IDL
//
// PURPOSE: Describes the Metadata RPC Services
//#include "odbcCommon.idl"

#ifndef ODBCCfg_defined
#define ODBCCfg_defined

#include "odbcCommon.idl"
#include "odbcsrvrcommon.idl"

module odbccfg {

#define odbccfg_uuid ((UUID_def) " "

interface CfgSvc {
   exception ParamError {string ParamDesc;};
   exception CriticalError {string ErrorDesc;};
   exception SQLError {ERROR_DESC_LIST_def errorList;}; 
   exception SQLNoDataFound {};
   exception CFGDataError {};
   exception DatabaseFound {};
   exception SQLInvalidHandle {};
   exception DatabaseNotFound {};
   exception WrongUserPassword {};
   exception ServerError{};

   void GetObjectNameList (
	   in  long		ObjectType,
       out DATASOURCE_LIST_def   ObjectNameList,
	   out ERROR_DESC_LIST_def		sqlWarning )
       raises (ParamError, SQLError, SQLNoDataFound);
	
   void GetDataSource (
       in  SQL_IDENTIFIER_def    KeyValue,
       out DATASOURCE_DESC_def   DSValues,
	   out ERROR_DESC_LIST_def		sqlWarning )
       raises (ParamError, SQLError, SQLNoDataFound);

   void DropDataSource (
       in  SQL_IDENTIFIER_def    KeyValue,
	   out ERROR_DESC_LIST_def		sqlWarning)
       raises (ParamError, SQLError, SQLNoDataFound, CFGDataError);

   void SetDataSource (
       in DATASOURCE_DESC_def   DSValues,
	   out ERROR_DESC_LIST_def		sqlWarning )
       raises (ParamError, SQLError, SQLNoDataFound);

   void AddNewDataSource (
       in  DATASOURCE_DESC_def  DSValues,
	   out ERROR_DESC_LIST_def		sqlWarning)
       raises (ParamError, SQLError, SQLNoDataFound);

   void CheckDataSourceName (
       in  SQL_IDENTIFIER_def    KeyValue,
	   out ERROR_DESC_LIST_def		sqlWarning)
       raises (ParamError, SQLError, SQLNoDataFound);

   void GetDSNControl (
	   in  SQL_IDENTIFIER_def  KeyValue,
       out long  automation,
       out long  curStatus,
	   out ERROR_DESC_LIST_def		sqlWarning )
       raises (ParamError, SQLError, SQLNoDataFound);

  void SetDSNControl (
	   in  SQL_IDENTIFIER_def  KeyValue,
	   // this needs to change to the typedef DSN_AUTOMATION
       in long  automation,
	   out ERROR_DESC_LIST_def		sqlWarning)
       raises (ParamError, SQLError, SQLNoDataFound);
	
	void GetResourceValues (
       in CfgSvc_REQ_def       KeyType,
       in SQL_IDENTIFIER_def     KeyValue,
       out RES_DESC_LIST_def     ResValueList,
	   out ERROR_DESC_LIST_def		sqlWarning)
       raises (ParamError, SQLError, SQLNoDataFound);

   void SetResourceValues (
       in CfgSvc_REQ_def       KeyType,
       in SQL_IDENTIFIER_def     KeyValue,
       in RES_DESC_LIST_def    ResValueList,
	   out ERROR_DESC_LIST_def		sqlWarning)
       raises (ParamError, SQLError, SQLNoDataFound);

	void GetEnvironmentValues ( // added to set and get environment values
       in CfgSvc_REQ_def       KeyType,
       in SQL_IDENTIFIER_def     KeyValue,
       out ENV_DESC_LIST_def     EnvValueList,
	   out ERROR_DESC_LIST_def		sqlWarning)
       raises (ParamError, SQLError, SQLNoDataFound);

   void SetEnvironmentValues (
       in CfgSvc_REQ_def       KeyType,
       in SQL_IDENTIFIER_def     KeyValue,
       in ENV_DESC_LIST_def    EnvValueList,
	   out ERROR_DESC_LIST_def		sqlWarning)
       raises (ParamError, SQLError, SQLNoDataFound);

// Following Methods are used by ASSrvr 
	void GetStartupConfigValues (
		out short					serviceStatus,
		out	long					serviceStatusChangeTime,
		out long					isoMapping,
		out DATASOURCE_CFG_LIST_def DSList,
		out ERROR_DESC_LIST_def		sqlWarning)
		raises (ParamError, SQLError, SQLNoDataFound);

	void GetDataSourceValues (
       in  SQL_IDENTIFIER_def   DSName,
       out DATASOURCE_CFG_def   DSValues,
	   out ERROR_DESC_LIST_def	sqlWarning )
       raises (ParamError, SQLError, SQLNoDataFound);

	void SetDSStatus (
       in  SQL_IDENTIFIER_def		DSNm,
	   in  short					status,
	   in  TIMESTAMP_STR_def		statusChangedTime,
	   out ERROR_DESC_LIST_def		sqlWarning )
       raises (ParamError, SQLError, SQLNoDataFound);

	void SetASStatus (
		in short				status,
		in TIMESTAMP_STR_def	statusChangedTime,
		out ERROR_DESC_LIST_def	sqlWarning)
		raises (ParamError, SQLError, SQLNoDataFound);

// Following methids are used by InitSv
	void CreateConfigurationDatabase (
		in long DatabaseVersion,
		in string sqlVolumeLocationNm,
		out ERROR_DESC_LIST_def	sqlWarning)
		raises (ParamError, SQLError, SQLInvalidHandle, DatabaseFound);

	void CreateDatatypeTable (
		in long DatatypeTableVersion,
		in string sqlVolumeLocationNm,
		out ERROR_DESC_LIST_def	sqlWarning )
		raises (ParamError, SQLError,  SQLInvalidHandle, DatabaseFound);

	void DropConfigurationDatabase (
		out ERROR_DESC_LIST_def	sqlWarning )
		raises (ParamError, SQLError, SQLInvalidHandle, DatabaseNotFound);

	void DropDatatypeTable (
		out ERROR_DESC_LIST_def	sqlWarning )
		raises (ParamError, SQLError, SQLInvalidHandle, DatabaseNotFound);

//	void UserAuthenticate(
//		in	USER_NAME_def		UserName,
//		in  USER_PASSWORD_def	Password,
//		out short				retCode,
//		out short				status,
//		out short				authenticated,
//		out short				authorized)
//		raises (WrongUserPassword, ServerError);

//	void ChangePassword(
//		in	USER_NAME_def		UserName,
//		in  USER_PASSWORD_def	oldPassword,
//		in  USER_PASSWORD_def	newPassword,
//		out short				retCode,
//		out short				status)
//		raises (WrongUserPassword, ServerError);

//
// General Parameter Interface
//
	void GeneralParam(
		in GEN_ParamList_def	paramList)
		raises (ParamError);
//
// Stop ESP orphans
//
	void StopEspOrphans(
		in PROCESS_HANDLE_List_def handleList);
//
// SQLCancel query
//
	void SQLCancel(
		in short segment,
		in short cpu,
		in short pin,
		in long srvrApi,
		in short requesterType,
		in APLICATION_def requesterApplication,
		in COMPUTER_def requesterComputer,
		in NAME_def requesterName);

 }; // end of CfgSvc

}; // end of ODBCCfg Module

#endif


