/**************************************************************
 * 
 * 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_XSQLOutput_idl__ 
#define __com_sun_star_sdbc_XSQLOutput_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_util_Date_idl__ 
#include <com/sun/star/util/Date.idl> 
#endif 
 
#ifndef __com_sun_star_util_DateTime_idl__ 
#include <com/sun/star/util/DateTime.idl> 
#endif 
 
#ifndef __com_sun_star_util_Time_idl__ 
#include <com/sun/star/util/Time.idl> 
#endif 
 
 module com {  module sun {  module star {  module io { 
 published interface XInputStream; 
};};};}; 
 
#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 XRef; 
 published interface XArray; 
 published interface XBlob; 
 published interface XClob; 
 published interface XStruct; 
 published interface XSQLData; 
 
 
/** is used as an output stream for writing the attributes of a user-defined
	type back to the database.  This interface, used only for custom mapping,
	is used by the driver, and its methods are never directly invoked
	by a programmer.
	
	
	<p>
	When an object of a class implementing interface 
	<type scope="com::sun::star::sdbc">XSQLData</type>
	is passed as an argument to a SQL statement, the JDBC driver calls
	<method scope="com::sun::star::sdbc">SQLData::getSQLType</method>
	to determine the kind of SQL datum being passed to the database.
	<br/>
	The driver then creates an instance of 
	<code>XSQLOutput</code>
	and passes it to the method 
	<method scope="com::sun::star::sdbc">XSQLData::writeSQL</method>
	. The method 
	<code>writeSQL</code>
	in turn calls the appropriate 
	<code>XSQLOutput.writeXXX</code>
	methods to write data from the 
	<type scope="com::sun::star::sdbc">XSQLData</type>
	object to the 
	<code>XSQLOutput</code>
	output stream as the representation of a SQL user-defined type.</p>
 */
published interface XSQLOutput: com::sun::star::uno::XInterface
{ 
	 
	/** writes the next attribute to the stream as a string.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeString([in]string x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as boolean.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeBoolean([in]boolean x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as byte.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeByte([in]byte x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as short.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeShort([in]short x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as long.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeInt([in]long x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as hyper.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeLong([in]hyper x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as float.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeFloat([in]float x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as double.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeDouble([in]double x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as byte sequence.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeBytes([in]sequence<byte> x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as a date.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeDate([in]com::sun::star::util::Date x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as a time.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeTime([in]com::sun::star::util::Time x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as a datetime.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeTimestamp([in]com::sun::star::util::DateTime x) 
		raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as a stream of uninterpreted
		bytes.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeBinaryStream([in]com::sun::star::io::XInputStream x) 
		raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes the next attribute to the stream as a stream of unicode string.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeCharacterStream([in]com::sun::star::io::XInputStream x) 
		raises (SQLException); 
	//------------------------------------------------------------------------- 
   	 
	/** writes to the stream the data contained in the given
		<code>XSQLData</code> object.
		
		
		<p
		>When the 
		<code>XSQLData</code>
		object is 
		<NULL/>
		, this method writes an SQL NULL to the stream.
		Otherwise, it calls the 
		<member scope="com::sun::star::sdbc">XSQLData::writeSQL()</member>
		method of the given object, which
		writes the object's attributes to the stream.
		The implementation of the method 
		<code>XSQLData::writeSQL()</code>
		calls the appropriate 
		<code>XSQLOutput.writeXXX</code>
		method(s) for writing each of the object's attributes in order.
		<br/>
		The attributes must be read from an 
		<type scope="com::sun::star::sdbc">XSQLInput</type>
		input stream and written to an 
		<code>XSQLOutput</code>
		output stream in the same order in which they were
		listed in the SQL definition of the user-defined type.
		</p>
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeObject([in]XSQLData x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes a REF(&amp;lt;structured-type&amp;gt;) to the stream.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeRef([in]XRef x) raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** writes a BLOB to the stream.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeBlob([in]XBlob x) raises (SQLException); 
	//------------------------------------------------------------------------- 
  	 
	/** writes a CLOB to the stream.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeClob([in]XClob x) raises (SQLException); 
	//------------------------------------------------------------------------- 
  	 
	/** writes a structured-type to the stream.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeStruct([in]XStruct x) raises (SQLException); 
	//------------------------------------------------------------------------- 
  	 
	/** writes an array to the stream.
		@param x
			the value to pass to the database.
		@throws SQLException 
			if a database access error occurs.
	 */
	void writeArray([in]XArray x) raises (SQLException); 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
===========================================================================*/ 
#endif 
