/* Copyright (c) 2001-2009, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.io.StringReader; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Date; import java.sql.NClob; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.RowId; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.sql.SQLWarning; import java.sql.SQLXML; import java.sql.Statement; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; import java.util.Map; import org.hsqldb.ColumnBase; import org.hsqldb.Error; import org.hsqldb.ErrorCode; import org.hsqldb.HsqlDateTime; import org.hsqldb.HsqlException; import org.hsqldb.SessionInterface; import org.hsqldb.Types; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.lib.StringInputStream; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultMetaData; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; /* $Id: JDBCResultSet.java 2986 2009-05-06 11:03:29Z fredt $ */ //boucherb@users 20051207 - patch 1.9.0 - initial JDBC 4.0 support work //fredt@users 20060431 - patch 1.9.0 rewrite with RowSetNavigator //boucherb@users 20060522 - doc 1.9.0 - full synch up to Mustang Build 84 // Revision 1.21 2006/07/12 12:27:25 boucherb // patch 1.9.0 // - full synch up to Mustang b90 /** * <!-- start generic documentation --> * A table of data representing a database result set, which * is usually generated by executing a statement that queries the database. * * <P>A <code>ResultSet</code> object maintains a cursor pointing * to its current row of data. Initially the cursor is positioned * before the first row. The <code>next</code> method moves the * cursor to the next row, and because it returns <code>false</code> * when there are no more rows in the <code>ResultSet</code> object, * it can be used in a <code>while</code> loop to iterate through * the result set. * <P> * A default <code>ResultSet</code> object is not updatable and * has a cursor that moves forward only. Thus, you can * iterate through it only once and only from the first row to the * last row. It is possible to * produce <code>ResultSet</code> objects that are scrollable and/or * updatable. The following code fragment, in which <code>con</code> * is a valid <code>Connection</code> object, illustrates how to make * a result set that is scrollable and insensitive to updates by others, and * that is updatable. See <code>ResultSet</code> fields for other * options. * <PRE> * * Statement stmt = con.createStatement( * ResultSet.TYPE_SCROLL_INSENSITIVE, * ResultSet.CONCUR_UPDATABLE); * ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"); * // rs will be scrollable, will not show changes made by others, * // and will be updatable * * </PRE> * The <code>ResultSet</code> interface provides * <i>getter</i> methods (<code>getBoolean</code>, <code>getLong</code>, and so on) * for retrieving column values from the current row. * Values can be retrieved using either the index number of the * column or the name of the column. In general, using the * column index will be more efficient. Columns are numbered from 1. * For maximum portability, result set columns within each row should be * read in left-to-right order, and each column should be read only once. * * <P>For the getter methods, a JDBC driver attempts * to convert the underlying data to the Java type specified in the * getter method and returns a suitable Java value. The JDBC specification * has a table showing the allowable mappings from SQL types to Java types * that can be used by the <code>ResultSet</code> getter methods. * <P> * <P>Column names used as input to getter methods are case * insensitive. When a getter method is called with * a column name and several columns have the same name, * the value of the first matching column will be returned. * The column name option is * designed to be used when column names are used in the SQL * query that generated the result set. * For columns that are NOT explicitly named in the query, it * is best to use column numbers. (JDBC4 clarification:) If column names are used, the * programmer should take care to guarantee that they uniquely refer to * the intended columns, which can be assured with the SQL <i>AS</i> clause. * <P> * A set of updater methods were added to this interface * in the JDBC 2.0 API (Java<sup><font size=-2>TM</font></sup> 2 SDK, * Standard Edition, version 1.2). The comments regarding parameters * to the getter methods also apply to parameters to the * updater methods. * <P> * The updater methods may be used in two ways: * <ol> * <li>to update a column value in the current row. In a scrollable * <code>ResultSet</code> object, the cursor can be moved backwards * and forwards, to an absolute position, or to a position * relative to the current row. * The following code fragment updates the <code>NAME</code> column * in the fifth row of the <code>ResultSet</code> object * <code>rs</code> and then uses the method <code>updateRow</code> * to update the data source table from which <code>rs</code> was derived. * <PRE> * * rs.absolute(5); // moves the cursor to the fifth row of rs * rs.updateString("NAME", "AINSWORTH"); // updates the * // <code>NAME</code> column of row 5 to be <code>AINSWORTH</code> * rs.updateRow(); // updates the row in the data source * * </PRE> * </li> * <li>to insert column values into the insert row. An updatable * <code>ResultSet</code> object has a special row associated with * it that serves as a staging area for building a row to be inserted. * The following code fragment moves the cursor to the insert row, builds * a three-column row, and inserts it into <code>rs</code> and into * the data source table using the method <code>insertRow</code>. * <PRE> * * rs.moveToInsertRow(); // moves cursor to the insert row * rs.updateString(1, "AINSWORTH"); // updates the * // first column of the insert row to be <code>AINSWORTH</code> * rs.updateInt(2,35); // updates the second column to be <code>35</code> * rs.updateBoolean(3, true); // updates the third column to <code>true</code> * rs.insertRow(); * rs.moveToCurrentRow(); * * </PRE> * </li> * </ol> * <P>A <code>ResultSet</code> object is automatically closed when the * <code>Statement</code> object that * generated it is closed, re-executed, or used * to retrieve the next result from a sequence of multiple results. * * <P>The number, types and properties of a <code>ResultSet</code> * object's columns are provided by the <code>ResulSetMetaData</code> * object returned by the <code>ResultSet.getMetaData</code> method. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * A <code>ResultSet</code> object generated by HSQLDB is by default of * <code>ResultSet.TYPE_FORWARD_ONLY</code> (as is standard JDBC behavior) * and does not allow the use of absolute and relative positioning * methods. If a statement is created with:<p> * * <pre class="JavaCodeExample"> * Statement stmt = conn.<b>createStatement</b>(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); * </pre> * * then the <code>ResultSet</code> objects it produces support * using all of the absolute and relative positioning methods of JDBC2 * to set the position of the current row, for example:<p> * * <pre class="JavaCodeExample"> * rs.<b>absolute</b>(<span class="JavaNumericLiteral">5</span>); * String fifthRowValue = rs.<b>getString</b>(<span class="JavaNumericLiteral">1</span>); * rs.<b>relative</b>(<span class="JavaNumericLiteral">4</span>); * String ninthRowValue = rs.<b>getString</b>(<span class="JavaNumericLiteral">1</span>); * </pre> * * Note: An HSQLDB <code>ResultSet</code> object persists, even after its * connection is closed. This is regardless of the operational mode of * the {@link org.hsqldb.Database Database} from which it came. That is, they * persist whether originating from a <code>Server</code>, * <code>WebServer</code> or in-process mode <code>Database.</code> * <p> * * From HSQLDB 1.9.0, there is full support for updateable result sets. * Supported methods * include all updateXXX methods for the supported types, as well as the * {@link #insertRow}, * {@link #updateRow}, {@link #deleteRow}, {@link #moveToInsertRow} * methods.<p> * * The Statement must be created with ResultSet.CONCUR_UPDATABLE instead of * CONCUR_READ_ONLY.<p> * * Updatability of a result set follows the SQL standards. Some or all columns * of an updatable result set can be updated. The current row in such result sets * can be deleted using the {@link #deleteRow} method. Some updatable result set * can also be inserted into and support {@link #moveToInsertRow}.<p> * * A result set is updatable if the SELECT statement * is updatable. This includes SELECT from TABLE and updatable VIEW objects. * An updatable SELECT statement has a single uderlying table or view. * HSQLDB supports both scrollable and forward-only result sets for updatability. * * <pre class="JavaCodeExample"> * -- In the SELECT below, columns A and B are updatable, any row can be * -- deleted, but it is not insertable-into as column C is not directly from * -- the table. * SELECT A, B, A + B AS C FROM T WHERE ... * * -- The SELECT below can be insertable-into so long as other columns of the * -- table that do not appear in the SELECT list have a default value. * SELECT A, B FROM T WHERE ... * </pre> * * <b>JRE 1.1.x Notes:</b> <p> * * In general, JDBC 2 support requires Java 1.2 and above, and JDBC 3 requires * Java 1.4 and above. In HSQLDB, support for methods introduced in different * versions of JDBC depends on the JDK version used for compiling and building * HSQLDB.<p> * * Since 1.7.0, it is possible to build the product so that * all JDBC 2 methods can be called while executing under the version 1.1.x * <em>Java Runtime Environment</em><sup><font size="-2">TM</font></sup>. * However, some of these method calls require <code>int</code> values that * are defined only in the JDBC 2 or greater version of the * {@link java.sql.ResultSet ResultSet} interface. For this reason, when the * product is compiled under JDK 1.1.x, these values are defined here, in this * class. <p> * * In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the * JDBC2-only <code>ResultSet</code> values can be achieved by referring * to them in parameter specifications and return value comparisons, * respectively, as follows: <p> * * <pre class="JavaCodeExample"> * JDBCResultSet.FETCH_FORWARD * JDBCResultSet.TYPE_FORWARD_ONLY * JDBCResultSet.TYPE_SCROLL_INSENSITIVE * JDBCResultSet.CONCUR_READ_ONLY * // etc. * </pre> * * However, please note that code written in such a manner will not be * compatible for use with other JDBC 2 drivers, since they expect and use * <code>ResultSet</code>, rather than <code>JDBCResultSet</code>. Also * note, this feature is offered solely as a convenience to developers * who must work under JDK 1.1.x due to operating constraints, yet wish to * use some of the more advanced features available under the JDBC 2 * specification.<p> * * (fredt@users) <br> * (boucherb@users)<p> * * </div> * @see JDBCStatement#executeQuery * @see JDBCStatement#getResultSet * @see java.sql.ResultSetMetaData * * @author Campbell Boucher-Burnett (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class JDBCResultSet implements ResultSet { /** * <!-- start generic documentation --> * Moves the cursor froward one row from its current position. * A <code>ResultSet</code> cursor is initially positioned * before the first row; the first call to the method * <code>next</code> makes the first row the current row; the * second call makes the second row the current row, and so on. * <p>(JDBC4 clarification:) * When a call to the <code>next</code> method returns <code>false</code>, * the cursor is positioned after the last row. Any * invocation of a <code>ResultSet</code> method which requires a * current row will result in a <code>SQLException</code> being thrown. * If the result set type is <code>TYPE_FORWARD_ONLY</code>, it is vendor specified * whether their JDBC driver implementation will return <code>false</code> or * throw an <code>SQLException</code> on a * subsequent call to <code>next</code>. * * <P>If an input stream is open for the current row, a call * to the method <code>next</code> will * implicitly close it. A <code>ResultSet</code> object's * warning chain is cleared when a new row is read. * <!-- end generic documentation --> * * @return <code>true</code> if the new current row is valid; * <code>false</code> if there are no more rows * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public boolean next() throws SQLException { checkClosed(); return navigator.next(); } /** * <!-- start generic documentation --> * Releases this <code>ResultSet</code> object's database and * JDBC resources immediately instead of waiting for * this to happen when it is automatically closed. * * <P>(JDBC4 clarification:) * The closing of a <code>ResultSet</code> object does <strong>not</strong> close the <code>Blob</code>, * <code>Clob</code> or <code>NClob</code> objects created by the <code>ResultSet</code>. <code>Blob</code>, * <code>Clob</code> or <code>NClob</code> objects remain valid for at least the duration of the * transaction in which they are created, unless their <code>free</code> method is invoked. * <p> * (JDBC4 clarification:) * When a <code>ResultSet</code> is closed, any <code>ResultSetMetaData</code> * instances that were created by calling the <code>getMetaData</code> * method remain accessible. * * <P><B>Note:</B> A <code>ResultSet</code> object * is automatically closed by the * <code>Statement</code> object that generated it when * that <code>Statement</code> object is closed, * re-executed, or is used to retrieve the next result from a * sequence of multiple results. * (JDBC4 deleted:) [A <code>ResultSet</code> object is also automatically * closed when it is garbage collected.] * <p> * Calling the method <code>close</code> on a <code>ResultSet</code> * object that is already closed is a no-op. * <P> * <p> * <!-- end generic documentation --> * * @exception SQLException if a database access error occurs */ public void close() throws SQLException { if (navigator == null) { return; } navigator.close(); navigator = null; if (autoClose && statement != null) { statement.close(); } } /** * <!-- start generic documentation --> * Reports whether * the last column read had a value of SQL <code>NULL</code>. * Note that you must first call one of the getter methods * on a column to try to read its value and then call * the method <code>wasNull</code> to see if the value read was * SQL <code>NULL</code>. * <!-- end generic documentation --> * * @return <code>true</code> if the last column value read was SQL * <code>NULL</code> and <code>false</code> otherwise * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public boolean wasNull() throws SQLException { checkClosed(); return wasNullValue; } //====================================================================== // Methods for accessing results by column index //====================================================================== /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>String</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public String getString(int columnIndex) throws SQLException { return (String) getColumnInType(columnIndex, Type.SQL_VARCHAR); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>boolean</code> in the Java programming language. * * * <P>(JDBC4 clarification:) * <P>If the designated column has a datatype of CHAR or VARCHAR * and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT * and contains a 0, a value of <code>false</code> is returned. If the designated column has a datatype * of CHAR or VARCHAR * and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT * and contains a 1, a value of <code>true</code> is returned. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>false</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public boolean getBoolean(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_BOOLEAN); return o == null ? false : ((Boolean) o).booleanValue(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>byte</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public byte getByte(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.TINYINT); return o == null ? 0 : ((Number) o).byteValue(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>short</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public short getShort(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_SMALLINT); return o == null ? 0 : ((Number) o).shortValue(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * an <code>int</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public int getInt(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_INTEGER); return o == null ? 0 : ((Number) o).intValue(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>long</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public long getLong(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_BIGINT); return o == null ? 0 : ((Number) o).longValue(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>float</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public float getFloat(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_DOUBLE); return o == null ? (float) 0.0 : ((Number) o).floatValue(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>double</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public double getDouble(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_DOUBLE); return o == null ? 0.0 : ((Number) o).doubleValue(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>java.sql.BigDecimal</code> in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB converts the result and sets the scale * with BigDecimal.ROUND_HALF_DOWN. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param scale the number of digits to the right of the decimal point * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated * by java.sun.com as of JDK 1.2 */ //#ifdef DEPRECATEDJDBC @Deprecated public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { if (scale < 0) { throw Util.outOfRangeArgument(); } // boucherb@users 20020502 - added conversion BigDecimal bd = (BigDecimal) getColumnInType(columnIndex, Type.SQL_DECIMAL); if (bd != null) { bd = bd.setScale(scale, BigDecimal.ROUND_HALF_DOWN); } return bd; } //#endif /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>byte</code> array in the Java programming language. * The bytes represent the raw values returned by the driver. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB returns correct values for columns of binary types * <code>BINARY</code>, <code>BIT</code>, <code>BLOB</code> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public byte[] getBytes(int columnIndex) throws SQLException { Object x = getColumnInType(columnIndex, Type.SQL_VARBINARY); if (x == null) { return null; } return ((BinaryData) x).getBytes(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>java.sql.Date</code> object in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Date getDate(int columnIndex) throws SQLException { TimestampData t = (TimestampData) getColumnInType(columnIndex, Type.SQL_DATE); if (t == null) { return null; } return (Date) Type.SQL_DATE.convertSQLToJava(session, t); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>java.sql.Time</code> object in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Time getTime(int columnIndex) throws SQLException { TimeData t = (TimeData) getColumnInType(columnIndex, Type.SQL_TIME); if (t == null) { return null; } return (Time) Type.SQL_TIME.convertSQLToJava(session, t); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>java.sql.Timestamp</code> object in the Java programming language. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Timestamp getTimestamp(int columnIndex) throws SQLException { TimestampData t = (TimestampData) getColumnInType(columnIndex, Type.SQL_TIMESTAMP); if (t == null) { return null; } return (Timestamp) Type.SQL_TIMESTAMP.convertSQLToJava(session, t); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a stream of ASCII characters. The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large <char>LONGVARCHAR</char> values. * The JDBC driver will * do any necessary conversion from the database format into ASCII. * * <P><B>Note:</B> All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. Also, a * stream may return <code>0</code> when the method * <code>InputStream.available</code> * is called whether there is data available or not. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * The limitation noted above does not apply to HSQLDB.<p> * * When the column is of type CHAR and its variations, it requires no * conversion since it is represented internally already as a * Java String object. When the column is not of type CHAR and its * variations, the returned stream is based on a conversion to the * Java <code>String</code> representation of the value. In either case, * the obtained stream is always equivalent to a stream of the low order * bytes from the value's String representation. <p> * * HSQLDB SQL <code>CHAR</code> and its variations are all Unicode strings * internally, so the recommended alternatives to this method are * {@link #getString(int) getString}, * {@link #getUnicodeStream(int) getUnicodeStream} (<b>deprecated</b>) * and new to 1.7.0: {@link #getCharacterStream(int) getCharacterStream} * (now prefered over the deprecated getUnicodeStream alternative). * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return a Java input stream that delivers the database column value * as a stream of one-byte ASCII characters; * if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public java.io.InputStream getAsciiStream( int columnIndex) throws SQLException { String s = getString(columnIndex); if (s == null) { return null; } try { return new ByteArrayInputStream(s.getBytes("US-ASCII")); } catch (IOException e) { return null; } } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * as a stream of two-byte Unicode characters. The first byte is * the high byte; the second byte is the low byte. * * The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large <code>LONGVARCHAR</code>values. The * JDBC driver will do any necessary conversion from the database * format into Unicode. * * <P><B>Note:</B> All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. * Also, a stream may return <code>0</code> when the method * <code>InputStream.available</code> * is called, whether there is data available or not. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * The limitation noted above does not apply to HSQLDB.<p> * * When the column is of type CHAR and its variations, it requires no * conversion since it is represented internally already as * Java Strings. When the column is not of type CHAR and its variations, * the returned stream is based on a conversion to the * Java <code>String</code> representation of the value. In either case, * the obtained stream is always equivalent to a stream of * bytes from the value's String representation, with high-byte first. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return a Java input stream that delivers the database column value * as a stream of two-byte Unicode characters; * if the value is SQL <code>NULL</code>, the value returned is * <code>null</code> * * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated use <code>getCharacterStream</code> in place of * <code>getUnicodeStream</code> */ //#ifdef DEPRECATEDJDBC @Deprecated public java.io.InputStream getUnicodeStream( int columnIndex) throws SQLException { String s = getString(columnIndex); if (s == null) { return null; } return new StringInputStream(s); } //#endif /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a stream of * uninterpreted bytes. The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large <code>LONGVARBINARY</code> values. * * <P><B>Note:</B> All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. Also, a * stream may return <code>0</code> when the method * <code>InputStream.available</code> * is called whether there is data available or not. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return a Java input stream that delivers the database column value * as a stream of uninterpreted bytes; * if the value is SQL <code>NULL</code>, the value returned is * <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public java.io.InputStream getBinaryStream( int columnIndex) throws SQLException { byte[] b = getBytes(columnIndex); return wasNull() ? null : new ByteArrayInputStream(b); } //====================================================================== // Methods for accessing results by column label //====================================================================== /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>String</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public String getString(String columnLabel) throws SQLException { return getString(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>boolean</code> in the Java programming language. * * <P>(JDBC4 clarification:) If the designated column has a datatype of CHAR or VARCHAR * and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT * and contains a 0, a value of <code>false</code> is returned. If the designated column has a datatype * of CHAR or VARCHAR * and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT * and contains a 1, a value of <code>true</code> is returned. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>false</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public boolean getBoolean(String columnLabel) throws SQLException { return getBoolean(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>byte</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public byte getByte(String columnLabel) throws SQLException { return getByte(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>short</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public short getShort(String columnLabel) throws SQLException { return getShort(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * an <code>int</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public int getInt(String columnLabel) throws SQLException { return getInt(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>long</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public long getLong(String columnLabel) throws SQLException { return getLong(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>float</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public float getFloat(String columnLabel) throws SQLException { return getFloat(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>double</code> in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>0</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public double getDouble(String columnLabel) throws SQLException { return getDouble(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>java.math.BigDecimal</code> in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB converts the result and sets the scale * with BigDecimal.ROUND_HALF_DOWN. * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param scale the number of digits to the right of the decimal point * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated * by java.sun.com as of JDK 1.2 */ //#ifdef DEPRECATEDJDBC @Deprecated public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException { return getBigDecimal(findColumn(columnLabel), scale); } //#endif /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>byte</code> array in the Java programming language. * The bytes represent the raw values returned by the driver. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public byte[] getBytes(String columnLabel) throws SQLException { return getBytes(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>java.sql.Date</code> object in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Date getDate(String columnLabel) throws SQLException { return getDate(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>java.sql.Time</code> object in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Time getTime(String columnLabel) throws SQLException { return getTime(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>java.sql.Timestamp</code> object in the Java programming language. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Timestamp getTimestamp(String columnLabel) throws SQLException { return getTimestamp(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a stream of * ASCII characters. The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large <code>LONGVARCHAR</code> values. * The JDBC driver will * do any necessary conversion from the database format into ASCII. * * <P><B>Note:</B> All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. Also, a * stream may return <code>0</code> when the method <code>available</code> * is called whether there is data available or not. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Java input stream that delivers the database column value * as a stream of one-byte ASCII characters. * If the value is SQL <code>NULL</code>, * the value returned is <code>null</code>. * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @see #getAsciiStream(int) */ public java.io.InputStream getAsciiStream( String columnLabel) throws SQLException { return getAsciiStream(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a stream of two-byte * Unicode characters. The first byte is the high byte; the second * byte is the low byte. * * The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large <code>LONGVARCHAR</code> values. * The JDBC technology-enabled driver will * do any necessary conversion from the database format into Unicode. * * <P><B>Note:</B> All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. * Also, a stream may return <code>0</code> when the method * <code>InputStream.available</code> is called, whether there * is data available or not. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Java input stream that delivers the database column value * as a stream of two-byte Unicode characters. * If the value is SQL <code>NULL</code>, the value returned * is <code>null</code>. * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated use <code>getCharacterStream</code> instead * @see #getUnicodeStream(int) */ //#ifdef DEPRECATEDJDBC @Deprecated public java.io.InputStream getUnicodeStream( String columnLabel) throws SQLException { return getUnicodeStream(findColumn(columnLabel)); } //#endif /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a stream of uninterpreted * <code>byte</code>s. * The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large <code>LONGVARBINARY</code> * values. * * <P><B>Note:</B> All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. Also, a * stream may return <code>0</code> when the method <code>available</code> * is called whether there is data available or not. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Java input stream that delivers the database column value * as a stream of uninterpreted bytes; * if the value is SQL <code>NULL</code>, the result is <code>null</code> * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public java.io.InputStream getBinaryStream( String columnLabel) throws SQLException { return getBinaryStream(findColumn(columnLabel)); } //===================================================================== // Advanced features: //===================================================================== /** * <!-- start generic documentation --> * Retrieves the first warning reported by calls on this * <code>ResultSet</code> object. * Subsequent warnings on this <code>ResultSet</code> object * will be chained to the <code>SQLWarning</code> object that * this method returns. * * <P>The warning chain is automatically cleared each time a new * row is read. This method may not be called on a <code>ResultSet</code> * object that has been closed; doing so will cause an * <code>SQLException</code> to be thrown. * <P> * <B>Note:</B> This warning chain only covers warnings caused * by <code>ResultSet</code> methods. Any warning caused by * <code>Statement</code> methods * (such as reading OUT parameters) will be chained on the * <code>Statement</code> object. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not produce <code>SQLWarning</code> * objects on any ResultSet object warning chain; this * method always returns <code>null</code>. * </div> * <!-- end release-specific documentation --> * * @return the first <code>SQLWarning</code> object reported or * <code>null</code> if there are none * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public SQLWarning getWarnings() throws SQLException { checkClosed(); return null; } /** * <!-- start generic documentation --> * Clears all warnings reported on this <code>ResultSet</code> object. * After this method is called, the method <code>getWarnings</code> * returns <code>null</code> until a new warning is * reported for this <code>ResultSet</code> object. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not produce <code>SQLWarning</code> * objects on any ResultSet object warning chain; calls to this method * are ignored. * </div> * <!-- end release-specific documentation --> * * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public void clearWarnings() throws SQLException { checkClosed(); } /** * <!-- start generic documentation --> * Retrieves the name of the SQL cursor used by this <code>ResultSet</code> * object. * * <P>In SQL, a result table is retrieved through a cursor that is * named. The current row of a result set can be updated or deleted * using a positioned update/delete statement that references the * cursor name. To insure that the cursor has the proper isolation * level to support update, the cursor's <code>SELECT</code> statement * should be of the form <code>SELECT FOR UPDATE</code>. If * <code>FOR UPDATE</code> is omitted, the positioned updates may fail. * * <P>The JDBC API supports this SQL feature by providing the name of the * SQL cursor used by a <code>ResultSet</code> object. * The current row of a <code>ResultSet</code> object * is also the current row of this SQL cursor. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support this feature. <p> * * Calling this method always throws an <code>SQLException</code>, * stating that the operation is not supported. * </div> * <!-- end release-specific documentation --> * * @return the SQL name for this <code>ResultSet</code> object's cursor * @exception SQLException if a database access error occurs or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method */ public String getCursorName() throws SQLException { checkClosed(); return result.getMainString(); } /** * <!-- start generic documentation --> * Retrieves the number, types and properties of * this <code>ResultSet</code> object's columns. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * <B>Example:</B> <p> * * The following code fragment creates a <code>ResultSet</code> object rs, * creates a <code>ResultSetMetaData</code> object rsmd, and uses rsmd * to find out how many columns rs has and whether the first column * in rs can be used in a <code>WHERE</code> clause. <p> * * <pre class="JavaCodeExample"> * ResultSet rs = stmt.<b>executeQuery</b>(<span class="JavaStringLiteral">"SELECT a, b, c FROM TABLE2"</span>); * ResultSetMetaData rsmd = rs.<b>getMetaData</b>();<br> * int numberOfColumns = rsmd.<b>getColumnCount</b>();<br> * boolean b = rsmd.<b>isSearchable</b>(1);<br> * </pre> * * <hr> * * <B>Changes:</B> <p> * * With version 1.9.0, the engine's SQL implementation has been * completely rewritten. Changes to this class and the implementation of * ResultSetMetaData reflect the engine's new capabilities and provide * more accurate information. <p> * * changes to consider: <p> * * <ol> * <li>isAutoIncrement(int) <i>always</i> returned <code>false</code></li> * <li>isNullable(int) returns the nullability of a real table or view * column in the ResultSet and returns * <code>columnNoNulls</code> for non-base-column ResultSet columns * (columns of the ResultSet that are based on expressions or * aggregates).</li> * <li>getColumnDisplaySize(int) returns correct results even for expression * columns.</li> * <li>getPrecision(int) returns the correct precision even for expression * columns.</li> * <li>getScale(int) returns the correct precision even for expression * columns.</li> * <li>getCatalogName(int) returns the catalog name of the database.</li> * </ol> <p> * * <hr> * </div> * <!-- end release-specific documentation --> * * @return the description of this <code>ResultSet</code> object's columns * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @see JDBCResultSetMetaData */ public ResultSetMetaData getMetaData() throws SQLException { checkClosed(); if (resultSetMetaData == null) { boolean isUpdatable = rsConcurrency == ResultSet.CONCUR_UPDATABLE; resultSetMetaData = new JDBCResultSetMetaData(resultMetaData, isUpdatable, rsInsertability, connProperties); } return resultSetMetaData; } /** * <!-- start generic documentation --> * <p>Gets the value of the designated column in the current row * of this <code>ResultSet</code> object as * an <code>Object</code> in the Java programming language. * * <p>This method will return the value of the given column as a * Java object. The type of the Java object will be the default * Java object type corresponding to the column's SQL type, * following the mapping for built-in types specified in the JDBC * specification. If the value is an SQL <code>NULL</code>, * the driver returns a Java <code>null</code>. * * <p>This method may also be used to read database-specific * abstract data types. * * In the JDBC 2.0 API, the behavior of method * <code>getObject</code> is extended to materialize * data of SQL user-defined types. * <p> * If <code>Connection.getTypeMap</code> does not throw a * <code>SQLFeatureNotSupportedException</code>, * then when a column contains a structured or distinct value, * the behavior of this method is as * if it were a call to: <code>getObject(columnIndex, * this.getStatement().getConnection().getTypeMap())</code>. * * If <code>Connection.getTypeMap</code> does throw a * <code>SQLFeatureNotSupportedException</code>, * then structured values are not supported, and distinct values * are mapped to the default Java class as determined by the * underlying SQL type of the DISTINCT type. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return a <code>java.lang.Object</code> holding the column value * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Object getObject(int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; switch (sourceType.typeCode) { case Types.SQL_DATE : return getDate(columnIndex); case Types.SQL_TIME : case Types.SQL_TIME_WITH_TIME_ZONE : return getTime(columnIndex); case Types.SQL_TIMESTAMP : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : return getTimestamp(columnIndex); case Types.SQL_BINARY : case Types.SQL_VARBINARY : return getBytes(columnIndex); case Types.OTHER : case Types.JAVA_OBJECT : { Object o = getColumnInType(columnIndex, sourceType); if (o == null) { return null; } try { return ((JavaObjectData) o).getObject(); } catch (HsqlException e) { throw Util.sqlException(e); } } default : return getColumnInType(columnIndex, sourceType); } } /** * <!-- start generic documentation --> * <p>Gets the value of the designated column in the current row * of this <code>ResultSet</code> object as * an <code>Object</code> in the Java programming language. * * <p>This method will return the value of the given column as a * Java object. The type of the Java object will be the default * Java object type corresponding to the column's SQL type, * following the mapping for built-in types specified in the JDBC * specification. If the value is an SQL <code>NULL</code>, * the driver returns a Java <code>null</code>. * <P> * This method may also be used to read database-specific * abstract data types. * <P> * In the JDBC 2.0 API, the behavior of the method * <code>getObject</code> is extended to materialize * data of SQL user-defined types. When a column contains * a structured or distinct value, the behavior of this method is as * if it were a call to: <code>getObject(columnIndex, * this.getStatement().getConnection().getTypeMap())</code>. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a <code>java.lang.Object</code> holding the column value * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Object getObject(String columnLabel) throws SQLException { return getObject(findColumn(columnLabel)); } //---------------------------------------------------------------- /** * <!-- start generic documentation --> * Maps the given <code>ResultSet</code> column label to its * <code>ResultSet</code> column index. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * Starting with 1.9.x, HSQLDB does an exhaustive search, backed by * a cache lookup (to improve performance for subsequent invocations with * a given input). <p> * * This is in response to an observation posted here: <p> * * http://sourceforge.net/forum/forum.php?thread_id=1388727&forum_id=73674<p> * * Upon careful investigation of the JDBC specification and the behaviour * of existing JDBC drivers, there is actually nothing preventing the * findColumn method from doing an exhaustive search, as long as it conforms * to the following rules (which describe the new implementation): <p> * * <ol> * <li> the entire search is case insensitive * <li> each search iteration occurs from leftmost to rightmost column, * returning the first match encountered * <li> the first pass matches only bare column labels * <li> the second pass matches only simple column names * <li> further passes conform to the identifier qualification * and identifier quoting rules of the engine * </ol> * * In this implementation, the SQL tokenizer is not employed, both because * it does not yet correctly handle greater than two part qualification * and also because is is not immediately considered important to do a * truly exhaustive search, handling the full range of possibly mixed quoted * and unquoted identifier components. <p> * * Instead: <p> * <ul> * <li> a third pass matches simple table-dot-column qualified names * <li> a fourth pass matches simple schema-dot-table-dot-column qualified column names * </ul> * </div> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column index of the given column name * @exception SQLException if the <code>ResultSet</code> object * does not contain a column labeled <code>columnLabel</code>, a database access error occurs * or this method is called on a closed result set */ public int findColumn(final String columnLabel) throws SQLException { checkClosed(); if (columnLabel == null) { throw Util.nullArgument(); } int columnIndex; // faster lookup for subsequent access if (columnMap != null) { columnIndex = columnMap.get(columnLabel, -1); if (columnIndex != -1) { return columnIndex; } } final String[] colLabels = resultMetaData.columnLabels; columnIndex = -1; // column labels first, to preference column aliases for (int i = 0; i < columnCount; i++) { if (columnLabel.equalsIgnoreCase(colLabels[i])) { columnIndex = i; break; } } final ColumnBase[] columns = resultMetaData.columns; // then bare column names, to preference simple // quoted column idents that *may* contain "." if (columnIndex < 0) { for (int i = 0; i < columnCount; i++) { if (columnLabel.equalsIgnoreCase(columns[i].getNameString())) { columnIndex = i; break; } } } // then table-qualified column names (again, quoted // table idents *may* contain "." // As a last resort, "fully" qualified column names // (we don't yet bother with catalog qualification) if (columnIndex < 0) { int position = columnLabel.indexOf('.'); if (position < 0) { throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND, columnLabel); } for (int i = 0; i < columnCount; i++) { final String tabName = columns[i].getTableNameString(); if (tabName == null || tabName.length() == 0) { continue; } final String colName = columns[i].getNameString(); if (columnLabel.equalsIgnoreCase(tabName + '.' + colName)) { columnIndex = i; break; } final String schemName = columns[i].getSchemaNameString(); if (schemName == null || schemName.length() == 0) { continue; } String match = new StringBuffer(schemName).append('.').append( tabName).append('.').append(colName).toString(); if (columnLabel.equalsIgnoreCase(match)) { columnIndex = i; break; } } } if (columnIndex < 0) { throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND, columnLabel); } columnIndex++; if (columnMap == null) { columnMap = new IntValueHashMap(); } columnMap.put(columnLabel, columnIndex); return columnIndex; } //--------------------------JDBC 2.0----------------------------------- //--------------------------------------------------------------------- // Getters and Setters //--------------------------------------------------------------------- /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a * <code>java.io.Reader</code> object. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @return a <code>java.io.Reader</code> object that contains the column * value; if the value is SQL <code>NULL</code>, the value returned is * <code>null</code> in the Java programming language. * @param columnIndex the first column is 1, the second is 2, ... * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @since JDK 1.2 */ public java.io.Reader getCharacterStream( int columnIndex) throws SQLException { String s = getString(columnIndex); if (s == null) { return null; } return new StringReader(s); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a * <code>java.io.Reader</code> object. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a <code>java.io.Reader</code> object that contains the column * value; if the value is SQL <code>NULL</code>, the value returned is * <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @since JDK 1.2 */ public java.io.Reader getCharacterStream( String columnLabel) throws SQLException { return getCharacterStream(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a * <code>java.math.BigDecimal</code> with full precision. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value (full precision); * if the value is SQL <code>NULL</code>, the value returned is * <code>null</code> in the Java programming language. * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public BigDecimal getBigDecimal(int columnIndex) throws SQLException { return (BigDecimal) getColumnInType(columnIndex, Type.SQL_DECIMAL); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a * <code>java.math.BigDecimal</code> with full precision. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value (full precision); * if the value is SQL <code>NULL</code>, the value returned is * <code>null</code> in the Java programming language. * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public BigDecimal getBigDecimal(String columnLabel) throws SQLException { return getBigDecimal(findColumn(columnLabel)); } //--------------------------------------------------------------------- // Traversal/Positioning //--------------------------------------------------------------------- /** * <!-- start generic documentation --> * Retrieves whether the cursor is before the first row in * this <code>ResultSet</code> object. * <p> * (JDBC4 Clarification:) <p> * <strong>Note:</strong>Support for the <code>isBeforeFirst</code> method * is optional for <code>ResultSet</code>s with a result * set type of <code>TYPE_FORWARD_ONLY</code> * <!-- end generic documentation --> * * @return <code>true</code> if the cursor is before the first row; * <code>false</code> if the cursor is at any other position or the * result set contains no rows * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean isBeforeFirst() throws SQLException { checkClosed(); if (isOnInsertRow) { return false; } return navigator.isBeforeFirst(); } /** * <!-- start generic documentation --> * Retrieves whether the cursor is after the last row in * this <code>ResultSet</code> object. * <p> * (JDBC4 Clarification:)<p> * <strong>Note:</strong>Support for the <code>isAfterLast</code> method * is optional for <code>ResultSet</code>s with a result * set type of <code>TYPE_FORWARD_ONLY</code> * <!-- end generic documentation --> * * @return <code>true</code> if the cursor is after the last row; * <code>false</code> if the cursor is at any other position or the * result set contains no rows * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean isAfterLast() throws SQLException { // At afterLast condition exists when resultset has been traversed and // the current row is null. iCurrentRow should also be set to // afterlast but no need to test checkClosed(); if (isOnInsertRow) { return false; } return navigator.isAfterLast(); } /** * <!-- start generic documentation --> * Retrieves whether the cursor is on the first row of * this <code>ResultSet</code> object. * <p> * (JDBC4 Clarification:) <p> * <strong>Note:</strong>Support for the <code>isFirst</code> method * is optional for <code>ResultSet</code>s with a result * set type of <code>TYPE_FORWARD_ONLY</code> * <!-- end generic documentation --> * * @return <code>true</code> if the cursor is on the first row; * <code>false</code> otherwise * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean isFirst() throws SQLException { checkClosed(); if (isOnInsertRow) { return false; } return navigator.isFirst(); } /** * <!-- start generic documentation --> * Retrieves whether the cursor is on the last row of * this <code>ResultSet</code> object. * <strong>Note:</strong> Calling the method <code>isLast</code> may be expensive * because the JDBC driver * might need to fetch ahead one row in order to determine * whether the current row is the last row in the result set. * <p> * (JDBC4 Clarification:) <p> * <strong>Note:</strong> Support for the <code>isLast</code> method * is optional for <code>ResultSet</code>s with a result * set type of <code>TYPE_FORWARD_ONLY</code> * <!-- end generic documentation --> * * @return <code>true</code> if the cursor is on the last row; * <code>false</code> otherwise * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean isLast() throws SQLException { checkClosed(); if (isOnInsertRow) { return false; } return navigator.isLast(); } /** * <!-- start generic documentation --> * Moves the cursor to the front of * this <code>ResultSet</code> object, just before the * first row. This method has no effect if the result set contains no rows. * <!-- end generic documentation --> * * @exception SQLException if a database access error * occurs, this method is called on a closed result set or the * result set type is <code>TYPE_FORWARD_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void beforeFirst() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } navigator.beforeFirst(); } /** * <!-- start generic documentation --> * Moves the cursor to the end of * this <code>ResultSet</code> object, just after the * last row. This method has no effect if the result set contains no rows. * <!-- end generic documentation --> * * @exception SQLException if a database access error * occurs, this method is called on a closed result set * or the result set type is <code>TYPE_FORWARD_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void afterLast() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } navigator.afterLast(); } /** * <!-- start generic documentation --> * Moves the cursor to the first row in * this <code>ResultSet</code> object. * <!-- end generic documentation --> * * @return <code>true</code> if the cursor is on a valid row; * <code>false</code> if there are no rows in the result set * @exception SQLException if a database access error * occurs, this method is called on a closed result set * or the result set type is <code>TYPE_FORWARD_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean first() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } return navigator.first(); } /** * <!-- start generic documentation --> * Moves the cursor to the last row in * this <code>ResultSet</code> object. * <!-- end generic documentation --> * * @return <code>true</code> if the cursor is on a valid row; * <code>false</code> if there are no rows in the result set * @exception SQLException if a database access error * occurs, this method is called on a closed result set * or the result set type is <code>TYPE_FORWARD_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean last() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } return navigator.last(); } /** * <!-- start generic documentation --> * Retrieves the current row number. The first row is number 1, the * second number 2, and so on. * <p> * (JDBC4 Clarification:) <p> * <strong>Note:</strong>Support for the <code>getRow</code> method * is optional for <code>ResultSet</code>s with a result * set type of <code>TYPE_FORWARD_ONLY</code> * <!-- end generic documentation --> * * @return the current row number; <code>0</code> if there is no current row * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public int getRow() throws SQLException { checkClosed(); if (navigator.isAfterLast()) { return 0; } return navigator.getRowNumber() + 1; } /** * <!-- start generic documentation --> * Moves the cursor to the given row number in * this <code>ResultSet</code> object. * * <p>If the row number is positive, the cursor moves to * the given row number with respect to the * beginning of the result set. The first row is row 1, the second * is row 2, and so on. * * <p>If the given row number is negative, the cursor moves to * an absolute row position with respect to * the end of the result set. For example, calling the method * <code>absolute(-1)</code> positions the * cursor on the last row; calling the method <code>absolute(-2)</code> * moves the cursor to the next-to-last row, and so on. * * <p>An attempt to position the cursor beyond the first/last row in * the result set leaves the cursor before the first row or after * the last row. * * <p><B>Note:</B> Calling <code>absolute(1)</code> is the same * as calling <code>first()</code>. Calling <code>absolute(-1)</code> * is the same as calling <code>last()</code>. * <!-- end generic documentation --> * * @param row the number of the row to which the cursor should move. * A positive number indicates the row number counting from the * beginning of the result set; a negative number indicates the * row number counting from the end of the result set * @return <code>true</code> if the cursor is moved to a position in this * <code>ResultSet</code> object; * <code>false</code> if the cursor is before the first row or after the * last row * @exception SQLException if a database access error * occurs, this method is called on a closed result set * or the result set type is <code>TYPE_FORWARD_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean absolute(int row) throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } if (row > 0) { row--; } else if (row == 0) { return navigator.beforeFirst(); } return navigator.absolute(row); } /** * <!-- start generic documentation --> * Moves the cursor a relative number of rows, either positive or negative. * Attempting to move beyond the first/last row in the * result set positions the cursor before/after the * the first/last row. Calling <code>relative(0)</code> is valid, but does * not change the cursor position. * * <p>Note: Calling the method <code>relative(1)</code> * is identical to calling the method <code>next()</code> and * calling the method <code>relative(-1)</code> is identical * to calling the method <code>previous()</code>. * <!-- end generic documentation --> * * @param rows an <code>int</code> specifying the number of rows to * move from the current row; a positive number moves the cursor * forward; a negative number moves the cursor backward * @return <code>true</code> if the cursor is on a row; * <code>false</code> otherwise * @exception SQLException if a database access error occurs, this method * is called on a closed result set, * there is no current row, or the result set type is * <code>TYPE_FORWARD_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean relative(int rows) throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } return navigator.relative(rows); } /** * <!-- start generic documentation --> * Moves the cursor to the previous row in this * <code>ResultSet</code> object. * <p> * (JDBC4 clarification:) * When a call to the <code>previous</code> method returns <code>false</code>, * the cursor is positioned before the first row. Any invocation of a * <code>ResultSet</code> method which requires a current row will result in a * <code>SQLException</code> being thrown. * <p> * (JDBC4 clarification:) * If an input stream is open for the current row, a call to the method * <code>previous</code> will implicitly close it. A <code>ResultSet</code> * object's warning change is cleared when a new row is read. * <p> * <!-- end generic documentation --> * * @return (JDBC4 clarification:) <code>true</code> if the cursor is now positioned on a valid row; * <code>false</code> if the cursor is positioned before the first row * @exception SQLException if a database access error * occurs; this method is called on a closed result set * or the result set type is <code>TYPE_FORWARD_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean previous() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } return navigator.previous(); } //--------------------------------------------------------------------- // Properties //--------------------------------------------------------------------- /** * <!-- start generic documentation --> * Gives a hint as to the direction in which the rows in this * <code>ResultSet</code> object will be processed. * The initial value is determined by the * <code>Statement</code> object * that produced this <code>ResultSet</code> object. * The fetch direction may be changed at any time. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not need this hint. However, as mandated by the JDBC standard, * an SQLException is thrown if the result set type is TYPE_FORWARD_ONLY * and a fetch direction other than FETCH_FORWARD is requested. <p> * </div> * <!-- end release-specific documentation --> * * @param direction an <code>int</code> specifying the suggested * fetch direction; one of <code>ResultSet.FETCH_FORWARD</code>, * <code>ResultSet.FETCH_REVERSE</code>, or * <code>ResultSet.FETCH_UNKNOWN</code> * @exception SQLException if a database access error occurs; this * method is called on a closed result set or * the result set type is <code>TYPE_FORWARD_ONLY</code> and the fetch * direction is not <code>FETCH_FORWARD</code> * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) * @see JDBCStatement#setFetchDirection * @see #getFetchDirection */ public void setFetchDirection(int direction) throws SQLException { checkClosed(); switch (direction) { case FETCH_FORWARD : { break; } case FETCH_REVERSE : { checkNotForwardOnly(); break; } case FETCH_UNKNOWN : { checkNotForwardOnly(); break; } default : { throw Util.notSupported(); } } } /** * <!-- start generic documentation --> * Retrieves the fetch direction for this * <code>ResultSet</code> object. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not depend on fetch direction and always returns * <code>FETCH_FORWARD</code>, but the value has no real meaning. <p> * </div> * <!-- end release-specific documentation --> * * @return the current fetch direction for this <code>ResultSet</code> object * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) * @see #setFetchDirection */ public int getFetchDirection() throws SQLException { checkClosed(); return FETCH_FORWARD; } /** * <!-- start generic documentation --> * Gives the JDBC driver a hint as to the number of rows that should * be fetched from the database when more rows are needed for this * <code>ResultSet</code> object. * If the fetch size specified is zero, the JDBC driver * ignores the value and is free to make its own best guess as to what * the fetch size should be. The default value is set by the * <code>Statement</code> object * that created the result set. The fetch size may be changed at any time. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB may not build and return a result set as a * whole. Therefore the supplied, non-zero, fetch size value is used for * some ResultSet objects. * </div> * <!-- end release-specific documentation --> * * @param rows the number of rows to fetch * @exception SQLException if a database access error occurs; this method * (JDBC4 Clarification:) * is called on a closed result set or the * (JDBC4 clarification:) * condition <code>rows >= 0 </code> is not satisfied * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) * @see #getFetchSize * @see JDBCStatement#setFetchSize * @see JDBCStatement#getFetchSize */ public void setFetchSize(int rows) throws SQLException { if (rows < 0) { throw Util.outOfRangeArgument(); } } /** * <!-- start generic documentation --> * Retrieves the fetch size for this * <code>ResultSet</code> object. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB may not build and return a result set as a * whole. The acutal fetch size for this result set is returned. * </div> * <!-- end release-specific documentation --> * * @return the current fetch size for this <code>ResultSet</code> object * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) * @see #setFetchSize * @see JDBCStatement#getFetchSize * @see JDBCStatement#setFetchSize */ public int getFetchSize() throws SQLException { checkClosed(); return fetchSize; } /** * <!-- start generic documentation --> * Retrieves the type of this <code>ResultSet</code> object. * The type is determined by the <code>Statement</code> object * that created the result set. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB accurately * reports the actual runtime scrollability of this result set instance. * </div> * <!-- end release-specific documentation --> * * @return <code>ResultSet.TYPE_FORWARD_ONLY</code>, * <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>, * or <code>ResultSet.TYPE_SCROLL_SENSITIVE</code> * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public int getType() throws SQLException { checkClosed(); return rsScrollabilty; } /** * <!-- start generic documentation --> * Retrieves the concurrency mode of this <code>ResultSet</code> object. * The concurrency used is determined by the * <code>Statement</code> object that created the result set. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports updatable result sets and accurately reports the actual * runtime concurrency of this result set instance. * </div> * <!-- end release-specific documentation --> * * @return the concurrency type, either * <code>ResultSet.CONCUR_READ_ONLY</code> * or <code>ResultSet.CONCUR_UPDATABLE</code> * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public int getConcurrency() throws SQLException { checkClosed(); return rsConcurrency; } //--------------------------------------------------------------------- // Updates //--------------------------------------------------------------------- /** * <!-- start generic documentation --> * Retrieves whether the current row has been updated. The value returned * depends on whether or not the result set can detect updates. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports updatable result sets and accurately reports the actual * value. * </div> * <!-- end release-specific documentation --> * * @return <code>true</code> if the current row is detected to * have been visibly updated by the owner or another; <code>false</code> otherwise * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCDatabaseMetaData#updatesAreDetected * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean rowUpdated() throws SQLException { checkClosed(); return isRowUpdated; } /** * <!-- start generic documentation --> * Retrieves whether the current row has had an insertion. * The value returned depends on whether or not this * <code>ResultSet</code> object can detect visible inserts. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports updatable result sets and accurately reports the actual * value. * </div> * <!-- end release-specific documentation --> * * @return <code>true</code> if the current row is detected to * have been inserted; <code>false</code> otherwise * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCDatabaseMetaData#insertsAreDetected * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean rowInserted() throws SQLException { checkClosed(); return false; } /** * <!-- start generic documentation --> * Retrieves whether a row has been deleted. A deleted row may leave * a visible "hole" in a result set. This method can be used to * detect holes in a result set. The value returned depends on whether * or not this <code>ResultSet</code> object can detect deletions. * <p> * (JDBC4 Clarification:) <p> * <strong>Note:</strong> Support for the <code>rowDeleted</code> method is optional with a result set * concurrency of <code>CONCUR_READ_ONLY</code> * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports updatable result sets and accurately reports the actual * value. * </div> * <!-- end release-specific documentation --> * @return <code>true</code> if the current row is detected to * have been deleted by the owner or another; <code>false</code> otherwise * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCDatabaseMetaData#deletesAreDetected * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean rowDeleted() throws SQLException { checkClosed(); return false; } /** * <!-- start generic documentation --> * (JDBC4 clarification:) * Updates the designated column with a <code>null</code> value. * * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> * or <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateNull(int columnIndex) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, null); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>boolean</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBoolean(int columnIndex, boolean x) throws SQLException { Boolean value = x ? Boolean.TRUE : Boolean.FALSE; startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, value); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>byte</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateByte(int columnIndex, byte x) throws SQLException { startUpdate(columnIndex); preparedStatement.setIntParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>short</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateShort(int columnIndex, short x) throws SQLException { startUpdate(columnIndex); preparedStatement.setIntParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with an <code>int</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateInt(int columnIndex, int x) throws SQLException { startUpdate(columnIndex); preparedStatement.setIntParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>long</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateLong(int columnIndex, long x) throws SQLException { startUpdate(columnIndex); preparedStatement.setLongParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>float</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateFloat(int columnIndex, float x) throws SQLException { Double value = new Double(x); startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, value); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>double</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateDouble(int columnIndex, double x) throws SQLException { Double value = new Double(x); startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, value); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.math.BigDecimal</code> * value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>String</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateString(int columnIndex, String x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>byte</code> array value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBytes(int columnIndex, byte[] x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Date</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateDate(int columnIndex, Date x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Time</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateTime(int columnIndex, Time x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Timestamp</code> * value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * <!-- start generic documentation --> * (JDBC4 clarification:) * Updates the designated column with an ascii stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException { startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x, length); } /** * <!-- start generic documentation --> * (JDBC4 clarification:) * Updates the designated column with a binary stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBinaryStream(int columnIndex, java.io.InputStream x, int length) throws SQLException { startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x, length); } /** * <!-- start generic documentation --> * (JDBC4 clarification:) * Updates the designated column with a character stream value, which will have * the specified number of (CHECKME: characters?) bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, x, length); } /** * <!-- start generic documentation --> * Updates the designated column with an <code>Object</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <p> * (JDBC clarification:) * If the second argument is an <code>InputStream</code> then the stream must contain * the number of bytes specified by scaleOrLength. If the second argument is a * <code>Reader</code> then the reader must contain the number of characters specified * by scaleOrLength. If these conditions are not true the driver will generate a * <code>SQLException</code> when the statement is executed. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param scaleOrLength for an object of <code>java.math.BigDecimal</code> , * this is the number of digits after the decimal point. For * Java Object types <code>InputStream</code> and <code>Reader</code>, * this is the length * of the data in the stream or reader. For all other types, * this value will be ignored. * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException { startUpdate(columnIndex); preparedStatement.setObject(columnIndex, x, 0, scaleOrLength); } /** * <!-- start generic documentation --> * Updates the designated column with an <code>Object</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateObject(int columnIndex, Object x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>null</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateNull(String columnLabel) throws SQLException { updateNull(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>boolean</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBoolean(String columnLabel, boolean x) throws SQLException { updateBoolean(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>byte</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateByte(String columnLabel, byte x) throws SQLException { updateByte(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>short</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateShort(String columnLabel, short x) throws SQLException { updateShort(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with an <code>int</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateInt(String columnLabel, int x) throws SQLException { updateInt(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>long</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateLong(String columnLabel, long x) throws SQLException { updateLong(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>float </code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateFloat(String columnLabel, float x) throws SQLException { updateFloat(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>double</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateDouble(String columnLabel, double x) throws SQLException { updateDouble(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.BigDecimal</code> * value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException { updateBigDecimal(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>String</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateString(String columnLabel, String x) throws SQLException { updateString(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a byte array value. * * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> * or <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBytes(String columnLabel, byte[] x) throws SQLException { updateBytes(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Date</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateDate(String columnLabel, Date x) throws SQLException { updateDate(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Time</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateTime(String columnLabel, Time x) throws SQLException { updateTime(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Timestamp</code> * value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException { updateTimestamp(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * (JDBC4 clarification:) * Updates the designated column with an ascii stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateAsciiStream(String columnLabel, java.io.InputStream x, int length) throws SQLException { updateAsciiStream(findColumn(columnLabel), x, length); } /** * <!-- start generic documentation --> * (JDBC4 clarification:) * Updates the designated column with a binary stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBinaryStream(String columnLabel, java.io.InputStream x, int length) throws SQLException { updateBinaryStream(findColumn(columnLabel), x, length); } /** * <!-- start generic documentation --> * (JDBC4 clarification) * Updates the designated column with a character stream value, which will have * the specified number of (CHECKME: characters?) bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader the <code>java.io.Reader</code> object containing * the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateCharacterStream(String columnLabel, java.io.Reader reader, int length) throws SQLException { updateCharacterStream(findColumn(columnLabel), reader, length); } /** * <!-- start generic documentation --> * Updates the designated column with an <code>Object</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <p> * (JDBC4 Clarification:) * If the second argument is an <code>InputStream</code> then the stream must contain * the number of bytes specified by scaleOrLength. If the second argument is a * <code>Reader</code> then the reader must contain the number of characters specified * by scaleOrLength. If these conditions are not true the driver will generate a * <code>SQLException</code> when the statement is executed. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @param scaleOrLength for an object of <code>java.math.BigDecimal</code> , * this is the number of digits after the decimal point. For * Java Object types <code>InputStream</code> and <code>Reader</code>, * this is the length * of the data in the stream or reader. For all other types, * this value will be ignored. * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException { updateObject(findColumn(columnLabel), x, scaleOrLength); } /** * <!-- start generic documentation --> * Updates the designated column with an <code>Object</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateObject(String columnLabel, Object x) throws SQLException { updateObject(findColumn(columnLabel), x); } /** * <!-- start generic documentation --> * Inserts the contents of the insert row into this * <code>ResultSet</code> object and into the database. * The cursor must be on the insert row when this method is called. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code>, * this method is called on a closed result set, * if this method is called when the cursor is not on the insert row, * or if not all of non-nullable columns in * the insert row have been given a non-null value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void insertRow() throws SQLException { performInsert(); } /** * <!-- start generic documentation --> * Updates the underlying database with the new contents of the * current row of this <code>ResultSet</code> object. * This method cannot be called when the cursor is on the insert row. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * * After updating any values in the current row, it is not possible to * move the cursor position without calling this method, or alternatively * calling cancelRowUpdates() to abandon the row update. * </div> * <!-- end release-specific documentation --> * * @exception SQLException if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code>; * this method is called on a closed result set or * if this method is called when the cursor is on the insert row * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateRow() throws SQLException { performUpdate(); } /** * <!-- start generic documentation --> * Deletes the current row from this <code>ResultSet</code> object * and from the underlying database. This method cannot be called when * the cursor is on the insert row. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * * After a successful call to this method, the row is deleted. * </div> * <!-- end release-specific documentation --> * * @exception SQLException if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code>; * this method is called on a closed result set * or if this method is called when the cursor is on the insert row * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void deleteRow() throws SQLException { performDelete(); } /** @todo - fredt - implement */ /** * <!-- start generic documentation --> * Refreshes the current row with its most recent value in * the database. This method cannot be called when * the cursor is on the insert row. * * <P>The <code>refreshRow</code> method provides a way for an * application to * explicitly tell the JDBC driver to refetch a row(s) from the * database. An application may want to call <code>refreshRow</code> when * caching or prefetching is being done by the JDBC driver to * fetch the latest value of a row from the database. The JDBC driver * may actually refresh multiple rows at once if the fetch size is * greater than one. * * <P> All values are refetched subject to the transaction isolation * level and cursor sensitivity. If <code>refreshRow</code> is called after * calling an updater method, but before calling * the method <code>updateRow</code>, then the * updates made to the row are lost. Calling the method * <code>refreshRow</code> frequently will likely slow performance. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @exception SQLException if a database access error * occurs; this method is called on a closed result set; * the result set type is <code>TYPE_FORWARD_ONLY</code> or if this * method is called when the cursor is on the insert row * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method or this method is not supported for the specified result * set type and result set concurrency. * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void refreshRow() throws SQLException { clearUpdates(); } /** * <!-- start generic documentation --> * Cancels the updates made to the current row in this * <code>ResultSet</code> object. * This method may be called after calling an * updater method(s) and before calling * the method <code>updateRow</code> to roll back * the updates made to a row. If no updates have been made or * <code>updateRow</code> has already been called, this method has no * effect. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @exception SQLException if a database access error * occurs; this method is called on a closed result set; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or if this method is called when the cursor is * on the insert row * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void cancelRowUpdates() throws SQLException { clearUpdates(); } /** * <!-- start generic documentation --> * Moves the cursor to the insert row. The current cursor position is * remembered while the cursor is positioned on the insert row. * * The insert row is a special row associated with an updatable * result set. It is essentially a buffer where a new row may * be constructed by calling the updater methods prior to * inserting the row into the result set. * * Only the updater, getter, * and <code>insertRow</code> methods may be * called when the cursor is on the insert row. All of the columns in * a result set must be given a value each time this method is * called before calling <code>insertRow</code>. * An updater method must be called before a * getter method can be called on a column value. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * * @exception SQLException if a database access error occurs; this * method is called on a closed result set * or the result set concurrency is <code>CONCUR_READ_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void moveToInsertRow() throws SQLException { startInsert(); } /** * <!-- start generic documentation --> * Moves the cursor to the remembered cursor position, usually the * current row. This method has no effect if the cursor is not on * the insert row. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. <p> * </div> * <!-- end release-specific documentation --> * @exception SQLException if a database access error occurs, this * method is called on a closed result set * or the result set concurrency is <code>CONCUR_READ_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void moveToCurrentRow() throws SQLException { endInsert(); } /** * <!-- start generic documentation --> * Retrieves the <code>Statement</code> object that produced this * <code>ResultSet</code> object. * If the result set was generated some other way, such as by a * <code>DatabaseMetaData</code> method, this method may return * <code>null</code>. * <!-- end generic documentation --> * * @return the <code>Statment</code> object that produced * this <code>ResultSet</code> object or <code>null</code> * if the result set was produced some other way * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Statement getStatement() throws SQLException { checkClosed(); return (Statement) statement; } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as an <code>Object</code> * in the Java programming language. * If the value is an SQL <code>NULL</code>, * the driver returns a Java <code>null</code>. * This method uses the given <code>Map</code> object * for the custom mapping of the * SQL structured or distinct type that is being retrieved. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature, but ignores the map. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param map a <code>java.util.Map</code> object that contains the mapping * from SQL type names to classes in the Java programming language * @return an <code>Object</code> in the Java programming language * representing the SQL value * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Object getObject(int columnIndex, Map map) throws SQLException { return getObject(columnIndex); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>Ref</code> object * in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support this feature; this method always * throws an <code>SQLException</code> stating that the operation is not * supported. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return a <code>Ref</code> object representing an SQL <code>REF</code> * value * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Ref getRef(int columnIndex) throws SQLException { throw Util.notSupported(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>Blob</code> object * in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB 1.9.0 supports this feature for objects of type BLOB and BINARY. * The Blob returned for BINARY objects is a memory object. The Blob * return for BLOB objects is not held entirely in memory. Its contents are * fetched from the database when its getXXX() methods are called. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return a <code>Blob</code> object representing the SQL * <code>BLOB</code> value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Blob getBlob(int columnIndex) throws SQLException { Object o = getObject(columnIndex); if (o == null) { return null; } if (o instanceof BlobDataID) { return new JDBCBlobClient(session, (BlobDataID) o); } else if (o instanceof Blob) { return (Blob) o; } else if (o instanceof BinaryData) { byte[] b = getBytes(columnIndex); return new JDBCBlob(b); } throw Util.sqlException(ErrorCode.X_42561); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>Clob</code> object * in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB 1.9.0 supports this feature for objects of type CLOB and * the variations of CHAR. * The Clob returned for CHAR objects is a memory object. The Clob * return for CLOB objects is not held entirely in memory. Its contents are * fetched from the database when its getXXX() methods are called. <p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return a <code>Clob</code> object representing the SQL * <code>CLOB</code> value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Clob getClob(int columnIndex) throws SQLException { Object o = getObject(columnIndex); if (o == null) { return null; } if (o instanceof ClobDataID) { return new JDBCClobClient(session, (ClobDataID) o); } else if (o instanceof Clob) { return (Clob) o; } else if (o instanceof String) { return new JDBCClob((String) o); } throw Util.sqlException(ErrorCode.X_42561); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as an <code>Array</code> object * in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support array types; this method always * throws an <code>SQLException</code> stating that the operation is not * supported. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @return an <code>Array</code> object representing the SQL * <code>ARRAY</code> value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Array getArray(int columnIndex) throws SQLException { throw Util.notSupported(); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as an <code>Object</code> * in the Java programming language. * If the value is an SQL <code>NULL</code>, * the driver returns a Java <code>null</code>. * This method uses the specified <code>Map</code> object for * custom mapping if appropriate. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB supports this feature. But the Map parameter is ignored.<p> * * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param map a <code>java.util.Map</code> object that contains the mapping * from SQL type names to classes in the Java programming language * @return an <code>Object</code> representing the SQL value in the * specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Object getObject(String columnLabel, Map map) throws SQLException { return getObject(findColumn(columnLabel), map); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>Ref</code> object * in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * Including 1.9.0, HSQLDB does not support reference types; this method * always throws an <code>SQLException</code> stating that the operation * is not supported. * </div> * <!-- end release-specific documentation --> * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a <code>Ref</code> object representing the SQL <code>REF</code> * value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Ref getRef(String columnLabel) throws SQLException { return getRef(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>Blob</code> object * in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB 1.9.0 supports this feature for objects of type BLOB and BINARY. * The Blob returned for BINARY objects is a memory object. The Blob * return for BLOB objects is not held entirely in memory. Its contents are * fetched from the database when its getXXX() methods are called. <p> * * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a <code>Blob</code> object representing the SQL <code>BLOB</code> * value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Blob getBlob(String columnLabel) throws SQLException { return getBlob(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>Clob</code> object * in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB 1.9.0 supports this feature for objects of type CLOB and * the variations of CHAR. * The Clob returned for CHAR objects is a memory object. The Clob * return for CLOB objects is not held entirely in memory. Its contents are * fetched from the database when its getXXX() methods are called. <p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a <code>Clob</code> object representing the SQL <code>CLOB</code> * value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Clob getClob(String columnLabel) throws SQLException { return getClob(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as an <code>Array</code> object * in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * Including 1.9.0, HSQLDB does not support array types; this method always * throws an <code>SQLException</code> stating that the operation is not * supported. * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return an <code>Array</code> object representing the SQL <code>ARRAY</code> value in * the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Array getArray(String columnLabel) throws SQLException { return getArray(findColumn(columnLabel)); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>java.sql.Date</code> object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the date if the underlying database does not store * timezone information. * <!-- end generic documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param cal the <code>java.util.Calendar</code> object * to use in constructing the date * @return the column value as a <code>java.sql.Date</code> object; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Date getDate(int columnIndex, Calendar cal) throws SQLException { TimestampData t = (TimestampData) getColumnInType(columnIndex, Type.SQL_DATE); long millis = t.getSeconds() * 1000; int zoneOffset = HsqlDateTime.getZoneMillis(cal, millis); return new Date(millis - zoneOffset); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>java.sql.Date</code> object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the date if the underlying database does not store * timezone information. * <!-- end generic documentation --> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param cal the <code>java.util.Calendar</code> object * to use in constructing the date * @return the column value as a <code>java.sql.Date</code> object; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Date getDate(String columnLabel, Calendar cal) throws SQLException { return getDate(findColumn(columnLabel), cal); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>java.sql.Time</code> * object in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the time if the underlying database does not store * timezone information. * <!-- end generic documentation --> * <h3>HSQLDB-Specific Information:</h3> <p> * * The JDBC specification for this method is vague. HSQLDB interprets the * specification as follows: * * <ol> * <li>If the SQL type of the column is WITH TIME ZONE, then the UTC value * of the returned java.sql.Time object is the UTC of the SQL value without * modification. In other words, the Calendar object is not used.</li> * <li>If the SQL type of the column is WITHOUT TIME ZONE, then the UTC * value of the returned java.sql.Time is correct for the given Calendar * object.</li> * <li>If the cal argument is null, it it ignored and the method returns * the same Object as the method without the Calendar parameter.</li> * </ol> * </div> * * @param columnIndex the first column is 1, the second is 2, ... * @param cal the <code>java.util.Calendar</code> object * to use in constructing the time * @return the column value as a <code>java.sql.Time</code> object; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Time getTime(int columnIndex, Calendar cal) throws SQLException { TimeData t = (TimeData) getColumnInType(columnIndex, Type.SQL_TIME); if (t == null) { return null; } long millis = t.getSeconds() * 1000; if (resultMetaData.columnTypes[--columnIndex] .isDateTimeTypeWithZone()) {} else { // UTC - calZO == (UTC - sessZO) + (sessionZO - calZO) if (cal != null) { int zoneOffset = HsqlDateTime.getZoneMillis(cal, millis); millis += session.getZoneSeconds() * 1000 - zoneOffset; } } return new Time(millis); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>java.sql.Time</code> object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the time if the underlying database does not store * timezone information. * <!-- end generic documentation --> * <h3>HSQLDB-Specific Information:</h3> <p> * * The JDBC specification for this method is vague. HSQLDB interprets the * specification as follows: * * <ol> * <li>If the SQL type of the column is WITH TIME ZONE, then the UTC value * of the returned java.sql.Time object is the UTC of the SQL value without * modification. In other words, the Calendar object is not used.</li> * <li>If the SQL type of the column is WITHOUT TIME ZONE, then the UTC * value of the returned java.sql.Time is correct for the given Calendar * object.</li> * <li>If the cal argument is null, it it ignored and the method returns * the same Object as the method without the Calendar parameter.</li> * </ol> * </div> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param cal the <code>java.util.Calendar</code> object * to use in constructing the time * @return the column value as a <code>java.sql.Time</code> object; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Time getTime(String columnLabel, Calendar cal) throws SQLException { return getTime(findColumn(columnLabel), cal); } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>java.sql.Timestamp</code> object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the timestamp if the underlying database does not store * timezone information. * <!-- end generic documentation --> * <h3>HSQLDB-Specific Information:</h3> <p> * * The JDBC specification for this method is vague. HSQLDB interprets the * specification as follows: * * <ol> * <li>If the SQL type of the column is WITH TIME ZONE, then the UTC value * of the returned java.sql.Timestamp object is the UTC of the SQL value * without modification. In other words, the Calendar object is not used. * </li> * <li>If the SQL type of the column is WITHOUT TIME ZONE, then the UTC * value of the returned java.sql.Timestamp is correct for the given * Calendar object.</li> * <li>If the cal argument is null, it it ignored and the method returns * the same Object as the method without the Calendar parameter.</li> * </ol> * </div> * * @param columnIndex the first column is 1, the second is 2, ... * @param cal the <code>java.util.Calendar</code> object * to use in constructing the timestamp * @return the column value as a <code>java.sql.Timestamp</code> object; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { TimestampData t = (TimestampData) getColumnInType(columnIndex, Type.SQL_TIMESTAMP); if (t == null) { return null; } long millis = t.getSeconds() * 1000; if (resultMetaData.columnTypes[--columnIndex] .isDateTimeTypeWithZone()) {} else { // UTC - calZO == (UTC - sessZO) + (sessionZO - calZO) if (cal != null) { int zoneOffset = HsqlDateTime.getZoneMillis(cal, millis); millis += session.getZoneSeconds() * 1000 - zoneOffset; } } Timestamp ts = new Timestamp(millis); ts.setNanos(t.getNanos()); return ts; } /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>java.sql.Timestamp</code> object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the timestamp if the underlying database does not store * timezone information. * <!-- end generic documentation --> * <h3>HSQLDB-Specific Information:</h3> <p> * * The JDBC specification for this method is vague. HSQLDB interprets the * specification as follows: * * <ol> * <li>If the SQL type of the column is WITH TIME ZONE, then the UTC value * of the returned java.sql.Timestamp object is the UTC of the SQL value * without modification. In other words, the Calendar object is not used. * </li> * <li>If the SQL type of the column is WITHOUT TIME ZONE, then the UTC * value of the returned java.sql.Timestamp is correct for the given * Calendar object.</li> * <li>If the cal argument is null, it it ignored and the method returns * the same Object as the method without the Calendar parameter.</li> * </ol> * </div> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param cal the <code>java.util.Calendar</code> object * to use in constructing the date * @return the column value as a <code>java.sql.Timestamp</code> object; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException { return getTimestamp(findColumn(columnLabel), cal); } //-------------------------- JDBC 3.0 ---------------------------------------- /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>java.net.URL</code> * object in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support the datalink type; this method * always throws an <code>SQLException</code> stating that the operation is * not supported. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the index of the column 1 is the first, 2 is the second,... * @return the column value as a <code>java.net.URL</code> object; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs; this method * is called on a closed result set or if a URL is malformed * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public java.net.URL getURL(int columnIndex) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * <!-- start generic documentation --> * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>java.net.URL</code> * object in the Java programming language. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support the datalink type; this method * always throws an <code>SQLException</code> stating that the operation is * not supported. * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return the column value as a <code>java.net.URL</code> object; * if the value is SQL <code>NULL</code>, * the value returned is <code>null</code> in the Java programming language * @exception SQLException if a database access error occur; this method * is called on a closed result set or if a URL is malformed * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public java.net.URL getURL(String columnLabel) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Ref</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support reference types; this method * always throws an <code>SQLException</code> stating that the operation is * not supported. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateRef(int columnIndex, java.sql.Ref x) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Ref</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support reference types; this method * always throws an <code>SQLException</code> stating that the operation is * not supported. * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateRef(String columnLabel, java.sql.Ref x) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Blob</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB 1.9.0 supports this feature for columns of type BLOB. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateBlob(int columnIndex, java.sql.Blob x) throws SQLException { if (x instanceof JDBCBlobClient) { throw Util.sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "invalid Blob"); } startUpdate(columnIndex); preparedStatement.setBlobParameter(columnIndex, x); } //#endif JAVA4 /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Blob</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB 1.9.0 supports this feature for columns of type BLOB. * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateBlob(String columnLabel, java.sql.Blob x) throws SQLException { int columnIndex = findColumn(columnLabel); updateBlob(columnIndex, x); } //#endif JAVA4 /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Clob</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB 1.9.0 supports this feature for columns of type CLOB.<p> * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateClob(int columnIndex, java.sql.Clob x) throws SQLException { if (x instanceof JDBCClobClient) { throw Util.sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "invalid Clob"); } startUpdate(columnIndex); preparedStatement.setClobParameter(columnIndex, x); } //#endif JAVA4 /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Clob</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB 1.9.0 supports this feature for columns of type CLOB.<p> * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateClob(String columnLabel, java.sql.Clob x) throws SQLException { int columnIndex = findColumn(columnLabel); updateClob(columnIndex, x); } //#endif JAVA4 /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Array</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support array types; this method always * throws an <code>SQLException</code> stating that the operation is not * supported. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateArray(int columnIndex, java.sql.Array x) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * <!-- start generic documentation --> * Updates the designated column with a <code>java.sql.Array</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support array types; this method always * throws an <code>SQLException</code> stating that the operation is not * supported. * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateArray(String columnLabel, java.sql.Array x) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 //------------------------- JDBC 4.0 ----------------------------------- /** * Retrieves the value of the designated column in the current row of this * <code>ResultSet</code> object as a <code>java.sql.RowId</code> object in the Java * programming language. * * @param columnIndex the first column is 1, the second 2, ... * @return the column value; if the value is a SQL <code>NULL</code> the * value returned is <code>null</code> * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public RowId getRowId(int columnIndex) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row of this * <code>ResultSet</code> object as a <code>java.sql.RowId</code> object in the Java * programming language. * * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support the RowId type; this method always * throws an <code>SQLException</code> stating that the operation is not * supported. * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return the column value ; if the value is a SQL <code>NULL</code> the * value returned is <code>null</code> * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public RowId getRowId(String columnLabel) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Updates the designated column with a <code>RowId</code> value. The updater * methods are used to update column values in the current row or the insert * row. The updater methods do not update the underlying database; instead * the <code>updateRow</code> or <code>insertRow</code> methods are called * to update the database. * * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support the RowId type; this method always * throws an <code>SQLException</code> stating that the operation is not * supported. * </div> * <!-- end release-specific documentation --> * * @param columnIndex the first column is 1, the second 2, ... * @param x the column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateRowId(int columnIndex, RowId x) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Updates the designated column with a <code>RowId</code> value. The updater * methods are used to update column values in the current row or the insert * row. The updater methods do not update the underlying database; instead * the <code>updateRow</code> or <code>insertRow</code> methods are called * to update the database. * * <!-- end generic documentation --> * * <!-- start release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * HSQLDB does not support the RowId type; this method always * throws an <code>SQLException</code> stating that the operation is not * supported. * </div> * <!-- end release-specific documentation --> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the column value * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateRowId(String columnLabel, RowId x) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Retrieves the holdability of this <code>ResultSet</code> object * @return either <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code> or <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code> * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.6, HSQLDB 1.9.0 */ public int getHoldability() throws SQLException { checkClosed(); return rsHoldability; } /** * Retrieves whether this <code>ResultSet</code> object has been closed. * A <code>ResultSet</code> is closed if the * method close has been called on it, or if it is automatically closed. * * @return true if this <code>ResultSet</code> object is closed; false if it is still open * @throws SQLException if a database access error occurs * @since JDK 1.6, HSQLDB 1.9.0 */ public boolean isClosed() throws SQLException { return navigator == null; } /** * Updates the designated column with a <code>String</code> value. * It is intended for use when updating <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second 2, ... * @param nString the value for the column to be updated * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or if a database access error occurs * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateNString(int columnIndex, String nString) throws SQLException { updateString(columnIndex, nString); } //#endif JAVA6 /** * Updates the designated column with a <code>String</code> value. * It is intended for use when updating <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param nString the value for the column to be updated * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set; * the result set concurrency is <CODE>CONCUR_READ_ONLY</code> * or if a database access error occurs * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateNString(String columnLabel, String nString) throws SQLException { updateString(columnLabel, nString); } //#endif JAVA6 /** * Updates the designated column with a <code>java.sql.NClob</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second 2, ... * @param nClob the value for the column to be updated * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set, * if a database access error occurs or * the result set concurrency is <code>CONCUR_READ_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateNClob(int columnIndex, NClob nClob) throws SQLException { updateClob(columnIndex, nClob); } //#endif JAVA6 /** * Updates the designated column with a <code>java.sql.NClob</code> value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param nClob the value for the column to be updated * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set; * if a database access error occurs or * the result set concurrency is <code>CONCUR_READ_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateNClob(String columnLabel, NClob nClob) throws SQLException { updateClob(columnLabel, nClob); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>NClob</code> object * in the Java programming language. * * @param columnIndex the first column is 1, the second is 2, ... * @return a <code>NClob</code> object representing the SQL * <code>NCLOB</code> value in the specified column * @exception SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set * or if a database access error occurs * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public NClob getNClob(int columnIndex) throws SQLException { String s = getString(columnIndex); return s == null ? null : new JDBCNClob(s); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a <code>NClob</code> object * in the Java programming language. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return a <code>NClob</code> object representing the SQL <code>NCLOB</code> * value in the specified column * @exception SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set * or if a database access error occurs * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public NClob getNClob(String columnLabel) throws SQLException { return getNClob(findColumn(columnLabel)); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row of * this <code>ResultSet</code> as a * <code>java.sql.SQLXML</code> object in the Java programming language. * * @param columnIndex the first column is 1, the second is 2, ... * @return a <code>SQLXML</code> object that maps an <code>SQL XML</code> value * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public SQLXML getSQLXML(int columnIndex) throws SQLException { checkColumn(columnIndex); SQLXML sqlxml; int type = resultMetaData.columnTypes[columnIndex - 1].typeCode; switch (type) { case Types.SQL_XML : { Object object = getObject(columnIndex); if (object == null) { sqlxml = null; } else if (object instanceof SQLXML) { sqlxml = (SQLXML) object; } else { throw Util.notSupported(); } break; } case Types.SQL_CLOB : { Clob clob = getClob(columnIndex); if (clob == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(clob.getCharacterStream()); } break; } case Types.SQL_CHAR : case Types.SQL_VARCHAR : case Types.VARCHAR_IGNORECASE : { java.io.Reader reader = getCharacterStream(columnIndex); if (reader == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(reader); } break; } case Types.SQL_NCHAR : case Types.SQL_NVARCHAR : { java.io.Reader nreader = getNCharacterStream(columnIndex); if (nreader == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(nreader); } break; } case Types.SQL_BLOB : { Blob blob = getBlob(columnIndex); if (blob == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(blob.getBinaryStream()); } break; } case Types.SQL_BINARY : case Types.SQL_VARBINARY : { java.io.InputStream inputStream = getBinaryStream(columnIndex); if (inputStream == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(inputStream); } break; } case Types.OTHER : case Types.JAVA_OBJECT : { Object data = getObject(columnIndex); if (data == null) { sqlxml = null; } else if (data instanceof SQLXML) { sqlxml = (SQLXML) data; } else if (data instanceof String) { sqlxml = new JDBCSQLXML((String) data); } else if (data instanceof byte[]) { sqlxml = new JDBCSQLXML((byte[]) data); } else if (data instanceof Blob) { Blob blob = (Blob) data; sqlxml = new JDBCSQLXML(blob.getBinaryStream()); } else if (data instanceof Clob) { Clob clob = (Clob) data; sqlxml = new JDBCSQLXML(clob.getCharacterStream()); } else { throw Util.notSupported(); } break; } default : { throw Util.notSupported(); } } return sqlxml; } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row of * this <code>ResultSet</code> as a * <code>java.sql.SQLXML</code> object in the Java programming language. * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return a <code>SQLXML</code> object that maps an <code>SQL XML</code> value * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public SQLXML getSQLXML(String columnLabel) throws SQLException { return getSQLXML(findColumn(columnLabel)); } //#endif JAVA6 /** * Updates the designated column with a <code>java.sql.SQLXML</code> value. * The updater * methods are used to update column values in the current row or the insert * row. The updater methods do not update the underlying database; instead * the <code>updateRow</code> or <code>insertRow</code> methods are called * to update the database. * <p> * * @param columnIndex the first column is 1, the second 2, ... * @param xmlObject the value for the column to be updated * @throws SQLException if a database access error occurs, this method * is called on a closed result set, * the <code>java.xml.transform.Result</code>, * <code>Writer</code> or <code>OutputStream</code> has not been closed * for the <code>SQLXML</code> object, * if there is an error processing the XML value or * the result set concurrency is <code>CONCUR_READ_ONLY</code>. The <code>getCause</code> method * of the exception may provide a more detailed exception, for example, if the * stream does not contain valid XML. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException { startUpdate(columnIndex); preparedStatement.setSQLXML(columnIndex, xmlObject); } //#endif JAVA6 /** * Updates the designated column with a <code>java.sql.SQLXML</code> value. * The updater * methods are used to update column values in the current row or the insert * row. The updater methods do not update the underlying database; instead * the <code>updateRow</code> or <code>insertRow</code> methods are called * to update the database. * <p> * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param xmlObject the column value * @throws SQLException if a database access error occurs, this method * is called on a closed result set, * the <code>java.xml.transform.Result</code>, * <code>Writer</code> or <code>OutputStream</code> has not been closed * for the <code>SQLXML</code> object, * if there is an error processing the XML value or * the result set concurrency is <code>CONCUR_READ_ONLY</code>. The <code>getCause</code> method * of the exception may provide a more detailed exception, for example, if the * stream does not contain valid XML. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException { updateSQLXML(findColumn(columnLabel), xmlObject); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>String</code> in the Java programming language. * It is intended for use when * accessing <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public String getNString(int columnIndex) throws SQLException { return getString(columnIndex); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as * a <code>String</code> in the Java programming language. * It is intended for use when * accessing <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return the column value; if the value is SQL <code>NULL</code>, the * value returned is <code>null</code> * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public String getNString(String columnLabel) throws SQLException { return getString(findColumn(columnLabel)); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a * <code>java.io.Reader</code> object. * It is intended for use when * accessing <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * * @return a <code>java.io.Reader</code> object that contains the column * value; if the value is SQL <code>NULL</code>, the value returned is * <code>null</code> in the Java programming language. * @param columnIndex the first column is 1, the second is 2, ... * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public java.io.Reader getNCharacterStream( int columnIndex) throws SQLException { return getCharacterStream(columnIndex); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this <code>ResultSet</code> object as a * <code>java.io.Reader</code> object. * It is intended for use when * accessing <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return a <code>java.io.Reader</code> object that contains the column * value; if the value is SQL <code>NULL</code>, the value returned is * <code>null</code> in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public java.io.Reader getNCharacterStream( String columnLabel) throws SQLException { return getCharacterStream(findColumn(columnLabel)); } //#endif JAVA6 /** * Updates the designated column with a character stream value, which will have * the specified number of bytes. The * driver does the necessary conversion from Java character format to * the national character set in the database. * It is intended for use when * updating <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 * @revised JDK 1.6 b87 - length parameter changed from int to long */ //#ifdef JAVA6 public void updateNCharacterStream(int columnIndex, java.io.Reader x, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a character stream value, which will have * the specified number of bytes. The * driver does the necessary conversion from Java character format to * the national character set in the database. * It is intended for use when * updating <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param reader the <code>java.io.Reader</code> object containing * the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 * @revised JDK 1.6 b87 - length parameter changed from int to long */ //#ifdef JAVA6 public void updateNCharacterStream(String columnLabel, java.io.Reader reader, long length) throws SQLException { updateCharacterStream(columnLabel, reader, length); } //#endif JAVA6 // --------------------------- Added: Mustang Build 86 ------------------------- /** * Updates the designated column with an ascii stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateAsciiStream(int columnIndex, java.io.InputStream x, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a binary stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateBinaryStream(int columnIndex, java.io.InputStream x, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a character stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateCharacterStream(int columnIndex, java.io.Reader x, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with an ascii stream value, which will have * the specified number of bytes.. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateAsciiStream(String columnLabel, java.io.InputStream x, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a binary stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateBinaryStream(String columnLabel, java.io.InputStream x, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a character stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param reader the <code>java.io.Reader</code> object containing * the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateCharacterStream(String columnLabel, java.io.Reader reader, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column using the given input stream, which * will have the specified number of bytes. * When a very large ASCII value is input to a <code>LONGVARCHAR</code> * parameter, it may be more practical to send it via a * <code>java.io.InputStream</code>. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * * <P><B>Note:</B> This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param inputStream An object that contains the data to set the parameter * value to. * @param length the number of bytes in the parameter data. * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setBlob(columnIndex, inputStream, length); } //#endif JAVA6 /** * Updates the designated column using the given input stream, which * will have the specified number of bytes. * When a very large ASCII value is input to a <code>LONGVARCHAR</code> * parameter, it may be more practical to send it via a * <code>java.io.InputStream</code>. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * * <P><B>Note:</B> This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param inputStream An object that contains the data to set the parameter * value to. * @param length the number of bytes in the parameter data. * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setBlob(columnIndex, inputStream, length); } //#endif JAVA6 /** * Updates the designated column using the given <code>Reader</code> * object, which is the given number of characters long. * When a very large UNICODE value is input to a <code>LONGVARCHAR</code> * parameter, it may be more practical to send it via a * <code>java.io.Reader</code> object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * * <P><B>Note:</B> This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateClob(int columnIndex, Reader reader, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column using the given <code>Reader</code> * object, which is the given number of characters long. * When a very large UNICODE value is input to a <code>LONGVARCHAR</code> * parameter, it may be more practical to send it via a * <code>java.io.Reader</code> object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * * <P><B>Note:</B> This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @exception SQLException if a database access error occurs, * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateClob(String columnLabel, Reader reader, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column using the given <code>Reader</code> * object, which is the given number of characters long. * When a very large UNICODE value is input to a <code>LONGVARCHAR</code> * parameter, it may be more practical to send it via a * <code>java.io.Reader</code> object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * * <P><B>Note:</B> This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnIndex the first column is 1, the second 2, ... * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set, * if a database access error occurs or * the result set concurrency is <code>CONCUR_READ_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column using the given <code>Reader</code> * object, which is the given number of characters long. * When a very large UNICODE value is input to a <code>LONGVARCHAR</code> * parameter, it may be more practical to send it via a * <code>java.io.Reader</code> object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * * <P><B>Note:</B> This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set; * if a database access error occurs or * the result set concurrency is <code>CONCUR_READ_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column with a character stream value. * The data will be read from the stream * as needed until end-of-stream is reached. The * driver does the necessary conversion from Java character format to * the national character set in the database. * It is intended for use when * updating <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateNCharacterStream</code> which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param reader the new column value * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateNCharacterStream( int columnIndex, java.io.Reader reader) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, reader); } /** * Updates the designated column with a character stream value. * The data will be read from the stream * as needed until end-of-stream is reached. The * driver does the necessary conversion from Java character format to * the national character set in the database. * It is intended for use when * updating <code>NCHAR</code>,<code>NVARCHAR</code> * and <code>LONGNVARCHAR</code> columns. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateNCharacterStream</code> which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader the <code>java.io.Reader</code> object containing * the new column value * @exception SQLException if the columnLabel is not valid; * if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateNCharacterStream( String columnLabel, java.io.Reader reader) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, reader); } /** * Updates the designated column with an ascii stream value. * The data will be read from the stream * as needed until end-of-stream is reached. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateAsciiStream</code> which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateAsciiStream(int columnIndex, java.io.InputStream x) throws SQLException { startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x); } /** * Updates the designated column with a binary stream value. * The data will be read from the stream * as needed until end-of-stream is reached. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateBinaryStream</code> which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateBinaryStream(int columnIndex, java.io.InputStream x) throws SQLException { startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x); } /** * Updates the designated column with a character stream value. * The data will be read from the stream * as needed until end-of-stream is reached. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateCharacterStream</code> which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateCharacterStream(int columnIndex, java.io.Reader x) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, x); } /** * Updates the designated column with an ascii stream value. * The data will be read from the stream * as needed until end-of-stream is reached. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateAsciiStream</code> which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if the columnLabel is not valid; * if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateAsciiStream(String columnLabel, java.io.InputStream x) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x); } /** * Updates the designated column with a binary stream value. * The data will be read from the stream * as needed until end-of-stream is reached. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateBinaryStream</code> which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if the columnLabel is not valid; * if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateBinaryStream(String columnLabel, java.io.InputStream x) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x); } /** * Updates the designated column with a character stream value. * The data will be read from the stream * as needed until end-of-stream is reached. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateCharacterStream</code> which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader the <code>java.io.Reader</code> object containing * the new column value * @exception SQLException if the columnLabel is not valid; if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateCharacterStream( String columnLabel, java.io.Reader reader) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, reader); } /** * Updates the designated column using the given input stream. The data will be read from the stream * as needed until end-of-stream is reached. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateBlob</code> which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param inputStream An object that contains the data to set the parameter * value to. * @exception SQLException if the columnIndex is not valid; if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException { startUpdate(columnIndex); preparedStatement.setBlob(columnIndex, inputStream); } /** * Updates the designated column using the given input stream. The data will be read from the stream * as needed until end-of-stream is reached. * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateBlob</code> which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param inputStream An object that contains the data to set the parameter * value to. * @exception SQLException if the columnLabel is not valid; if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setBlob(columnIndex, inputStream); } /** * Updates the designated column using the given <code>Reader</code> * object. * The data will be read from the stream * as needed until end-of-stream is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateClob</code> which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateClob(int columnIndex, Reader reader) throws SQLException { startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader); } /** * Updates the designated column using the given <code>Reader</code> * object. * The data will be read from the stream * as needed until end-of-stream is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateClob</code> which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader An object that contains the data to set the parameter value to. * @exception SQLException if the columnLabel is not valid; if a database access error occurs; * the result set concurrency is <code>CONCUR_READ_ONLY</code> * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateClob(String columnLabel, Reader reader) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader); } /** * Updates the designated column using the given <code>Reader</code> * * The data will be read from the stream * as needed until end-of-stream is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateNClob</code> which takes a length parameter. * * @param columnIndex the first column is 1, the second 2, ... * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if the columnIndex is not valid; * if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set, * if a database access error occurs or * the result set concurrency is <code>CONCUR_READ_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateNClob(int columnIndex, Reader reader) throws SQLException { startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader); } /** * Updates the designated column using the given <code>Reader</code> * object. * The data will be read from the stream * as needed until end-of-stream is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * * <p> * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the <code>updateRow</code> or * <code>insertRow</code> methods are called to update the database. * * <P><B>Note:</B> Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * <code>updateNClob</code> which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if the columnLabel is not valid; if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set; * if a database access error occurs or * the result set concurrency is <code>CONCUR_READ_ONLY</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateNClob(String columnLabel, Reader reader) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader); } // --------------------- java.sql.Wrapper implementation ------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling <code>unwrap</code> recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an <code>SQLException</code> is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public <T>T unwrap(java.lang.Class<T> iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling <code>isWrapperFor</code> on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to <code>unwrap</code> so that * callers can use this method to avoid expensive <code>unwrap</code> calls that may fail. If this method * returns true then calling <code>unwrap</code> with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 1.9.0 */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class<?> iface) throws java.sql.SQLException { return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 //------------------------ Internal Implementation ----------------------------- /** The internal representation. */ private RowSetNavigator navigator; /** The internal representation. */ private ResultMetaData resultMetaData; /** How many columns does this ResultSet have? */ int columnCount; /** Did the last getXXX method encounter a null value? */ private boolean wasNullValue; /** The ResultSetMetaData object for this ResultSet */ private ResultSetMetaData resultSetMetaData; /** Properties of this ResultSet's parent Connection. */ private HsqlProperties connProperties; /** Accelerates findColumn; Map<columnName, columnIndex> */ private IntValueHashMap columnMap; private Result result; //-------------------------- Package Attributes ---------------------------- /** * The Statement that generated this result. Null if the result is * from DatabaseMetaData<p> */ JDBCStatementBase statement; SessionInterface session; /** * The scrollability / scroll sensitivity type of this result. */ int rsScrollabilty; /** The concurrency of this result. */ int rsConcurrency; /** The holdability of this result. */ int rsHoldability; /** The insertability of this result. */ boolean rsInsertability; int fetchSize; /** Statement is closed when its result set is closed */ boolean autoClose; // ---------------------- Public Attributes -------------------------------- // Support for JDBC 2 from JRE 1.1.x /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int FETCH_FORWARD = 1000; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int FETCH_REVERSE = 1001; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int FETCH_UNKNOWN = 1002; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int TYPE_FORWARD_ONLY = 1003; /** * Copy of java.sql.ResultSet constant, for JDK 1.1 clients. <p> * * (JDBC4 clarification:) scrollable but generally not sensitive * to changes to the data that underlies the <code>ResultSet</code>. */ public static final int TYPE_SCROLL_INSENSITIVE = 1004; /** * Copy of java.sql.ResultSet constant, for JDK 1.1 clients. <p> * * (JDBC4 clarification:) scrollable and generally sensitive * to changes to the data that underlies the <code>ResultSet</code>. */ public static final int TYPE_SCROLL_SENSITIVE = 1005; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int CONCUR_READ_ONLY = 1007; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int CONCUR_UPDATABLE = 1008; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int HOLD_CURSORS_OVER_COMMIT = 1; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int CLOSE_CURSORS_AT_COMMIT = 2; //-------------------------- Private Methods ------------------------------- /** * Fetches the current row of the result set. * * @throws SQLException when result set is closed; result set is empty; * result set is before first; result set is alfter last; no row data is * available. * @return Object[] */ private Object[] getCurrent() throws SQLException { final RowSetNavigator lnavigator = this.navigator; if (lnavigator == null) { throw Util.sqlException(ErrorCode.X_24501); } else if (lnavigator.isEmpty()) { throw Util.sqlException(ErrorCode.X_24504, ErrorCode.M_RS_EMPTY); } else if (lnavigator.isBeforeFirst()) { throw Util.sqlException(ErrorCode.X_24504, ErrorCode.M_RS_BEFORE_FIRST); } else if (lnavigator.isAfterLast()) { throw Util.sqlException(ErrorCode.X_24504, ErrorCode.M_RS_AFTER_LAST); } Object[] data = lnavigator.getCurrent(); if (data == null) { throw Util.sqlException(ErrorCode.X_24501); } return data; } /** * Internal closed state check. * * @throws SQLException when this result set is closed */ private void checkClosed() throws SQLException { if (navigator == null) { throw Util.sqlException(ErrorCode.X_24501); } } /** * Internal column index validity check. * * @param columnIndex to check * @throws SQLException when this ResultSet has no such column */ private void checkColumn(int columnIndex) throws SQLException { if (columnIndex < 1 || columnIndex > columnCount) { throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND, String.valueOf(columnIndex)); } } /** * Internal wasNull tracker. * * @param o the Object to track * @return boolean */ private boolean trackNull(Object o) { return (wasNullValue = (o == null)); } /** * Internal value converter. <p> * * All trivially successful getXXX methods eventually go through this * method, converting if neccessary from the source type to the * requested type. <p> * * Conversion to the JDBC representation, if different, is handled by the * calling methods. * * @param columnIndex of the column value for which to perform the * conversion * @param targetType the org.hsqldb.types.Type object for targetType * @return an Object of the requested targetType, representing the value of the * specified column * @throws SQLException when there is no rowData, the column index is * invalid, or the conversion cannot be performed */ private Object getColumnInType(int columnIndex, Type targetType) throws SQLException { Object[] rowData = getCurrent(); Type sourceType; Object value; checkColumn(columnIndex); sourceType = resultMetaData.columnTypes[--columnIndex]; value = rowData[columnIndex]; if (trackNull(value)) { return null; } if (sourceType.typeCode != targetType.typeCode) { try { value = targetType.convertToTypeJDBC(session, value, sourceType); } catch (Exception e) { String stringValue = (value instanceof Number || value instanceof String) ? value.toString() : "instance of " + value.getClass().getName(); String msg = "from SQL type " + sourceType.getNameString() + " to " + targetType.getJDBCClassName() + ", value: " + stringValue; Util.throwError(Error.error(ErrorCode.X_42561, msg)); } } return value; } private void checkNotForwardOnly() throws SQLException { if (rsScrollabilty == TYPE_FORWARD_ONLY) { throw Util.notSupported(); } } //-------------------------- Updates -------------------------------------- JDBCPreparedStatement preparedStatement; boolean isRowUpdated; boolean isOnInsertRow; /** * -2 after moveToInsertRow() * -1 before any updateXXX() * row number after any updateXXX() * -1 after updateRow(), clearUpdate() or moveToCurrentRow(); */ int currentUpdateRowNumber; private void checkUpdatable() throws SQLException { checkClosed(); if (rsConcurrency == ResultSet.CONCUR_READ_ONLY) { throw Util.notUpdatableColumn(); } } private void checkUpdatable(int columnIndex) throws SQLException { checkClosed(); checkColumn(columnIndex); if (rsConcurrency == ResultSet.CONCUR_READ_ONLY) { throw Util.notUpdatableColumn(); } if (resultMetaData.colIndexes[--columnIndex] == -1) { throw Util.notUpdatableColumn(); } } void startUpdate(int columnIndex) throws SQLException { checkUpdatable(columnIndex); if (currentUpdateRowNumber != navigator.getRowNumber()) { preparedStatement.clearParameters(); } currentUpdateRowNumber = navigator.getRowNumber(); isRowUpdated = true; } private void clearUpdates() throws SQLException { checkUpdatable(); preparedStatement.clearParameters(); isRowUpdated = false; } private void startInsert() throws SQLException { checkUpdatable(); // check insertable isOnInsertRow = true; } private void endInsert() throws SQLException { checkUpdatable(); preparedStatement.clearParameters(); isOnInsertRow = false; } private void performUpdate() throws SQLException { preparedStatement.parameterValues[columnCount] = getCurrent()[columnCount]; for (int i = 0; i < columnCount; i++) { boolean set = preparedStatement.parameterSet[i] || preparedStatement.parameterStream[i]; preparedStatement.resultOut.metaData.columnTypes[i] = set ? preparedStatement.parameterTypes[i] : Type.SQL_ALL_TYPES; } preparedStatement.resultOut.setActionType( ResultConstants.UPDATE_CURSOR); preparedStatement.fetchResult(); preparedStatement.clearParameters(); isRowUpdated = false; } private void performInsert() throws SQLException { checkUpdatable(); for (int i = 0; i < columnCount; i++) { boolean set = preparedStatement.parameterSet[i] || preparedStatement.parameterStream[i]; if (!set) { throw Util.sqlException(ErrorCode.X_24515); } preparedStatement.resultOut.metaData.columnTypes[i] = preparedStatement.parameterTypes[i]; } preparedStatement.resultOut.setActionType( ResultConstants.INSERT_CURSOR); preparedStatement.fetchResult(); preparedStatement.clearParameters(); } private void performDelete() throws SQLException { checkUpdatable(); preparedStatement.parameterValues[columnCount] = getCurrent()[columnCount]; preparedStatement.resultOut.metaData.columnTypes[columnCount] = resultMetaData.columnTypes[columnCount]; preparedStatement.resultOut.setActionType( ResultConstants.DELETE_CURSOR); preparedStatement.fetchResult(); preparedStatement.clearParameters(); } //-------------------------- Other Methods -------------------------------- // HSQLDB Specific RowSetNavigator getNavigator() { return navigator; } void setNavigator(RowSetNavigator navigator) { this.navigator = navigator; } //------------------------------ Contructors ------------------------------- /** * Constructs a new <code>JDBCResultSet</code> object using the specified * navigator and <code>org.hsqldb.result.ResultMetaData</code>. * * <p> * * @param s the statement * @param r the internal result form that the new * <code>JDBCResultSet</code> represents * @param metaData ResultMetaData * @param props the connection properties * @throws SQLException when the supplied Result is of type * org.hsqldb.Result.ERROR */ JDBCResultSet(SessionInterface session, JDBCStatementBase s, Result r, ResultMetaData metaData, HsqlProperties props) throws SQLException { this.session = session; this.statement = s; this.result = r; connProperties = props; rsScrollabilty = r.rsScrollability; rsConcurrency = r.rsConcurrency; rsHoldability = r.rsHoldability; navigator = r.getNavigator(); resultMetaData = metaData; columnCount = resultMetaData.getColumnCount(); if (rsConcurrency == ResultSet.CONCUR_UPDATABLE) { rsInsertability = true; for (int i = 0; i < metaData.colIndexes.length; i++) { if (metaData.colIndexes[i] < 0) { rsInsertability = false; break; } } preparedStatement = new JDBCPreparedStatement(s.connection, result); } } public <T> T getObject(int columnIndex, Class<T> type) throws SQLException { throw new SQLException(); } public <T> T getObject(String columnLabel, Class<T> type) throws SQLException { throw new SQLException(); } }