/**************************************************************
 * 
 * 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_XDataSource_idl__ 
#define __com_sun_star_sdbc_XDataSource_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.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 connections via a factory which is identified
	by its name. A DataSource object is typically registered by a naming service
	provider.
 */
published interface XDataSource: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
 	 
	/** attempts to establish a database connection.
		@param user
			the user name
		@param password
			the password
		@returns
			the connection object
		@throws SQLException 
			if a database access error occurs.
	 */
	XConnection getConnection([in]string user, [in]string password) 
		raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** sets the maximum time in seconds that this data source will wait
		while attempting to connect to a database.
		
		
		<p>
		A value of zero specifies that the timeout is the default system
		timeout if there is one; otherwise, it specifies that there is no timeout.
		When a DataSource object is created the login timeout is initially zero.
		</p>
		@param seconds
		    the login time limit in seconds
		@throws SQLException 
			if a database access error occurs.
	 */
	void setLoginTimeout([in]long seconds) 
		 raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** gets the maximum time in seconds that this data source can wait
		while attempting to connect to a database.
		
		
		<p>
		A value of zero means that the timeout is the default system timeout
		if there is one; otherwise, it means that there is no timeout. When a
		DataSource object is created the login timeout is initially zero.
		</p>
		@returns
			the login time limit in seconds
		@throws SQLException 
			if a database access error occurs.
	 */
	long getLoginTimeout() raises (SQLException); 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
===========================================================================*/ 
#endif 
