/* * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.rowset; import java.sql.*; import javax.sql.*; import javax.naming.*; import java.io.*; import java.math.*; import java.util.*; import javax.sql.rowset.*; import javax.sql.rowset.spi.SyncProvider; import javax.sql.rowset.spi.SyncProviderException; /** * The standard implementation of the JoinRowSet * interface providing an SQL JOIN between RowSet * objects. *

* The implementation provides an ANSI-style JOIN providing an * inner join between two tables. Any unmatched rows in either table of the * join are discarded. *

* Typically, a JoinRowSet implementation is leveraged by * RowSet instances that are in a disconnected environment and * thus do not have the luxury of an open connection to the data source to * establish logical relationships between themselves. In other words, it is * largely CachedRowSet objects and implementations derived from * the CachedRowSet interface that will use the JoinRowSetImpl * implementation. * * @author Amit Handa, Jonathan Bruce */ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet { /** * A Vector object that contains the RowSet objects * that have been added to this JoinRowSet object. */ private Vector vecRowSetsInJOIN; /** * The CachedRowSet object that encapsulates this * JoinRowSet object. * When RowSet objects are added to this JoinRowSet * object, they are also added to crsInternal to form the same kind of * SQL JOIN. As a result, methods for making updates to this * JoinRowSet object can use crsInternal methods in their * implementations. */ private CachedRowSetImpl crsInternal; /** * A Vector object containing the types of join that have been set * for this JoinRowSet object. * The last join type set forms the basis of succeeding joins. */ private Vector vecJoinType; /** * A Vector object containing the names of all the tables entering * the join. */ private Vector vecTableNames; /** * An int that indicates the column index of the match column. */ private int iMatchKey; /** * A String object that stores the name of the match column. */ private String strMatchKey ; /** * An array of boolean values indicating the types of joins supported * by this JoinRowSet implementation. */ boolean[] supportedJOINs; /** * The WebRowSet object that encapsulates this JoinRowSet * object. This WebRowSet object allows this JoinRowSet * object to leverage the properties and methods of a WebRowSet * object. */ private WebRowSet wrs; /** * Constructor for JoinRowSetImpl class. Configures various internal data * structures to provide mechanisms required for JoinRowSet interface * implementation. * * @throws SQLException if an error occurs in instantiating an instance of * JoinRowSetImpl */ public JoinRowSetImpl() throws SQLException { vecRowSetsInJOIN = new Vector(); crsInternal = new CachedRowSetImpl(); vecJoinType = new Vector(); vecTableNames = new Vector(); iMatchKey = -1; strMatchKey = null; supportedJOINs = new boolean[] {false, true, false, false, false}; try { resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle(); } catch(IOException ioe) { throw new RuntimeException(ioe); } } /** * Adds the given RowSet object to this * JoinRowSet object. If this * rowset is the first to be added to the JoinRowSet * object, it forms the basis for the JOIN * relationships to be formed. *

* This method should be used when the given RowSet object * already has a match column set. * * @param rowset the RowSet object that implements the * Joinable interface and is to be added * to this JoinRowSet object * @throws SQLException if an empty RowSet is added to the to the * JoinRowSet; if a match column is not set; or if an * additional RowSet violates the active JOIN * @see CachedRowSet#setMatchColumn */ public void addRowSet(Joinable rowset) throws SQLException { boolean boolColId, boolColName; boolColId = false; boolColName = false; CachedRowSetImpl cRowset; if(!(rowset instanceof RowSet)) { throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notinstance").toString()); } if(rowset instanceof JdbcRowSetImpl ) { cRowset = new CachedRowSetImpl(); cRowset.populate((RowSet)rowset); if(cRowset.size() == 0){ throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.emptyrowset").toString()); } try { int matchColumnCount = 0; for(int i=0; i< rowset.getMatchColumnIndexes().length; i++) { if(rowset.getMatchColumnIndexes()[i] != -1) ++ matchColumnCount; else break; } int[] pCol = new int[matchColumnCount]; for(int i=0; i indices = new ArrayList<>(); for(int i=0;iRowSet object to the JOIN relation * and sets the designated column as the match column. * If the given RowSet * object is the first to be added to this JoinRowSet * object, it forms the basis of the JOIN relationship to be formed * when other RowSet objects are added . *

* This method should be used when the given RowSet object * does not already have a match column set. * * @param rowset a RowSet object to be added to * the JOIN relation; must implement the Joinable * interface * @param columnIdx an int giving the index of the column to be set as * the match column * @throws SQLException if (1) an empty RowSet object is added to this * JoinRowSet object, (2) a match column has not been set, * or (3) the RowSet object being added violates the active * JOIN * @see CachedRowSet#unsetMatchColumn */ public void addRowSet(RowSet rowset, int columnIdx) throws SQLException { //passing the rowset as well as the columnIdx to form the joinrowset. ((CachedRowSetImpl)rowset).setMatchColumn(columnIdx); addRowSet((Joinable)rowset); } /** * Adds the given RowSet object to the JOIN relationship * and sets the designated column as the match column. If the given * RowSet * object is the first to be added to this JoinRowSet * object, it forms the basis of the JOIN relationship to be formed * when other RowSet objects are added . *

* This method should be used when the given RowSet object * does not already have a match column set. * * @param rowset a RowSet object to be added to * the JOIN relation * @param columnName a String object giving the name of the column * to be set as the match column; must implement the Joinable * interface * @throws SQLException if (1) an empty RowSet object is added to this * JoinRowSet object, (2) a match column has not been set, * or (3) the RowSet object being added violates the active * JOIN */ public void addRowSet(RowSet rowset, String columnName) throws SQLException { //passing the rowset as well as the columnIdx to form the joinrowset. ((CachedRowSetImpl)rowset).setMatchColumn(columnName); addRowSet((Joinable)rowset); } /** * Adds the given RowSet objects to the JOIN relationship * and sets the designated columns as the match columns. If the first * RowSet object in the array of RowSet objects * is the first to be added to this JoinRowSet * object, it forms the basis of the JOIN relationship to be formed * when other RowSet objects are added. *

* The first int * in columnIdx is used to set the match column for the first * RowSet object in rowset, the second int * in columnIdx is used to set the match column for the second * RowSet object in rowset, and so on. *

* This method should be used when the given RowSet objects * do not already have match columns set. * * @param rowset an array of RowSet objects to be added to * the JOIN relation; each RowSet object must * implement the Joinable interface * @param columnIdx an array of int values designating the columns * to be set as the * match columns for the RowSet objects in rowset * @throws SQLException if the number of RowSet objects in * rowset is not equal to the number of int values * in columnIdx */ public void addRowSet(RowSet[] rowset, int[] columnIdx) throws SQLException { //validate if length of rowset array is same as length of int array. if(rowset.length != columnIdx.length) { throw new SQLException (resBundle.handleGetObject("joinrowsetimpl.numnotequal").toString()); } else { for(int i=0; i< rowset.length; i++) { ((CachedRowSetImpl)rowset[i]).setMatchColumn(columnIdx[i]); addRowSet((Joinable)rowset[i]); } //end for } //end if } /** * Adds the given RowSet objects to the JOIN relationship * and sets the designated columns as the match columns. If the first * RowSet object in the array of RowSet objects * is the first to be added to this JoinRowSet * object, it forms the basis of the JOIN relationship to be formed * when other RowSet objects are added. *

* The first String object * in columnName is used to set the match column for the first * RowSet object in rowset, the second String * object in columnName is used to set the match column for the second * RowSet object in rowset, and so on. *

* This method should be used when the given RowSet objects * do not already have match columns set. * * @param rowset an array of RowSet objects to be added to * the JOIN relation; each RowSet object must * implement the Joinable interface * @param columnName an array of String objects designating the columns * to be set as the * match columns for the RowSet objects in rowset * @throws SQLException if the number of RowSet objects in * rowset is not equal to the number of String objects * in columnName, an empty JdbcRowSet is added to the * JoinRowSet, if a match column is not set, * or one or the RowSet objects in rowset violates the * active JOIN */ public void addRowSet(RowSet[] rowset, String[] columnName) throws SQLException { //validate if length of rowset array is same as length of int array. if(rowset.length != columnName.length) { throw new SQLException (resBundle.handleGetObject("joinrowsetimpl.numnotequal").toString()); } else { for(int i=0; i< rowset.length; i++) { ((CachedRowSetImpl)rowset[i]).setMatchColumn(columnName[i]); addRowSet((Joinable)rowset[i]); } //end for } //end if } /** * Returns a Collection of the RowSet object instances * currently residing with the instance of the JoinRowSet * object instance. This should return the 'n' number of RowSet contained * within the JOIN and maintain any updates that have occoured while in * this union. * * @return A Collection of the added RowSet * object instances * @throws SQLException if an error occours generating a collection * of the originating RowSets contained within the JOIN. */ public Collection getRowSets() throws SQLException { return vecRowSetsInJOIN; } /** * Returns a string array of the RowSet names currently residing * with the JoinRowSet object instance. * * @return a string array of the RowSet names * @throws SQLException if an error occours retrieving the RowSet names * @see CachedRowSet#setTableName */ public String[] getRowSetNames() throws SQLException { Object [] arr = vecTableNames.toArray(); String []strArr = new String[arr.length]; for( int i = 0;i < arr.length; i++) { strArr[i] = arr[i].toString(); } return strArr; } /** * Creates a separate CachedRowSet object that contains the data * in this JoinRowSet object. *

* If any updates or modifications have been applied to this JoinRowSet * object, the CachedRowSet object returned by this method will * not be able to persist * the changes back to the originating rows and tables in the * data source because the data may be from different tables. The * CachedRowSet instance returned should not * contain modification data, such as whether a row has been updated or what the * original values are. Also, the CachedRowSet object should clear * its properties pertaining to * its originating SQL statement. An application should reset the * SQL statement using the RowSet.setCommand method. *

* To persist changes back to the data source, the JoinRowSet object * calls the method acceptChanges. Implementations * can leverage the internal data and update tracking in their * implementations to interact with the SyncProvider to persist any * changes. * * @return a CachedRowSet object containing the contents of this * JoinRowSet object * @throws SQLException if an error occurs assembling the CachedRowSet * object * @see javax.sql.RowSet * @see javax.sql.rowset.CachedRowSet * @see javax.sql.rowset.spi.SyncProvider */ public CachedRowSet toCachedRowSet() throws SQLException { return crsInternal; } /** * Returns true if this JoinRowSet object supports * an SQL CROSS_JOIN and false if it does not. * * @return true if the CROSS_JOIN is supported; false * otherwise */ public boolean supportsCrossJoin() { return supportedJOINs[JoinRowSet.CROSS_JOIN]; } /** * Returns true if this JoinRowSet object supports * an SQL INNER_JOIN and false if it does not. * * @return true is the INNER_JOIN is supported; false otherwise */ public boolean supportsInnerJoin() { return supportedJOINs[JoinRowSet.INNER_JOIN]; } /** * Returns true if this JoinRowSet object supports * an SQL LEFT_OUTER_JOIN and false if it does not. * * @return true is the LEFT_OUTER_JOIN is supported; false otherwise */ public boolean supportsLeftOuterJoin() { return supportedJOINs[JoinRowSet.LEFT_OUTER_JOIN]; } /** * Returns true if this JoinRowSet object supports * an SQL RIGHT_OUTER_JOIN and false if it does not. * * @return true is the RIGHT_OUTER_JOIN is supported; false otherwise */ public boolean supportsRightOuterJoin() { return supportedJOINs[JoinRowSet.RIGHT_OUTER_JOIN]; } /** * Returns true if this JoinRowSet object supports * an SQL FULL_JOIN and false if it does not. * * @return true is the FULL_JOIN is supported; false otherwise */ public boolean supportsFullJoin() { return supportedJOINs[JoinRowSet.FULL_JOIN]; } /** * Sets the type of SQL JOIN that this JoinRowSet * object will use. This method * allows an application to adjust the type of JOIN imposed * on tables contained within this JoinRowSet object and to do it * on the fly. The last JOIN type set determines the type of * JOIN to be performed. *

* Implementations should throw an SQLException if they do * not support the given JOIN type. * * @param type one of the standard JoinRowSet constants * indicating the type of JOIN. Must be one of the * following: * JoinRowSet.CROSS_JOIN * JoinRowSet.INNER_JOIN * JoinRowSet.LEFT_OUTER_JOIN * JoinRowSet.RIGHT_OUTER_JOIN, or * JoinRowSet.FULL_JOIN * @throws SQLException if an unsupported JOIN type is set */ public void setJoinType(int type) throws SQLException { // The join which governs the join of two rowsets is the last // join set, using setJoinType if (type >= JoinRowSet.CROSS_JOIN && type <= JoinRowSet.FULL_JOIN) { if (type != JoinRowSet.INNER_JOIN) { // This 'if' will be removed after all joins are implemented. throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notsupported").toString()); } else { Integer Intgr = Integer.valueOf(JoinRowSet.INNER_JOIN); vecJoinType.add(Intgr); } } else { throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notdefined").toString()); } //end if } /** * This checks for a match column for * whether it exists or not. * * @param CachedRowSet object whose match column needs to be checked. * @throws SQLException if MatchColumn is not set. */ private boolean checkforMatchColumn(Joinable rs) throws SQLException { int[] i = rs.getMatchColumnIndexes(); if (i.length <= 0) { return false; } return true; } /** * Internal initialization of JoinRowSet. */ private void initJOIN(CachedRowSet rowset) throws SQLException { try { CachedRowSetImpl cRowset = (CachedRowSetImpl)rowset; // Create a new CachedRowSet object local to this function. CachedRowSetImpl crsTemp = new CachedRowSetImpl(); RowSetMetaDataImpl rsmd = new RowSetMetaDataImpl(); /* The following 'if block' seems to be always going true. commenting this out for present if (!supportedJOINs[1]) { throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notsupported").toString()); } */ if (vecRowSetsInJOIN.isEmpty() ) { // implies first cRowset to be added to the Join // simply add this as a CachedRowSet. // Also add it to the class variable of type vector // do not need to check "type" of Join but it should be set. crsInternal = (CachedRowSetImpl)rowset.createCopy(); crsInternal.setMetaData((RowSetMetaDataImpl)cRowset.getMetaData()); // metadata will also set the MatchColumn. vecRowSetsInJOIN.add(cRowset); } else { // At this point we are ready to add another rowset to 'this' object // Check the size of vecJoinType and vecRowSetsInJoin // If nothing is being set, internally call setJoinType() // to set to JoinRowSet.INNER_JOIN. // For two rowsets one (valid) entry should be there in vecJoinType // For three rowsets two (valid) entries should be there in vecJoinType // Maintain vecRowSetsInJoin = vecJoinType + 1 if( (vecRowSetsInJOIN.size() - vecJoinType.size() ) == 2 ) { // we are going to add next rowset and setJoinType has not been set // recently, so set it to setJoinType() to JoinRowSet.INNER_JOIN. // the default join type setJoinType(JoinRowSet.INNER_JOIN); } else if( (vecRowSetsInJOIN.size() - vecJoinType.size() ) == 1 ) { // do nothing setjoinType() has been set by programmer } // Add the table names to the class variable of type vector. vecTableNames.add(crsInternal.getTableName()); vecTableNames.add(cRowset.getTableName()); // Now we have two rowsets crsInternal and cRowset which need // to be INNER JOIN'ED to form a new rowset // Compare table1.MatchColumn1.value1 == { table2.MatchColumn2.value1 // ... upto table2.MatchColumn2.valueN } // ... // Compare table1.MatchColumn1.valueM == { table2.MatchColumn2.value1 // ... upto table2.MatchColumn2.valueN } // // Assuming first rowset has M rows and second N rows. int rowCount2 = cRowset.size(); int rowCount1 = crsInternal.size(); // total columns in the new CachedRowSet will be sum of both -1 // (common column) int matchColumnCount = 0; for(int i=0; i< crsInternal.getMatchColumnIndexes().length; i++) { if(crsInternal.getMatchColumnIndexes()[i] != -1) ++ matchColumnCount; else break; } rsmd.setColumnCount (crsInternal.getMetaData().getColumnCount() + cRowset.getMetaData().getColumnCount() - matchColumnCount); crsTemp.setMetaData(rsmd); crsInternal.beforeFirst(); cRowset.beforeFirst(); for (int i = 1 ; i <= rowCount1 ; i++) { if(crsInternal.isAfterLast() ) { break; } if(crsInternal.next()) { cRowset.beforeFirst(); for(int j = 1 ; j <= rowCount2 ; j++) { if( cRowset.isAfterLast()) { break; } if(cRowset.next()) { boolean match = true; for(int k=0; k ((crsInternal.getMetaData().getColumnCount()) + // (cRowset.getMetaData().getColumnCount()) - 1)) { // --p; //} rsmd.setColumnType(p+q-1, cRowset.getMetaData().getColumnType(q)); rsmd.setAutoIncrement(p+q-1, cRowset.getMetaData().isAutoIncrement(q)); rsmd.setCaseSensitive(p+q-1, cRowset.getMetaData().isCaseSensitive(q)); rsmd.setCatalogName(p+q-1, cRowset.getMetaData().getCatalogName(q)); rsmd.setColumnDisplaySize(p+q-1, cRowset.getMetaData().getColumnDisplaySize(q)); rsmd.setColumnLabel(p+q-1, cRowset.getMetaData().getColumnLabel(q)); rsmd.setColumnType(p+q-1, cRowset.getMetaData().getColumnType(q)); rsmd.setColumnTypeName(p+q-1, cRowset.getMetaData().getColumnTypeName(q)); rsmd.setCurrency(p+q-1,cRowset.getMetaData().isCurrency(q) ); rsmd.setNullable(p+q-1, cRowset.getMetaData().isNullable(q)); rsmd.setPrecision(p+q-1, cRowset.getMetaData().getPrecision(q)); rsmd.setScale(p+q-1, cRowset.getMetaData().getScale(q)); rsmd.setSchemaName(p+q-1, cRowset.getMetaData().getSchemaName(q)); rsmd.setSearchable(p+q-1, cRowset.getMetaData().isSearchable(q)); rsmd.setSigned(p+q-1, cRowset.getMetaData().isSigned(q)); } else { --p; } } crsTemp.insertRow(); crsTemp.moveToCurrentRow(); } else { // since not equa12 // so do nothing } //end if // bool1 = cRowset.next(); } } // end inner for //bool2 = crsInternal.next(); } } //end outer for crsTemp.setMetaData(rsmd); crsTemp.setOriginal(); // Now the join is done. // Make crsInternal = crsTemp, to be ready for next merge, if at all. int[] pCol = new int[matchColumnCount]; for(int i=0; iWHERE clause being used * in a JoinRowSet object instance. An implementation can describe * the WHERE clause of the SQL JOIN by supplying a SQL * strings description of JOIN or provide a textual description to assist * applications using a JoinRowSet. * * @return whereClause a textual or SQL descripition of the logical * WHERE cluase used in the JoinRowSet instance * @throws SQLException if an error occurs in generating a representation * of the WHERE clause. */ public String getWhereClause() throws SQLException { String strWhereClause = "Select "; String whereClause; String tabName= ""; String strTabName = ""; int sz,cols; int j; CachedRowSetImpl crs; // get all the column(s) names from each rowset. // append them with their tablenames i.e. tableName.columnName // Select tableName1.columnName1,..., tableNameX.columnNameY // from tableName1,...tableNameX where // tableName1.(rowset1.getMatchColumnName()) == // tableName2.(rowset2.getMatchColumnName()) + "and" + // tableNameX.(rowsetX.getMatchColumnName()) == // tableNameZ.(rowsetZ.getMatchColumnName())); sz = vecRowSetsInJOIN.size(); for(int i=0;itrue if the new cursor position is a * valid row. * The cursor for a new ResultSet object is initially * positioned before the first row. The first call to the method * next moves the cursor to the first row, making it * the current row; the second call makes the second row the * current row, and so on. * *

If an input stream from the previous row is open, it is * implicitly closed. The ResultSet object's warning * chain is cleared when a new row is read. * * @return true if the new current row is valid; * false if there are no more rows * @throws SQLException if an error occurs or * the cursor is not positioned in the rowset, before * the first row, or after the last row */ public boolean next() throws SQLException { return crsInternal.next(); } /** * Releases the current contents of this rowset, discarding outstanding * updates. The rowset contains no rows after the method * release is called. This method sends a * RowSetChangedEvent object to all registered listeners prior * to returning. * * @throws SQLException if an error occurs */ public void close() throws SQLException { crsInternal.close(); } /** * Reports whether the last column read was SQL NULL. * Note that you must first call the method getXXX * on a column to try to read its value and then call the method * wasNull to determine whether the value was * SQL NULL. * * @return true if the value in the last column read * was SQL NULL; false otherwise * @throws SQLException if an error occurs */ public boolean wasNull() throws SQLException { return crsInternal.wasNull(); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * String object. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is null * @throws SQLException if the given column index is out of bounds or * the cursor is not on a valid row */ public String getString(int columnIndex) throws SQLException { return crsInternal.getString(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * boolean value. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is false * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public boolean getBoolean(int columnIndex) throws SQLException { return crsInternal.getBoolean(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * byte value. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is 0 * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public byte getByte(int columnIndex) throws SQLException { return crsInternal.getByte(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * short value. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is 0 * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public short getShort(int columnIndex) throws SQLException { return crsInternal.getShort(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * short value. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is 0 * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public int getInt(int columnIndex) throws SQLException { return crsInternal.getInt(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * long value. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is 0 * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public long getLong(int columnIndex) throws SQLException { return crsInternal.getLong(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * float value. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is 0 * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public float getFloat(int columnIndex) throws SQLException { return crsInternal.getFloat(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * double value. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is 0 * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public double getDouble(int columnIndex) throws SQLException { return crsInternal.getDouble(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * java.math.BigDecimal object. *

* This method is deprecated; use the version of getBigDecimal * that does not take a scale parameter and returns a value with full * precision. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @param scale the number of digits to the right of the decimal point in the * value returned * @return the column value with the specified number of digits to the right * of the decimal point; if the value is SQL NULL, the * result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails * @deprecated */ public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { return crsInternal.getBigDecimal(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * byte array value. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or the the value to be * retrieved is not binary */ public byte[] getBytes(int columnIndex) throws SQLException { return crsInternal.getBytes(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * java.sql.Date object. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public java.sql.Date getDate(int columnIndex) throws SQLException { return crsInternal.getDate(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * java.sql.Time object. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public java.sql.Time getTime(int columnIndex) throws SQLException { return crsInternal.getTime(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * java.sql.Timestamp object. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public java.sql.Timestamp getTimestamp(int columnIndex) throws SQLException { return crsInternal.getTimestamp(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * java.sql.Timestamp object. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return the column value; if the value is SQL NULL, the * result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException { return crsInternal.getAsciiStream(columnIndex); } /** * A column value can be retrieved as a stream of Unicode characters * and then read in chunks from the stream. This method is particularly * suitable for retrieving large LONGVARCHAR values. The JDBC driver will * do any necessary conversion from the database format into Unicode. * *

Note: All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a get method implicitly closes the stream. . Also, a * stream may return 0 for available() whether there is data * available or not. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @return a Java input stream that delivers the database column value * as a stream of two byte Unicode characters. If the value is SQL NULL * then the result is null. * @throws SQLException if an error occurs * @deprecated */ public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException { return crsInternal.getUnicodeStream(columnIndex); } /** * A column value can be retrieved as a stream of uninterpreted bytes * and then read in chunks from the stream. This method is particularly * suitable for retrieving large LONGVARBINARY values. * *

Note: All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a get method implicitly closes the stream. Also, a * stream may return 0 for available() whether there is data * available or not. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return a Java input stream that delivers the database column value * as a stream of uninterpreted bytes. If the value is SQL NULL * then the result is null. * @throws SQLException if an error occurs */ public java.io.InputStream getBinaryStream(int columnIndex) throws SQLException { return crsInternal.getBinaryStream(columnIndex); } // ColumnName methods /** * Retrieves the value stored in the designated column * of the current row as a String object. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public String getString(String columnName) throws SQLException { return crsInternal.getString(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a boolean value. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is false * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public boolean getBoolean(String columnName) throws SQLException { return crsInternal.getBoolean(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a byte value. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is 0 * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public byte getByte(String columnName) throws SQLException { return crsInternal.getByte(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a short value. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is 0 * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public short getShort(String columnName) throws SQLException { return crsInternal.getShort(columnName); } /** * Retrieves the value stored in the designated column * of the current row as an int value. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is 0 * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public int getInt(String columnName) throws SQLException { return crsInternal.getInt(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a long value. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is 0 * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public long getLong(String columnName) throws SQLException { return crsInternal.getLong(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a float value. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is 0 * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public float getFloat(String columnName) throws SQLException { return crsInternal.getFloat(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a double value. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is 0 * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public double getDouble(String columnName) throws SQLException { return crsInternal.getDouble(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a java.math.BigDecimal object. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @param scale the number of digits to the right of the decimal point * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row * @deprecated use the method getBigDecimal(String columnName) * instead */ public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException { return crsInternal.getBigDecimal(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a byte array. * The bytes represent the raw values returned by the driver. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public byte[] getBytes(String columnName) throws SQLException { return crsInternal.getBytes(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a java.sql.Date object. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public java.sql.Date getDate(String columnName) throws SQLException { return crsInternal.getDate(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a java.sql.Time object. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public java.sql.Time getTime(String columnName) throws SQLException { return crsInternal.getTime(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a java.sql.Timestamp object. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public java.sql.Timestamp getTimestamp(String columnName) throws SQLException { return crsInternal.getTimestamp(columnName); } /** * This method is not supported, and it will throw an * UnsupportedOperationException if it is called. *

* A column value can be retrieved as a stream of ASCII characters * and then read in chunks from the stream. This method is particularly * suitable for retrieving large LONGVARCHAR values. The JDBC driver will * do any necessary conversion from the database format into ASCII format. * *

Note: All the data in the returned stream must * be read prior to getting the value of any other column. The * next call to a getXXX method implicitly closes the stream. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return a Java input stream that delivers the database column value * as a stream of one-byte ASCII characters. If the value is SQL * NULL, the result is null. * @throws UnsupportedOperationException if this method is called */ public java.io.InputStream getAsciiStream(String columnName) throws SQLException { return crsInternal.getAsciiStream(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a java.io.InputStream object. * A column value can be retrieved as a stream of Unicode characters * and then read in chunks from the stream. This method is particularly * suitable for retrieving large LONGVARCHAR values. * The JDBC driver will do any necessary conversion from the database * format into Unicode. * *

Note: All the data in the returned stream must * be read prior to getting the value of any other column. The * next call to a getXXX method implicitly closes the stream. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return a Java input stream that delivers the database column value * as a stream of two-byte Unicode characters. If the value is * SQL NULL, the result is null. * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row * @deprecated use the method getCharacterStream instead */ public java.io.InputStream getUnicodeStream(String columnName) throws SQLException { return crsInternal.getUnicodeStream(columnName); } /** * Retrieves the value stored in the designated column * of the current row as a java.io.InputStream object. * A column value can be retrieved as a stream of uninterpreted bytes * and then read in chunks from the stream. This method is particularly * suitable for retrieving large LONGVARBINARY values. * *

Note: All the data in the returned stream must * be read prior to getting the value of any other column. The * next call to a get method implicitly closes the stream. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return a Java input stream that delivers the database column value * as a stream of uninterpreted bytes. If the value is SQL * NULL, the result is null. * @throws SQLException if the given column name does not match one of * this rowset's column names or the cursor is not on one of * this rowset's rows or its insert row */ public java.io.InputStream getBinaryStream(String columnName) throws SQLException { return crsInternal.getBinaryStream(columnName); } /* The first warning reported by calls on this JoinRowSetImpl * object is returned. Subsequent JoinRowSetImpl warnings will * be chained to this SQLWarning. * *

The warning chain is automatically cleared each time a new * row is read. * *

Note: This warning chain only covers warnings caused * by ResultSet methods. Any warning caused by statement * methods (such as reading OUT parameters) will be chained on the * Statement object. * * @return the first SQLWarning or null * @throws UnsupportedOperationException if this method is called */ public SQLWarning getWarnings() { return crsInternal.getWarnings(); } /** * Throws an UnsupportedOperationException if called. *

* After a call to this method, the getWarnings method * returns null until a new warning is reported for this * JoinRowSetImpl object. * * @throws UnsupportedOperationException if this method is called */ public void clearWarnings() { crsInternal.clearWarnings(); } /** * Retrieves the name of the SQL cursor used by this * JoinRowSetImpl object. * *

In SQL, a result table is retrieved through a cursor that is * named. The current row of a result 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 an update operation, the cursor's SELECT * statement should be of the form 'select for update'. If the 'for update' * clause is omitted, positioned updates may fail. * *

JDBC supports this SQL feature by providing the name of the * SQL cursor used by a ResultSet object. The current row * of a result set is also the current row of this SQL cursor. * *

Note: If positioned updates are not supported, an * SQLException is thrown. * * @return the SQL cursor name for this JoinRowSetImpl object's * cursor * @throws SQLException if an error occurs */ public String getCursorName() throws SQLException { return crsInternal.getCursorName(); } /** * Retrieves the ResultSetMetaData object that contains * information about this CachedRowsSet object. The * information includes the number of columns, the data type for each * column, and other properties for each column. * * @return the ResultSetMetaData object that describes this * JoinRowSetImpl object's columns * @throws SQLException if an error occurs */ public ResultSetMetaData getMetaData() throws SQLException { return crsInternal.getMetaData(); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as an * Object value. *

* The type of the 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. *

* This method may also be used to read datatabase-specific * abstract data types. *

* This implementation of the method getObject extends its * behavior so that it gets the attributes of an SQL structured type as * as an array of Object values. This method also custom * maps SQL user-defined types to classes in the Java programming language. * When the specified column contains * a structured or distinct value, the behavior of this method is as * if it were a call to the method getObject(columnIndex, * this.getStatement().getConnection().getTypeMap()). * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return a java.lang.Object holding the column value; * if the value is SQL NULL, the result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or there is a problem getting * the Class object for a custom mapping * @since 1.2 */ public Object getObject(int columnIndex) throws SQLException { return crsInternal.getObject(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as an * Object value. *

* The type of the 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. *

* This method may also be used to read datatabase-specific * abstract data types. *

* This implementation of the method getObject extends its * behavior so that it gets the attributes of an SQL structured type as * as an array of Object values. This method also custom * maps SQL user-defined types to classes * in the Java programming language. When the specified column contains * a structured or distinct value, the behavior of this method is as * if it were a call to the method getObject(columnIndex, * this.getStatement().getConnection().getTypeMap()). * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @param map a java.util.Map object showing the mapping * from SQL type names to classes in the Java programming * language * @return a java.lang.Object holding the column value; * if the value is SQL NULL, the result is * null * @throws SQLException if (1) the given column name does not match * one of this rowset's column names, (2) the cursor is not * on a valid row, or (3) there is a problem getting * the Class object for a custom mapping */ public Object getObject(int columnIndex, java.util.Map> map) throws SQLException { return crsInternal.getObject(columnIndex, map); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as an * Object value. *

* The type of the 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. *

* This method may also be used to read datatabase-specific * abstract data types. *

* This implementation of the method getObject extends its * behavior so that it gets the attributes of an SQL structured type as * as an array of Object values. This method also custom * maps SQL user-defined types to classes * in the Java programming language. When the specified column contains * a structured or distinct value, the behavior of this method is as * if it were a call to the method getObject(columnIndex, * this.getStatement().getConnection().getTypeMap()). * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @return a java.lang.Object holding the column value; * if the value is SQL NULL, the result is * null * @throws SQLException if (1) the given column name does not match * one of this rowset's column names, (2) the cursor is not * on a valid row, or (3) there is a problem getting * the Class object for a custom mapping */ public Object getObject(String columnName) throws SQLException { return crsInternal.getObject(columnName); } /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as an Object in * the Java programming lanugage, using the given * java.util.Map object to custom map the value if * appropriate. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param map a java.util.Map object showing the mapping * from SQL type names to classes in the Java programming * language * @return an Object representing the SQL value * @throws SQLException if the given column index is out of bounds or * the cursor is not on one of this rowset's rows or its * insert row */ public Object getObject(String columnName, java.util.Map> map) throws SQLException { return crsInternal.getObject(columnName, map); } /** * Retrieves the value stored in the designated column * of the current row as a java.io.Reader object. * *

Note: All the data in the returned stream must * be read prior to getting the value of any other column. The * next call to a getXXX method implicitly closes the stream. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return a Java character stream that delivers the database column value * as a java.io.Reader object. If the value is * SQL NULL, the result is null. * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or there is a type mismatch */ public java.io.Reader getCharacterStream(int columnIndex) throws SQLException { return crsInternal.getCharacterStream(columnIndex); } /** * Retrieves the value stored in the designated column * of the current row as a java.io.Reader object. * *

Note: All the data in the returned stream must * be read prior to getting the value of any other column. The * next call to a getXXX method implicitly closes the stream. * * @param columnName a String object giving the SQL name of * a column in this JoinRowSetImpl object * @return a Java input stream that delivers the database column value * as a stream of two-byte Unicode characters. If the value is * SQL NULL, the result is null. * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or there is a type mismatch */ public java.io.Reader getCharacterStream(String columnName) throws SQLException { return crsInternal.getCharacterStream(columnName); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * java.math.BigDecimal object. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @return a java.math.BigDecimal value with full precision; * if the value is SQL NULL, the result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public BigDecimal getBigDecimal(int columnIndex) throws SQLException { return crsInternal.getBigDecimal(columnIndex); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * java.math.BigDecimal object. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @return a java.math.BigDecimal value with full precision; * if the value is SQL NULL, the result is null * @throws SQLException if the given column index is out of bounds, * the cursor is not on a valid row, or this method fails */ public BigDecimal getBigDecimal(String columnName) throws SQLException { return crsInternal.getBigDecimal(columnName); } /** * Returns the number of rows in this JoinRowSetImpl object. * * @return number of rows in the rowset */ public int size() { return crsInternal.size(); } /** * Indicates whether the cursor is before the first row in this * JoinRowSetImpl object. * * @return true if the cursor is before the first row; * false otherwise or if the rowset contains no rows * @throws SQLException if an error occurs */ public boolean isBeforeFirst() throws SQLException { return crsInternal.isBeforeFirst(); } /** * Indicates whether the cursor is after the last row in this * JoinRowSetImpl object. * * @return true if the cursor is after the last row; * false otherwise or if the rowset contains no rows * @throws SQLException if an error occurs */ public boolean isAfterLast() throws SQLException { return crsInternal.isAfterLast(); } /** * Indicates whether the cursor is on the first row in this * JoinRowSetImpl object. * * @return true if the cursor is on the first row; * false otherwise or if the rowset contains no rows * @throws SQLException if an error occurs */ public boolean isFirst() throws SQLException { return crsInternal.isFirst(); } /** * Indicates whether the cursor is on the last row in this * JoinRowSetImpl object. *

* Note: Calling the method isLast 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 this rowset. * * @return true if the cursor is on the last row; * false otherwise or if this rowset contains no rows * @throws SQLException if an error occurs */ public boolean isLast() throws SQLException { return crsInternal.isLast(); } /** * Moves this JoinRowSetImpl object's cursor to the front of * the rowset, just before the first row. This method has no effect if * this rowset contains no rows. * * @throws SQLException if an error occurs or the type of this rowset * is ResultSet.TYPE_FORWARD_ONLY */ public void beforeFirst() throws SQLException { crsInternal.beforeFirst(); } /** * Moves this JoinRowSetImpl object's cursor to the end of * the rowset, just after the last row. This method has no effect if * this rowset contains no rows. * * @throws SQLException if an error occurs */ public void afterLast() throws SQLException { crsInternal.afterLast(); } /** * Moves this JoinRowSetImpl object's cursor to the first row * and returns true if the operation was successful. This * method also notifies registered listeners that the cursor has moved. * * @return true if the cursor is on a valid row; * false otherwise or if there are no rows in this * JoinRowSetImpl object * @throws SQLException if the type of this rowset * is ResultSet.TYPE_FORWARD_ONLY */ public boolean first() throws SQLException { return crsInternal.first(); } /** * Moves this JoinRowSetImpl object's cursor to the last row * and returns true if the operation was successful. This * method also notifies registered listeners that the cursor has moved. * * @return true if the cursor is on a valid row; * false otherwise or if there are no rows in this * JoinRowSetImpl object * @throws SQLException if the type of this rowset * is ResultSet.TYPE_FORWARD_ONLY */ public boolean last() throws SQLException { return crsInternal.last(); } /** * Returns the number of the current row in this JoinRowSetImpl * object. The first row is number 1, the second number 2, and so on. * * @return the number of the current row; 0 if there is no * current row * @throws SQLException if an error occurs */ public int getRow() throws SQLException { return crsInternal.getRow(); } /** * Moves this JoinRowSetImpl object's cursor to the row number * specified. * *

If the number is positive, the cursor moves to an absolute row with * respect to the beginning of the rowset. The first row is row 1, the second * is row 2, and so on. For example, the following command, in which * crs is a JoinRowSetImpl object, moves the cursor * to the fourth row, starting from the beginning of the rowset. *


     *
     *    crs.absolute(4);
     *
     *  
*

* If the number is negative, the cursor moves to an absolute row position * with respect to the end of the rowset. For example, calling * absolute(-1) positions the cursor on the last row, * absolute(-2) moves it on the next-to-last row, and so on. * If the JoinRowSetImpl object crs has five rows, * the following command moves the cursor to the fourth-to-last row, which * in the case of a rowset with five rows, is also the second row, counting * from the beginning. *


     *
     *    crs.absolute(-4);
     *
     *  
* * If the number specified is larger than the number of rows, the cursor * will move to the position after the last row. If the number specified * would move the cursor one or more rows before the first row, the cursor * moves to the position before the first row. *

* Note: Calling absolute(1) is the same as calling the * method first(). Calling absolute(-1) is the * same as calling last(). * * @param row a positive number to indicate the row, starting row numbering from * the first row, which is 1; a negative number to indicate * the row, starting row numbering from the last row, which is * -1; must not be 0 * @return true if the cursor is on the rowset; false * otherwise * @throws SQLException if the given cursor position is 0 or the * type of this rowset is ResultSet.TYPE_FORWARD_ONLY */ public boolean absolute(int row) throws SQLException { return crsInternal.absolute(row); } /** * Moves the cursor the specified number of rows from the current * position, with a positive number moving it forward and a * negative number moving it backward. *

* If the number is positive, the cursor moves the specified number of * rows toward the end of the rowset, starting at the current row. * For example, the following command, in which * crs is a JoinRowSetImpl object with 100 rows, * moves the cursor forward four rows from the current row. If the * current row is 50, the cursor would move to row 54. *


     *
     *    crs.relative(4);
     *
     *  
*

* If the number is negative, the cursor moves back toward the beginning * the specified number of rows, starting at the current row. * For example, calling the method * absolute(-1) positions the cursor on the last row, * absolute(-2) moves it on the next-to-last row, and so on. * If the JoinRowSetImpl object crs has five rows, * the following command moves the cursor to the fourth-to-last row, which * in the case of a rowset with five rows, is also the second row * from the beginning. *


     *
     *    crs.absolute(-4);
     *
     *  
* * If the number specified is larger than the number of rows, the cursor * will move to the position after the last row. If the number specified * would move the cursor one or more rows before the first row, the cursor * moves to the position before the first row. In both cases, this method * throws an SQLException. *

* Note: Calling absolute(1) is the same as calling the * method first(). Calling absolute(-1) is the * same as calling last(). Calling relative(0) * is valid, but it does not change the cursor position. * * @param rows an int indicating the number of rows to move * the cursor, starting at the current row; a positive number * moves the cursor forward; a negative number moves the cursor * backward; must not move the cursor past the valid * rows * @return true if the cursor is on a row in this * JoinRowSetImpl object; false * otherwise * @throws SQLException if there are no rows in this rowset, the cursor is * positioned either before the first row or after the last row, or * the rowset is type ResultSet.TYPE_FORWARD_ONLY */ public boolean relative(int rows) throws SQLException { return crsInternal.relative(rows); } /** * Moves this JoinRowSetImpl object's cursor to the * previous row and returns true if the cursor is on * a valid row or false if it is not. * This method also notifies all listeners registered with this * JoinRowSetImpl object that its cursor has moved. *

* Note: calling the method previous() is not the same * as calling the method relative(-1). This is true * because it is possible to call previous() from the insert * row, from after the last row, or from the current row, whereas * relative may only be called from the current row. *

* The method previous may used in a while * loop to iterate through a rowset starting after the last row * and moving toward the beginning. The loop ends when previous * returns false, meaning that there are no more rows. * For example, the following code fragment retrieves all the data in * the JoinRowSetImpl object crs, which has * three columns. Note that the cursor must initially be positioned * after the last row so that the first call to the method * previous places the cursor on the last line. *

 
     *
     *     crs.afterLast();
     *     while (previous()) {
     *         String name = crs.getString(1);
     *         int age = crs.getInt(2);
     *         short ssn = crs.getShort(3);
     *         System.out.println(name + "   " + age + "   " + ssn);
     *     }
     *
     *  
* This method throws an SQLException if the cursor is not * on a row in the rowset, before the first row, or after the last row. * * @return true if the cursor is on a valid row; * false if it is before the first row or after the * last row * @throws SQLException if the cursor is not on a valid position or the * type of this rowset is ResultSet.TYPE_FORWARD_ONLY */ public boolean previous() throws SQLException { return crsInternal.previous(); } /** * Returns the index of the column whose name is columnName. * * @param columnName a String object giving the name of the * column for which the index will be returned; the name must * match the SQL name of a column in this JoinRowSet * object, ignoring case * @throws SQLException if the given column name does not match one of the * column names for this JoinRowSet object */ public int findColumn(String columnName) throws SQLException { return crsInternal.findColumn(columnName); } /** * Indicates whether the current row of this JoinRowSetImpl * object has been updated. The value returned * depends on whether this rowset can detect updates: false * will always be returned if it does not detect updates. * * @return true if the row has been visibly updated * by the owner or another and updates are detected; * false otherwise * @throws SQLException if the cursor is on the insert row or not * on a valid row * * @see DatabaseMetaData#updatesAreDetected */ public boolean rowUpdated() throws SQLException { return crsInternal.rowUpdated(); } /** * Indicates whether the designated column of the current row of * this JoinRowSetImpl object has been updated. The * value returned depends on whether this rowset can detcted updates: * false will always be returned if it does not detect updates. * * @return true if the column updated * false otherwse * @throws SQLException if the cursor is on the insert row or not * on a valid row * @see DatabaseMetaData#updatesAreDetected */ public boolean columnUpdated(int indexColumn) throws SQLException { return crsInternal.columnUpdated(indexColumn); } /** * Indicates whether the current row has been inserted. The value returned * depends on whether or not the rowset can detect visible inserts. * * @return true if a row has been inserted and inserts are detected; * false otherwise * @throws SQLException if the cursor is on the insert row or not * not on a valid row * * @see DatabaseMetaData#insertsAreDetected */ public boolean rowInserted() throws SQLException { return crsInternal.rowInserted(); } /** * Indicates whether the current row has been deleted. A deleted row * may leave a visible "hole" in a rowset. This method can be used to * detect such holes if the rowset can detect deletions. This method * will always return false if this rowset cannot detect * deletions. * * @return true if (1)the current row is blank, indicating that * the row has been deleted, and (2)deletions are detected; * false otherwise * @throws SQLException if the cursor is on a valid row in this rowset * @see DatabaseMetaData#deletesAreDetected */ public boolean rowDeleted() throws SQLException { return crsInternal.rowDeleted(); } /** * Sets the designated nullable column in the current row or the * insert row of this JoinRowSetImpl object with * null value. *

* This method updates a column value in the current row or the insert * row of this rowset; however, another method must be called to complete * the update process. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to mark the row as updated * and to notify listeners that the row has changed. * If the cursor is on the insert row, the method {@link #insertRow} * must be called to insert the new row into this rowset and to notify * listeners that a row has changed. *

* In order to propagate updates in this rowset to the underlying * data source, an application must call the method acceptChanges * after it calls either updateRow or insertRow. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateNull(int columnIndex) throws SQLException { crsInternal.updateNull(columnIndex); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * boolean value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateBoolean(int columnIndex, boolean x) throws SQLException { crsInternal.updateBoolean(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * byte value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateByte(int columnIndex, byte x) throws SQLException { crsInternal.updateByte(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * short value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateShort(int columnIndex, short x) throws SQLException { crsInternal.updateShort(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * int value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateInt(int columnIndex, int x) throws SQLException { crsInternal.updateInt(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * long value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateLong(int columnIndex, long x) throws SQLException { crsInternal.updateLong(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * float value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateFloat(int columnIndex, float x) throws SQLException { crsInternal.updateFloat(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * double value. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateDouble(int columnIndex, double x) throws SQLException { crsInternal.updateDouble(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * java.math.BigDecimal object. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { crsInternal.updateBigDecimal(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * String object. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to mark the row as updated. * If the cursor is on the insert row, the method {@link #insertRow} * must be called to insert the new row into this rowset and mark it * as inserted. Both of these methods must be called before the * cursor moves to another row. *

* The method acceptChanges must be called if the * updated values are to be written back to the underlying database. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateString(int columnIndex, String x) throws SQLException { crsInternal.updateString(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * byte array. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateBytes(int columnIndex, byte x[]) throws SQLException { crsInternal.updateBytes(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Date object. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, (3) the type of the designated column is not * an SQL DATE or TIMESTAMP, or * (4) this rowset is ResultSet.CONCUR_READ_ONLY */ public void updateDate(int columnIndex, java.sql.Date x) throws SQLException { crsInternal.updateDate(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Time object. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, (3) the type of the designated column is not * an SQL TIME or TIMESTAMP, or * (4) this rowset is ResultSet.CONCUR_READ_ONLY */ public void updateTime(int columnIndex, java.sql.Time x) throws SQLException { crsInternal.updateTime(columnIndex, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Timestamp object. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, (3) the type of the designated column is not * an SQL DATE, TIME, or * TIMESTAMP, or (4) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException { crsInternal.updateTimestamp(columnIndex, x); } /* * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * ASCII stream value. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @param length the number of one-byte ASCII characters in the stream * @throws UnsupportedOperationException if this method is invoked */ public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException { crsInternal.updateAsciiStream(columnIndex, x, length); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * java.io.InputStream object. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value; must be a java.io.InputStream * containing BINARY, VARBINARY, or * LONGVARBINARY data * @param length the length of the stream in bytes * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, (3) the data in the stream is not binary, or * (4) this rowset is ResultSet.CONCUR_READ_ONLY */ public void updateBinaryStream(int columnIndex, java.io.InputStream x, int length) throws SQLException { crsInternal.updateBinaryStream(columnIndex, x, length); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * java.io.Reader object. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value; must be a java.io.Reader * containing BINARY, VARBINARY, * LONGVARBINARY, CHAR, VARCHAR, * or LONGVARCHAR data * @param length the length of the stream in characters * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, (3) the data in the stream is not a binary or * character type, or (4) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException { crsInternal.updateCharacterStream(columnIndex, x, length); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Object value. The scale parameter indicates * the number of digits to the right of the decimal point and is ignored * if the new column value is not a type that will be mapped to an SQL * DECIMAL or NUMERIC value. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @param scale the number of digits to the right of the decimal point (for * DECIMAL and NUMERIC types only) * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateObject(int columnIndex, Object x, int scale) throws SQLException { crsInternal.updateObject(columnIndex, x, scale); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Object value. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param x the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateObject(int columnIndex, Object x) throws SQLException { crsInternal.updateObject(columnIndex, x); } // columnName updates /** * Sets the designated nullable column in the current row or the * insert row of this JoinRowSetImpl object with * null value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateNull(String columnName) throws SQLException { crsInternal.updateNull(columnName); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * boolean value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateBoolean(String columnName, boolean x) throws SQLException { crsInternal.updateBoolean(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * byte value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateByte(String columnName, byte x) throws SQLException { crsInternal.updateByte(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * short value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateShort(String columnName, short x) throws SQLException { crsInternal.updateShort(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * int value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateInt(String columnName, int x) throws SQLException { crsInternal.updateInt(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * long value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateLong(String columnName, long x) throws SQLException { crsInternal.updateLong(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * float value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateFloat(String columnName, float x) throws SQLException { crsInternal.updateFloat(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * double value. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateDouble(String columnName, double x) throws SQLException { crsInternal.updateDouble(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * java.math.BigDecimal object. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException { crsInternal.updateBigDecimal(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * String object. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateString(String columnName, String x) throws SQLException { crsInternal.updateString(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * byte array. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateBytes(String columnName, byte x[]) throws SQLException { crsInternal.updateBytes(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Date object. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, (3) the type * of the designated column is not an SQL DATE or * TIMESTAMP, or (4) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateDate(String columnName, java.sql.Date x) throws SQLException { crsInternal.updateDate(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Time object. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, (3) the type * of the designated column is not an SQL TIME or * TIMESTAMP, or (4) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateTime(String columnName, java.sql.Time x) throws SQLException { crsInternal.updateTime(columnName, x); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Timestamp object. * * This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if the given column index is out of bounds or * the cursor is not on one of this rowset's rows or its * insert row * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, (3) the type * of the designated column is not an SQL DATE, * TIME, or TIMESTAMP, or (4) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException { crsInternal.updateTimestamp(columnName, x); } /** * Unsupported; throws an UnsupportedOperationException * if called. *

* Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * ASCII stream value. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @param length the number of one-byte ASCII characters in the stream * @throws UnsupportedOperationException if this method is invoked */ public void updateAsciiStream(String columnName, java.io.InputStream x, int length) throws SQLException { crsInternal.updateAsciiStream(columnName, x, length); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * java.io.InputStream object. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value; must be a java.io.InputStream * containing BINARY, VARBINARY, or * LONGVARBINARY data * @param length the length of the stream in bytes * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, (3) the data * in the stream is not binary, or (4) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException { crsInternal.updateBinaryStream(columnName, x, length); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * java.io.Reader object. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value; must be a java.io.Reader * containing BINARY, VARBINARY, * LONGVARBINARY, CHAR, VARCHAR, * or LONGVARCHAR data * @param length the length of the stream in characters * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, (3) the data * in the stream is not a binary or character type, or (4) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateCharacterStream(String columnName, java.io.Reader x, int length) throws SQLException { crsInternal.updateCharacterStream(columnName, x, length); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Object value. The scale parameter * indicates the number of digits to the right of the decimal point * and is ignored if the new column value is not a type that will be * mapped to an SQL DECIMAL or NUMERIC value. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @param scale the number of digits to the right of the decimal point (for * DECIMAL and NUMERIC types only) * @throws SQLException if the given column index is out of bounds or * the cursor is not on one of this rowset's rows or its * insert row * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateObject(String columnName, Object x, int scale) throws SQLException { crsInternal.updateObject(columnName, x, scale); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Object value. *

* This method updates a column value in either the current row or * the insert row of this rowset, but it does not update the * database. If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Both of these methods must be called before the * cursor moves to another row. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param x the new column value * @throws SQLException if (1) the given column name does not match the * name of a column in this rowset, (2) the cursor is not on * one of this rowset's rows or its insert row, or (3) this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateObject(String columnName, Object x) throws SQLException { crsInternal.updateObject(columnName, x); } /** * Inserts the contents of this JoinRowSetImpl object's insert * row into this rowset immediately following the current row. * If the current row is the * position after the last row or before the first row, the new row will * be inserted at the end of the rowset. This method also notifies * listeners registered with this rowset that the row has changed. *

* The cursor must be on the insert row when this method is called. * * @throws SQLException if (1) the cursor is not on the insert row, * (2) one or more of the non-nullable columns in the insert * row has not been given a value, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void insertRow() throws SQLException { crsInternal.insertRow(); } /** * Marks the current row of this JoinRowSetImpl object as * updated and notifies listeners registered with this rowset that the * row has changed. *

* This method cannot be called when the cursor is on the insert row, and * it should be called before the cursor moves to another row. If it is * called after the cursor moves to another row, this method has no effect, * and the updates made before the cursor moved will be lost. * * @throws SQLException if the cursor is on the insert row or this * rowset is ResultSet.CONCUR_READ_ONLY */ public void updateRow() throws SQLException { crsInternal.updateRow(); } /** * Deletes the current row from this JoinRowSetImpl object and * notifies listeners registered with this rowset that a row has changed. * This method cannot be called when the cursor is on the insert row. *

* This method marks the current row as deleted, but it does not delete * the row from the underlying data source. The method * acceptChanges must be called to delete the row in * the data source. * * @throws SQLException if (1) this method is called when the cursor * is on the insert row, before the first row, or after the * last row or (2) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void deleteRow() throws SQLException { crsInternal.deleteRow(); } /** * Sets the current row with its original value and marks the row as * not updated, thus undoing any changes made to the row since the * last call to the methods updateRow or deleteRow. * This method should be called only when the cursor is on a row in * this rowset. * * @throws SQLException if the cursor is on the insert row, before the * first row, or after the last row */ public void refreshRow() throws SQLException { crsInternal.refreshRow(); } /** * Rolls back any updates made to the current row of this * JoinRowSetImpl object and notifies listeners that * a row has changed. To have an effect, this method * must be called after an updateXXX method has been * called and before the method updateRow has been called. * If no updates have been made or the method updateRow * has already been called, this method has no effect. *

* After updateRow is called it is the * cancelRowUpdates has no affect on the newly * inserted values. The method cancelRowInsert can * be used to remove any rows inserted into the RowSet. * * @throws SQLException if the cursor is on the insert row, before the * first row, or after the last row */ public void cancelRowUpdates() throws SQLException { crsInternal.cancelRowUpdates(); } /** * Moves the cursor for this JoinRowSetImpl object * to the insert row. The current row in the rowset is remembered * while the cursor is on the insert row. *

* The insert row is a special row associated with an updatable * rowset. It is essentially a buffer where a new row may * be constructed by calling the appropriate updateXXX * methods to assign a value to each column in the row. A complete * row must be constructed; that is, every column that is not nullable * must be assigned a value. In order for the new row to become part * of this rowset, the method insertRow must be called * before the cursor is moved back to the rowset. *

* Only certain methods may be invoked while the cursor is on the insert * row; many methods throw an exception if they are called while the * cursor is there. In addition to the updateXXX * and insertRow methods, only the getXXX methods * may be called when the cursor is on the insert row. A getXXX * method should be called on a column only after an updateXXX * method has been called on that column; otherwise, the value returned is * undetermined. * * @throws SQLException if this JoinRowSetImpl object is * ResultSet.CONCUR_READ_ONLY */ public void moveToInsertRow() throws SQLException { crsInternal.moveToInsertRow(); } /** * Moves the cursor for this JoinRowSetImpl object to * the current row. The current row is the row the cursor was on * when the method moveToInsertRow was called. *

* Calling this method has no effect unless it is called while the * cursor is on the insert row. * * @throws SQLException if an error occurs */ public void moveToCurrentRow() throws SQLException { crsInternal.moveToCurrentRow(); } /** * Returns null. * * @return null * @throws SQLException if an error occurs */ public Statement getStatement() throws SQLException { return crsInternal.getStatement(); } /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as a Ref object * in the Java programming lanugage. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @return a Ref object representing an SQL REF value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) the designated column does not store an * SQL REF value */ public Ref getRef(int columnIndex) throws SQLException { return crsInternal.getRef(columnIndex); } /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as a Blob object * in the Java programming lanugage. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @return a Blob object representing an SQL BLOB value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) the designated column does not store an * SQL BLOB value */ public Blob getBlob(int columnIndex) throws SQLException { return crsInternal.getBlob(columnIndex); } /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as a Clob object * in the Java programming lanugage. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @return a Clob object representing an SQL CLOB value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) the designated column does not store an * SQL CLOB value */ public Clob getClob(int columnIndex) throws SQLException { return crsInternal.getClob(columnIndex); } /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as an Array object * in the Java programming lanugage. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @return an Array object representing an SQL * ARRAY value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) the designated column does not store an * SQL ARRAY value */ public Array getArray(int columnIndex) throws SQLException { return crsInternal.getArray(columnIndex); } // ColumnName /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as a Ref object * in the Java programming lanugage. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @return a Ref object representing an SQL REF value * @throws SQLException if (1) the given column name is not the name * of a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the column value * is not an SQL REF value */ public Ref getRef(String columnName) throws SQLException { return crsInternal.getRef(columnName); } /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as a Blob object * in the Java programming lanugage. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @return a Blob object representing an SQL * BLOB value * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL BLOB value */ public Blob getBlob(String columnName) throws SQLException { return crsInternal.getBlob(columnName); } /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as a Clob object * in the Java programming lanugage. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @return a Clob object representing an SQL * CLOB value * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL CLOB value */ public Clob getClob(String columnName) throws SQLException { return crsInternal.getClob(columnName); } /** * Retrieves the value of the designated column in this * JoinRowSetImpl object as an Array object * in the Java programming lanugage. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @return an Array object representing an SQL * ARRAY value * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL ARRAY value */ public Array getArray(String columnName) throws SQLException { return crsInternal.getArray(columnName); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a java.sql.Date * object, using the given Calendar object to construct an * appropriate millisecond value for the date. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @param cal the java.util.Calendar object to use in * constructing the date * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL DATE or * TIMESTAMP value */ public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException { return crsInternal.getDate(columnIndex, cal); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a java.sql.Date * object, using the given Calendar object to construct an * appropriate millisecond value for the date. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param cal the java.util.Calendar object to use in * constructing the date * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL DATE or * TIMESTAMP value */ public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException { return crsInternal.getDate(columnName, cal); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a java.sql.Time * object, using the given Calendar object to construct an * appropriate millisecond value for the date. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @param cal the java.util.Calendar object to use in * constructing the date * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL TIME or * TIMESTAMP value */ public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException { return crsInternal.getTime(columnIndex, cal); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a java.sql.Time * object, using the given Calendar object to construct an * appropriate millisecond value for the date. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param cal the java.util.Calendar object to use in * constructing the date * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL TIME or * TIMESTAMP value */ public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException { return crsInternal.getTime(columnName, cal); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a java.sql.Timestamp * object, using the given Calendar object to construct an * appropriate millisecond value for the date. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in the rowset * @param cal the java.util.Calendar object to use in * constructing the date * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL TIME or * TIMESTAMP value */ public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { return crsInternal.getTimestamp(columnIndex, cal); } /** * Retrieves the value of the designated column in the current row * of this JoinRowSetImpl object as a * java.sql.Timestamp object, using the given * Calendar object to construct an appropriate * millisecond value for the date. * * @param columnName a String object that must match the * SQL name of a column in this rowset, ignoring case * @param cal the java.util.Calendar object to use in * constructing the date * @return the column value; if the value is SQL NULL, * the result is null * @throws SQLException if (1) the given column name is not the name of * a column in this rowset, (2) the cursor is not on one of * this rowset's rows or its insert row, or (3) the designated * column does not store an SQL DATE, * TIME, or TIMESTAMP value */ public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException { return crsInternal.getTimestamp(columnName, cal); } /** * Sets the metadata for this JoinRowSetImpl object * with the given RowSetMetaData object. * * @param md a RowSetMetaData object instance containing * metadata about the columsn in the rowset * @throws SQLException if invalid meta data is supplied to the * rowset */ public void setMetaData(RowSetMetaData md) throws SQLException { crsInternal.setMetaData(md); } public ResultSet getOriginal() throws SQLException { return crsInternal.getOriginal(); } /** * Returns a result set containing the original value of the rowset. * The cursor is positioned before the first row in the result set. * Only rows contained in the result set returned by getOriginal() * are said to have an original value. * * @return the original result set of the rowset * @throws SQLException if an error occurs produce the * ResultSet object */ public ResultSet getOriginalRow() throws SQLException { return crsInternal.getOriginalRow(); } /** * Returns a result set containing the original value of the current * row only. * * @throws SQLException if there is no current row * @see #setOriginalRow */ public void setOriginalRow() throws SQLException { crsInternal.setOriginalRow(); } /** * Returns the columns that make a key to uniquely identify a * row in this JoinRowSetImpl object. * * @return an array of column number that constites a primary * key for this rowset. This array should be empty * if no columns is representitive of a primary key * @throws SQLException if the rowset is empty or no columns * are designated as primary keys * @see #setKeyColumns */ public int[] getKeyColumns() throws SQLException { return crsInternal.getKeyColumns(); } /** * Sets this JoinRowSetImpl object's * keyCols field with the given array of column * numbers, which forms a key for uniquely identifying a row * in this rowset. * * @param cols an array of int indicating the * columns that form a primary key for this * JoinRowSetImpl object; every * element in the array must be greater than * 0 and less than or equal to the number * of columns in this rowset * @throws SQLException if any of the numbers in the * given array is not valid for this rowset * @see #getKeyColumns */ public void setKeyColumns(int[] cols) throws SQLException { crsInternal.setKeyColumns(cols); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Ref value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Either of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param ref the java.sql.Ref object that will be set as * the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateRef(int columnIndex, java.sql.Ref ref) throws SQLException { crsInternal.updateRef(columnIndex, ref); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Ref value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Either of these methods must be called before the * cursor moves to another row. * * @param columnName a String object giving the name of the column * to be updated; must match one of the column names in this * JoinRowSetImpl object * @param ref the java.sql.Ref object that will be set as * the new column value * @throws SQLException if (1) the given column name is not valid, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateRef(String columnName, java.sql.Ref ref) throws SQLException { crsInternal.updateRef(columnName, ref); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Clob object. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Either of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param c the java.sql.Clob object that will be set as * the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateClob(int columnIndex, Clob c) throws SQLException { crsInternal.updateClob(columnIndex, c); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Clob object. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Either of these methods must be called before the * cursor moves to another row. * * @param columnName a String object giving the name of the column * to be updated; must match one of the column names in this * JoinRowSetImpl object * @param c the java.sql.Clob object that will be set as * the new column value * @throws SQLException if (1) the given column name is not valid, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateClob(String columnName, Clob c) throws SQLException { crsInternal.updateClob(columnName, c); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Blob value. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Either of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param b the java.sql.Blob object that will be set as * the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateBlob(int columnIndex, Blob b) throws SQLException { crsInternal.updateBlob(columnIndex, b); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Blob object. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Either of these methods must be called before the * cursor moves to another row. * * @param columnName a String object giving the name of the column * to be updated; must match one of the column names in this * JoinRowSetImpl object * @param b the java.sql.Blob object that will be set as * the new column value * @throws SQLException if (1) the given column name is not valid, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateBlob(String columnName, Blob b) throws SQLException { crsInternal.updateBlob(columnName, b); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Array object. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Either of these methods must be called before the * cursor moves to another row. * * @param columnIndex the first column is 1, the second * is 2, and so on; must be 1 or larger * and equal to or less than the number of columns in this rowset * @param a the java.sql.Array object that will be set as * the new column value * @throws SQLException if (1) the given column index is out of bounds, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateArray(int columnIndex, Array a) throws SQLException { crsInternal.updateArray(columnIndex, a); } /** * Sets the designated column in either the current row or the insert * row of this JoinRowSetImpl object with the given * Array object. *

* This method updates a column value in the current row or the insert * row of this rowset, but it does not update the database. * If the cursor is on a row in the rowset, the * method {@link #updateRow} must be called to update the database. * If the cursor is on the insert row, the method {@link #insertRow} * must be called, which will insert the new row into both this rowset * and the database. Either of these methods must be called before the * cursor moves to another row. * * @param columnName a String object giving the name of the column * to be updated; must match one of the column names in this * JoinRowSetImpl object * @param a the java.sql.Array object that will be set as * the new column value * @throws SQLException if (1) the given column name is not valid, * (2) the cursor is not on one of this rowset's rows or its * insert row, or (3) this rowset is * ResultSet.CONCUR_READ_ONLY */ public void updateArray(String columnName, Array a) throws SQLException { crsInternal.updateArray(columnName, a); } /** * Populates this JoinRowSetImpl object with data. * This form of the method uses the rowset's user, password, and url or * data source name properties to create a database * connection. If properties that are needed * have not been set, this method will throw an exception. *

* Another form of this method uses an existing JDBC Connection * object instead of creating a new one; therefore, it ignores the * properties used for establishing a new connection. *

* The query specified by the command property is executed to create a * ResultSet object from which to retrieve data. * The current contents of the rowset are discarded, and the * rowset's metadata is also (re)set. If there are outstanding updates, * they are also ignored. *

* The method execute closes any database connections that it * creates. * * @throws SQLException if an error occurs or the * necessary properties have not been set */ public void execute() throws SQLException { crsInternal.execute(); } /** * Populates this JoinRowSetImpl object with data, * using the given connection to produce the result set from * which data will be read. A second form of this method, * which takes no arguments, uses the values from this rowset's * user, password, and either url or data source properties to * create a new database connection. The form of execute * that is given a connection ignores these properties. * * @param conn A standard JDBC Connection object with valid * properties that the JoinRowSet implementation * can pass to a synchronization provider to establish a * connection to the datasource * @throws SQLException if an invalid Connection is supplied * or an error occurs in establishing the connection to the * data soure * @see java.sql.Connection */ public void execute(Connection conn) throws SQLException { crsInternal.execute(conn); } /** * Provide interface coverage for getURL(int) in ResultSet->RowSet */ public java.net.URL getURL(int columnIndex) throws SQLException { return crsInternal.getURL(columnIndex); } /** * Provide interface coverage for getURL(String) in ResultSet->RowSet */ public java.net.URL getURL(String columnName) throws SQLException { return crsInternal.getURL(columnName); } /** * Creates a new WebRowSet object, populates it with the * data in the given ResultSet object, and writes it * to the given java.io.Writer object in XML format. * * @throws SQLException if an error occurs writing out the rowset * contents to XML */ public void writeXml(ResultSet rs, java.io.Writer writer) throws SQLException { wrs = new WebRowSetImpl(); wrs.populate(rs); wrs.writeXml(writer); } /** * Writes this JoinRowSet object to the given * java.io.Writer object in XML format. In * addition to the rowset's data, its properties and metadata * are also included. * * @throws SQLException if an error occurs writing out the rowset * contents to XML */ public void writeXml(java.io.Writer writer) throws SQLException { createWebRowSet().writeXml(writer); } /** * Reads this JoinRowSet object in its XML format. * * @throws SQLException if a database access error occurs */ public void readXml(java.io.Reader reader) throws SQLException { wrs = new WebRowSetImpl(); wrs.readXml(reader); crsInternal = (CachedRowSetImpl)wrs; } // Stream based methods /** * Reads a stream based XML input to populate an WebRowSet * * @throws SQLException if a data source access occurs * @throws IOException if a IO exception occurs */ public void readXml(java.io.InputStream iStream) throws SQLException, IOException { wrs = new WebRowSetImpl(); wrs.readXml(iStream); crsInternal = (CachedRowSetImpl)wrs; } /** * Creates an an output stream of the internal state and contents of a * WebRowSet for XML proceessing * * @throws SQLException if a datasource access occurs * @throws IOException if an IO exception occurs */ public void writeXml(java.io.OutputStream oStream) throws SQLException, IOException { createWebRowSet().writeXml(oStream); } /** * Creates a new WebRowSet object, populates it with * the contents of the ResultSet and creates an output * streams the internal state and contents of the rowset for XML processing. * * @throws SQLException if a datasource access occurs * @throws IOException if an IO exception occurs */ public void writeXml(ResultSet rs, java.io.OutputStream oStream) throws SQLException, IOException { wrs = new WebRowSetImpl(); wrs.populate(rs); wrs.writeXml(oStream); } /** * %%% Javadoc comments to be added here */ private WebRowSet createWebRowSet() throws SQLException { if(wrs != null) { // check if it has already been initialized. return wrs; } else { wrs = new WebRowSetImpl(); crsInternal.beforeFirst(); wrs.populate(crsInternal); return wrs; } } /** * Returns the last set SQL JOIN type in this JoinRowSetImpl * object * * @return joinType One of the standard JoinRowSet static field JOIN types * @throws SQLException if an error occurs determining the current join type */ public int getJoinType() throws SQLException { if (vecJoinType == null) { // Default JoinRowSet type this.setJoinType(JoinRowSet.INNER_JOIN); } Integer i = (Integer)(vecJoinType.get(vecJoinType.size()-1)); return i.intValue(); } /** * The listener will be notified whenever an event occurs on this JoinRowSet * object. *

* A listener might, for example, be a table or graph that needs to * be updated in order to accurately reflect the current state of * the RowSet object. *

* Note: if the RowSetListener object is * null, this method silently discards the null * value and does not add a null reference to the set of listeners. *

* Note: if the listener is already set, and the new RowSetListerner * instance is added to the set of listeners already registered to receive * event notifications from this RowSet. * * @param listener an object that has implemented the * javax.sql.RowSetListener interface and wants to be notified * of any events that occur on this JoinRowSet object; May be * null. * @see #removeRowSetListener */ public void addRowSetListener(RowSetListener listener) { crsInternal.addRowSetListener(listener); } /** * Removes the designated object from this JoinRowSet object's list of listeners. * If the given argument is not a registered listener, this method * does nothing. * * Note: if the RowSetListener object is * null, this method silently discards the null * value. * * @param listener a RowSetListener object that is on the list * of listeners for this JoinRowSet object * @see #addRowSetListener */ public void removeRowSetListener(RowSetListener listener) { crsInternal.removeRowSetListener(listener); } /** * Converts this JoinRowSetImpl object to a collection * of tables. The sample implementation utilitizes the TreeMap * collection type. * This class guarantees that the map will be in ascending key order, * sorted according to the natural order for the key's class. * * @return a Collection object consisting of tables, * each of which is a copy of a row in this * JoinRowSetImpl object * @throws SQLException if an error occurs in generating the collection * @see #toCollection(int) * @see #toCollection(String) * @see java.util.TreeMap */ public Collection toCollection() throws SQLException { return crsInternal.toCollection(); } /** * Returns the specified column of this JoinRowSetImpl object * as a Collection object. This method makes a copy of the * column's data and utilitizes the Vector to establish the * collection. The Vector class implements a growable array * objects allowing the individual components to be accessed using an * an integer index similar to that of an array. * * @return a Collection object that contains the value(s) * stored in the specified column of this * JoinRowSetImpl * object * @throws SQLException if an error occurs generated the collection; or * an invalid column is provided. * @see #toCollection() * @see #toCollection(String) * @see java.util.Vector */ public Collection toCollection(int column) throws SQLException { return crsInternal.toCollection(column); } /** * Returns the specified column of this JoinRowSetImpl object * as a Collection object. This method makes a copy of the * column's data and utilitizes the Vector to establish the * collection. The Vector class implements a growable array * objects allowing the individual components to be accessed using an * an integer index similar to that of an array. * * @return a Collection object that contains the value(s) * stored in the specified column of this * JoinRowSetImpl * object * @throws SQLException if an error occurs generated the collection; or * an invalid column is provided. * @see #toCollection() * @see #toCollection(int) * @see java.util.Vector */ public Collection toCollection(String column) throws SQLException { return crsInternal.toCollection(column); } /** * Creates a RowSet object that is a copy of * this JoinRowSetImpl object's table structure * and the constraints only. * There will be no data in the object being returned. * Updates made on a copy are not visible to the original rowset. *

* This helps in getting the underlying XML schema which can * be used as the basis for populating a WebRowSet. * * @return a new CachedRowSet object that is a copy * of this JoinRowSetImpl object's schema and * retains all the constraints on the original rowset but contains * no data * @throws SQLException if an error occurs in generating the copy * of the CachedRowSet object * @see #createShared * @see #createCopy * @see #createCopyNoConstraints * @see javax.sql.RowSetEvent * @see javax.sql.RowSetListener */ public CachedRowSet createCopySchema() throws SQLException { return crsInternal.createCopySchema(); } /** * {@inheritDoc} */ public void setSyncProvider(String providerStr) throws SQLException { crsInternal.setSyncProvider(providerStr); } /** * {@inheritDoc} */ public void acceptChanges() throws SyncProviderException { crsInternal.acceptChanges(); } /** * {@inheritDoc} */ public SyncProvider getSyncProvider() throws SQLException { return crsInternal.getSyncProvider(); } /** * This method re populates the resBundle * during the deserialization process * */ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { // Default state initialization happens here ois.defaultReadObject(); // Initialization of transient Res Bundle happens here . try { resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle(); } catch(IOException ioe) { throw new RuntimeException(ioe); } } static final long serialVersionUID = -5590501621560008453L; }