/**************************************************************
 * 
 * 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_XSQLInput_idl__ 
#define __com_sun_star_sdbc_XSQLInput_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; 
 
 
/** represents an input stream that contains a stream of values representing an
	instance of a SQL structured or distinct type.
	
	
	<p>
	This interface, used only for custom mapping, is used by the driver
	behind the scenes, and a programmer never directly invokes
	<code>SQLInput</code>
	methods.
	</p>
	<p>
	When the method 
	<code>getObject</code>
	is called with an object of a service implementing the interface 
	<code>SQLData</code>
	, the SDBC driver calls the method 
	<member scope="com::sun::star::sdbc">XSQLData::getSQLType()</member>
	to determine the SQL type of the user-defined type (UDT) being custom mapped.
	The driver creates an instance of 
	<type scope="com::sun::star::sdbc">XSQLInput</type>
	,
	populating it with the attributes of the UDT. The driver then passes the input
	stream to the method 
	<member scope="com::sun::star::sdbc">XSQLData::readSQL()</member>
	, which in turn calls the 
	<code>XSQLInput.readXXX</code>
	methods in its implementation for reading the attributes from the input stream.
	</p>
 */
published interface XSQLInput: com::sun::star::uno::XInterface
{ 
	 
	/** reads the next attribute in the stream as string.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	string readString() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as boolean.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean readBoolean() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as byte.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	byte readByte() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as short.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	short readShort() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as long.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	long readInt() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as hyper.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	hyper readLong() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as float.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	float readFloat() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as double.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	double readDouble() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as sequence of bytes. 
		   	  @returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	sequence<byte> readBytes() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as date.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	com::sun::star::util::Date readDate() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as time.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	com::sun::star::util::Time readTime() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as datetime.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	com::sun::star::util::DateTime readTimestamp() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as sequence of bytes.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	com::sun::star::io::XInputStream readBinaryStream() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** reads the next attribute in the stream as a unicode string.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	com::sun::star::io::XInputStream readCharacterStream() raises (SQLException); 
   	//------------------------------------------------------------------------- 
	 
	/** returns the datum at the head of the stream as an any.
		
		
		<p>
		The actual type of the any returned is determined by the default
		type mapping, and any customizations present in this stream's type map.
		
		<br/>
		A type map is registered with the stream by the SDBC driver before the
		stream is passed to the application.
		
		<br/>
		When the datum at the head of the stream is a SQL NULL,
		the method returns <void/>. If the datum is a SQL structured or distinct
		type, it determines the SQL type of the datum at the head of the stream,
		constructs an object of the appropriate service, and calls the method
		<member scope="com::sun::star::sdbc">XSQLData::readSQL()</member>
		on that object, which reads additional data
		from the stream using the protocol described for that method.
		
		</p>
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	any readObject() raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** reads a REF(&amp;lt;structured-type&amp;gt;) from the stream.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	XRef readRef() raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** reads a BLOB from the stream.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	XBlob readBlob() raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** reads a CLOB from the stream.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	XClob readClob() raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** reads an array from the stream.
		@returns
			the attribute; if the value is SQL NULL, return null.
		@throws SQLException 
			if a database access error occurs.
	 */
	XArray readArray() raises (SQLException); 
  	//------------------------------------------------------------------------- 
	 
	/** determines whether the last value read was null.
		@returns
			<TRUE/> if the most recently gotten SQL value was null; otherwise, <FALSE/>
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean wasNull() raises (SQLException); 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
===========================================================================*/ 
#endif 
