/**************************************************************
 * 
 * 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_ODBCConnectionProperties_idl__ 
#define __com_sun_star_sdbc_ODBCConnectionProperties_idl__ 

#ifndef __com_sun_star_sdbc_ConnectionProperties_idl__ 
#include <com/sun/star/sdbc/ConnectionProperties.idl> 
#endif  

module com {  module sun {  module star {  module sdbc { 
 
/** represents the properties for a ODBC connection (session) with a specific
	database. These properties can be used when calling the method
	<member scope="com::sun::star::sdbc">XDriver::connect()</member> or 
	<member scope="com::sun::star::sdbc">XDriverManager::getConnectionWithInfo()</member>.
	
	<p>
	The properties for a connection contain additional information about how to connect to a database and 
	how to control the behavior of the resulting connection should be.
	
	</p>
	@see com::sun::star::sdbc::XDriver 
	@see com::sun::star::sdbc::XDriverManager 
	@see com::sun::star::sdbc::ConnectionProperties 
 */
service ODBCConnectionProperties
{ 
	service com::sun::star::sdbc::ConnectionProperties;
	/** should the parameter '?' in prepared statement be substituated with an distinct name
	*/
	[optional, property] boolean ParameterNameSubstitution; 

	/** the Timeout after which time a timeout should happen
	*/
	[optional, property] long Timeout; 

	/** Silent - should the connection be silent. No user interaction while creating the connection.
	*/
	[optional, property] boolean Silent; 

	/** should the driver should support a catalog.
	*/
	[optional, property] boolean UseCatalog; 

    /** specifies the encoding to use to translate the backend data

        <p>See the <a href="http://www.iana.org/assignments/character-sets">IANA character set list</a>
        for a list of valid values.</p>
	*/
	[optional, property] string CharSet; 

	/** specifies if retrieving of auto generated values should be enabled or not.
		If <TRUE/> than the statement will support the XGeneratedResultSet (future concept) interface, otherwise not.
	*/
	[optional, property] boolean IsAutoRetrievingEnabled;

	/** specifies the statement which should be executed 
		when asking an "INSERT" statement for the XGeneratedResultSet (future concept) interface.
	*/
	[optional, property] string AutoRetrievingStatement; 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
	 
===========================================================================*/ 
#endif 
