/**************************************************************
 * 
 * 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_XRowUpdate_idl__ 
#define __com_sun_star_sdbc_XRowUpdate_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 { 
 
 
/** is used to update data which is collected in a row.
 */
published interface XRowUpdate: com::sun::star::uno::XInterface
{ 
	 
	/** gives a nullable column a null value.
		@param columnIndex
			the position of the column
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateNull([in]long columnIndex) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a boolean value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateBoolean([in]long columnIndex, [in]boolean x) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a byte value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateByte([in]long columnIndex, [in]byte x) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a short value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateShort([in]long columnIndex, [in]short x) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with an long value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateInt([in]long columnIndex, [in]long x) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a hyper value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateLong([in]long columnIndex, [in]hyper x) raises (SQLException); 
    //------------------------------------------------------------------------- 
	 
	/** updates a column with a float value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateFloat([in]long columnIndex, [in]float x) raises (SQLException); 
    //------------------------------------------------------------------------- 
	 
	/** updates a column with a double value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateDouble([in]long columnIndex, [in]double x) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a string value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateString([in]long columnIndex, [in]string x) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a byte array value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateBytes([in]long columnIndex, [in]sequence<byte> x) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a date value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateDate([in]long columnIndex, [in]com::sun::star::util::Date x) 
		raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a time value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateTime([in]long columnIndex, [in]com::sun::star::util::Time x) 
		raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a timestamp value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateTimestamp([in]long columnIndex, 
						 [in]com::sun::star::util::DateTime x) 
      raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a stream value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@param length
			how much data should be read out of the stream
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateBinaryStream([in]long columnIndex, 
					 		[in]com::sun::star::io::XInputStream x, 
					  		[in]long length) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with a stream value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@param length
			how much data should be read out of the stream
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateCharacterStream([in]long columnIndex, 
					 		   [in]com::sun::star::io::XInputStream x, 
					  		   [in]long length) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with an object value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateObject([in]long columnIndex, [in]any x) 
      raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** updates a column with an object value.
		@param columnIndex
			the position of the column
		@param x
			the new column value
		@param scale
			defines the scale which should be used to write the numeric value
		@throws SQLException 
			if a database access error occurs.
	 */
	void updateNumericObject([in]long columnIndex, [in]any x, [in]long scale) 
      raises (SQLException); 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
===========================================================================*/ 
#endif 
