/**************************************************************
 * 
 * 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_XDriver_idl__ 
#define __com_sun_star_sdbc_XDriver_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_beans_PropertyValue_idl__ 
#include <com/sun/star/beans/PropertyValue.idl> 
#endif 
 
#ifndef __com_sun_star_sdbc_SQLException_idl__ 
#include <com/sun/star/sdbc/SQLException.idl> 
#endif 
 
#ifndef __com_sun_star_sdbc_DriverPropertyInfo_idl__ 
#include <com/sun/star/sdbc/DriverPropertyInfo.idl> 
#endif 
 
 module com {  module sun {  module star {  module sdbc { 
 
 published interface XConnection; 
 published interface XDriverManager; 
 
 
/** is the interface that every driver class must implement.
	
	
	
	<p>
	Each driver should supply a service that implements
	the Driver interface.
	
	</p>
	<p>The DriverManager will try to load as many drivers as it can
	find, and then for any given connection request, it will ask each
	driver in turn to try to connect to the target URL.
	
	</p>
	<p>
	It is strongly recommended that each Driver object should be
	small and standalone so that the Driver object can be loaded and
	queried without bringing in vast quantities of supporting code.
	
	</p>
	@see com::sun::star::sdbc::XDriverManager 
	 @see com::sun::star::sdbc::XConnection
 */
published interface XDriver: com::sun::star::uno::XInterface
{ 
	 
	/** attempts to make a database connection to the given URL.
		The driver should return 
		<NULL/>
		if it realizes it is the wrong kind
		of driver to connect to the given URL.  This will be common, as when
		the driver manager is asked to connect to a given URL it passes
		the URL to each loaded driver in turn.
		
		
		
		<p>
		The driver should raise a 
		<type scope="com::sun::star::sdbc">SQLException</type>
		if it is the right
		driver to connect to the given URL, but has trouble connecting to
		the database.
		
		</p>
		<p>
		The info argument can be used to pass arbitrary
		string tag/value pairs as connection arguments.
		Normally at least "user" and "password" properties should be
		included in the Properties. For a JDBC driver also the Java class must
        be supplied in the property named JavaDriverClass, and a class path (a
        space-separated list of URLs) needed to locate that class can optionally
        be supplied in a property named JavaDriverClassPath.
		Possible property value names are when supported by the driver:
		@see com::sun::star::sdbc::ConnectionProperties
		</p>

		@param url
			is the URL of the database to which to connect. 
		@param info
			a list of arbitrary string tag/value pairs as connection arguments. Normally at least a "user" and "password" property should be included.
			@see com::sun::star::sdbc::ConnectionProperties
		@returns 
			a Connection object that represents a connection to the URL			
		@throws	SQLException
		    if a database access error occurs

	 */
	XConnection connect( 
				[in]string url, 
				[in]sequence<com::sun::star::beans::PropertyValue> info) 
        raises (SQLException); 
    //------------------------------------------------------------------------- 
	 
	/** returns <TRUE/> if the driver thinks that it can open a connection
		to the given URL.  Typically drivers will return <TRUE/> if they
		understand the subprotocol specified in the URL and <FALSE/> if
		they do not.

		@param url
			is the URL of the database to which to connect. 
		@returns 
			<TRUE/> if this driver can connect to the given URL.
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean acceptsURL([in]string url) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** gets information about the possible properties for this driver. 
		     <p>The getPropertyInfo method is intended to allow a generic GUI tool to 
		     discover what properties it should prompt a human for in order to get 
		     enough information to connect to a database.  Note that depending on 
		     the values the human has supplied so far, additional values may become 
		     necessary, so it may be necessary to iterate though several calls 
		     to getPropertyInfo. 
		     @param url 
				is the URL of the database to which to connect. 
		     @param info 
				is a proposed list of tag/value pairs that will be sent on 
		        connect open. 
		     @returns 
				an array of DriverPropertyInfo objects describing possible 
		        properties. This array may be an empty array if no properties 
		        are required. 
		     @throws SQLException 
				if a database access error occurs.
	 */
	sequence<DriverPropertyInfo> getPropertyInfo([in]string url, 
					[in] sequence<com::sun::star::beans::PropertyValue> info) 
		raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** gets the driver's major version number. Initially this should be 1.
		@returns
		    this driver's major version number
	 */
	long getMajorVersion(); 
	//------------------------------------------------------------------------- 
     
	/** gets the driver's minor version number. Initially this should be 0.
		@returns
		    this driver's minor version number.
	 */
	long getMinorVersion(); 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
#endif 
