/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


#ifndef __com_sun_star_sdbc_XIsolatedConnection_idl__ 
#define __com_sun_star_sdbc_XIsolatedConnection_idl__ 
 
#ifndef __com_sun_star_task_XInteractionHandler_idl__ 
#include <com/sun/star/task/XInteractionHandler.idl> 
#endif 
 
#ifndef __com_sun_star_sdbc_SQLException_idl__ 
#include <com/sun/star/sdbc/SQLException.idl> 
#endif 
 
 module com {  module sun {  module star {  module sdbc { 
 
 published interface XConnection;  
/** is used for establishing isolated connections via a factory. 
	<p>
	The <type>XIsolatedConnection</type> allows to create connections which are not shared among others 
	as it is the case when creating connections in normal way.
	</p>
	@see com::sun::star::sdb::DataSource
	@since OOo 1.1.2
 */
published interface XIsolatedConnection: com::sun::star::uno::XInterface
{ 
	/** attempts to establish a database connection. 
		<p>If information is missing, such as 
		a user's password, they are completed by user interaction.</p>
		@param handler
			The handler which ask for the needed information when they are missing.
		@returns
			A connection which is not shared.
		@throws com::sun::star::sdbc::SQLException
			when an error occurs.
	 */
	XConnection 
		getIsolatedConnectionWithCompletion([in]com::sun::star::task::XInteractionHandler handler) 
	 		raises (SQLException); 

	/** attempts to establish a database connection.
		@param user
			The user name.
		@param password
			The password.
		@returns
			A connection which is not shared.
		@throws com::sun::star::sdbc::SQLException
			when an error occurs.
	 */
	XConnection getIsolatedConnection([in]string user, [in]string password) 
		raises (SQLException); 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
===========================================================================*/ 
#endif 
