1 /*
   2  * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.rowset.internal;
  27 
  28 import java.sql.*;
  29 import javax.sql.*;
  30 import java.util.*;
  31 import java.math.BigDecimal;
  32 
  33 import javax.sql.rowset.*;
  34 import javax.sql.rowset.spi.*;
  35 
  36 import com.sun.rowset.*;
  37 import java.io.IOException;
  38 import java.io.ObjectInputStream;
  39 
  40 /**
  41  * There will be two sets of data which will be maintained by the rowset at the
  42  * time of synchronization. The <code>SyncProvider</code> will utilize the
  43  * <code>SyncResolver</code> to synchronize the changes back to database.
  44  */
  45 public class SyncResolverImpl extends CachedRowSetImpl implements SyncResolver {
  46     /**
  47      * This CachedRowSet object will encapsulate a rowset
  48      * which will be sync'ed with the datasource but will
  49      * contain values in rows where there is conflict.
  50      * For rows other than conflict, it will *not* contain
  51      * any data. For rows containing conflict it will
  52      * return either of the three values set by SyncResolver.*_CONFLICT
  53      * from getStatus()
  54      */
  55     private CachedRowSetImpl crsRes;
  56 
  57     /**
  58      * This is the actual CachedRowSet object
  59      * which is being synchronized back to
  60      * datasource.
  61      */
  62     private CachedRowSetImpl crsSync;
  63 
  64     /**
  65      *  This ArrayList will contain the status of a row
  66      *  from the SyncResolver.* values else it will be null.
  67      */
  68     private ArrayList<?> stats;
  69 
  70     /**
  71      * The RowSetWriter associated with the original
  72      * CachedRowSet object which is being synchronized.
  73      */
  74     private CachedRowSetWriter crw;
  75 
  76     /**
  77      * Row number identifier
  78      */
  79     private int rowStatus;
  80 
  81     /**
  82      * This will contain the size of the <code>CachedRowSet</code> object
  83      */
  84     private int sz;
  85 
  86     /**
  87      * The <code>Connection</code> handle used to synchronize the changes
  88      * back to datasource. This is the same connection handle as was passed
  89      * to the CachedRowSet while fetching the data.
  90      */
  91     private transient Connection con;
  92 
  93     /**
  94      * The <code>CachedRowSet</code> object which will encapsulate
  95      * a row at any time. This will be built from CachedRowSet and
  96      * SyncResolver values. Synchronization takes place on a row by
  97      * row basis encapsulated as a CahedRowSet.
  98      */
  99     private CachedRowSet row;
 100 
 101     private JdbcRowSetResourceBundle resBundle;
 102 
 103     /**
 104      * Public constructor
 105      */
 106     public SyncResolverImpl() throws SQLException {
 107         try {
 108             crsSync = new CachedRowSetImpl();
 109             crsRes = new CachedRowSetImpl();
 110             crw = new CachedRowSetWriter();
 111             row = new CachedRowSetImpl();
 112             rowStatus = 1;
 113             try {
 114                 resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
 115             } catch(IOException ioe) {
 116                 throw new RuntimeException(ioe);
 117             }
 118 
 119         } catch(SQLException sqle) {
 120         }
 121      }
 122 
 123 
 124     /**
 125      * Retrieves the conflict status of the current row of this
 126      * <code>SyncResolver</code>, which indicates the operationthe <code>RowSet</code>
 127      * object was attempting when the conflict occurred.
 128      *
 129      * @return one of the following constants:
 130      *         <code>SyncResolver.UPDATE_ROW_CONFLICT</code>,
 131      *         <code>SyncResolver.DELETE_ROW_CONFLICT</code>, or
 132      *         <code>SyncResolver.INSERT_ROW_CONFLICT</code>
 133      */
 134     public int getStatus() {
 135         return ((Integer)stats.get(rowStatus-1)).intValue();
 136     }
 137 
 138     /**
 139      * Retrieves the value in the designated column in the current row of this
 140      * <code>SyncResolver</code> object, which is the value that caused a conflict.
 141      *
 142      * @param index <code>int</code> designating the column in this row of this
 143      *        <code>SyncResolver</code> object from which to retrieve the value
 144      *        causing a conflict
 145      */
 146     public Object getConflictValue(int index) throws SQLException {
 147         try {
 148              return crsRes.getObject(index);
 149         } catch(SQLException sqle) {
 150             throw new SQLException(sqle.getMessage());
 151         }
 152     }
 153 
 154     /**
 155      * Retrieves the value in the designated column in the current row of this
 156      * <code>SyncResolver</code> object, which is the value that caused a conflict.
 157      *
 158      * @param columnName a <code>String</code> object designating the column in this row of this
 159      *        <code>SyncResolver</code> object from which to retrieve the value
 160      *        causing a conflict
 161      */
 162     public Object getConflictValue(String columnName) throws SQLException {
 163         try {
 164              return crsRes.getObject(columnName);
 165         } catch(SQLException sqle) {
 166              throw new SQLException(sqle.getMessage());
 167         }
 168     }
 169 
 170     /**
 171      * Sets <i>obj</i> as the value in column <i>index</i> in the current row of the
 172      * <code>RowSet</code> object. This value is the resolved value that is to be
 173      * persisted in the data source.
 174      *
 175      * @param index an <code>int</code> giving the number of the column into which to
 176      *        set the value to be persisted
 177      * @param obj an <code>Object</code> that is the value to be set in the data source
 178      */
 179     public void setResolvedValue(int index, Object obj) throws SQLException {
 180         // modify method to throw SQLException in spec
 181 
 182         /**
 183          * When a value is resolved properly make it to null
 184          * inside crsRes for that column.
 185          *
 186          * For more than one conflicts in the row,
 187          * check for the last resolved value of the current row
 188          * (Note: it can be resolved randomly for same row)
 189          * then sync back immediately.
 190          **/
 191         try {
 192             // check whether the index is in range
 193             if(index<=0 || index > crsSync.getMetaData().getColumnCount() ) {
 194                 throw new SQLException(resBundle.handleGetObject("syncrsimpl.indexval").toString()+ index);
 195             }
 196              // check whether index col is in conflict
 197             if(crsRes.getObject(index) == null) {
 198                 throw new SQLException(resBundle.handleGetObject("syncrsimpl.noconflict").toString());
 199             }
 200         } catch (SQLException sqle) {
 201             // modify method to throw for SQLException
 202             throw new SQLException(sqle.getMessage());
 203         }
 204         try {
 205              boolean bool = true;
 206              /** Check resolved value to be either of conflict
 207                * or in rowset else throw sql exception.
 208                * If we allow a value other than that in CachedRowSet or
 209                * datasource we will end up in looping the loop of exceptions.
 210               **/
 211 
 212              if( ((crsSync.getObject(index)).toString()).equals(obj.toString()) ||
 213                      ((crsRes.getObject(index)).toString()).equals(obj.toString()) ) {
 214 
 215                 /**
 216                  * Check whether this is the only conflict in the row.
 217                  * If yes, synchronize this row back
 218                  * which has been resolved, else wait
 219                  * for all conflicts of current row to be resolved
 220                  *
 221                  * Step 1: Update crsRes and make the index col as null
 222                  * i.e. resolved
 223                  * crsRes.updateObject(index, obj);
 224                  **/
 225                   crsRes.updateNull(index);
 226                   crsRes.updateRow();
 227 
 228                  /**
 229                   * Step 2: Change the value in the CachedRowSetImpl object
 230                   * crsSync.updateObject(index, obj);
 231                   * crsSync.updateRow();
 232                   **/
 233                  if(row.size() != 1) {
 234                     row = buildCachedRow();
 235                  }
 236 
 237                  row.updateObject(index, obj);
 238                  row.updateRow();
 239 
 240                  for(int j=1; j < crsRes.getMetaData().getColumnCount(); j++) {
 241                      if(crsRes.getObject(j) != null) {
 242                         bool = false;
 243                         break;
 244                          // break out of loop and wait for other cols
 245                          // in same row to get resolved
 246                      } //end if
 247 
 248                   } //end for
 249 
 250                   if(bool) {
 251                      /**
 252                       * sync data back using CachedRowSetWriter
 253                       * construct the present row and pass it to the writer
 254                       * to write back to db.
 255                       **/
 256                      try {
 257                            /**
 258                             * Note : The use of CachedRowSetWriter to get *same* Connection handle.
 259                             * The CachedRowSetWriter uses the connection handle
 260                             * from the reader, Hence will use the same connection handle
 261                             * as of original CachedRowSetImpl
 262                             **/
 263 
 264                           writeData(row);
 265 
 266                           //crw.writeData( (RowSetInternal)crsRow);
 267                           //System.out.printlnt.println("12");
 268 
 269                      } catch(SyncProviderException spe) {
 270                          /**
 271                           * This will occur if db is not allowing
 272                           * even after resolving the conflicts
 273                           * due to some reasons.
 274                           * Also will prevent from going into a loop of SPE's
 275                           **/
 276                          throw new SQLException(resBundle.handleGetObject("syncrsimpl.syncnotpos").toString());
 277                      }
 278                   } //end if(bool)
 279 
 280              } else {
 281                  throw new SQLException(resBundle.handleGetObject("syncrsimpl.valtores").toString());
 282              } //end if (crs.getObject ...) block
 283 
 284 
 285         } catch(SQLException sqle) {
 286            throw new SQLException(sqle.getMessage());
 287         }
 288     }
 289 
 290     /**
 291      * This passes a CachedRowSet as a row to the CachedRowSetWriter
 292      * after the values have been resolved, back to the datasource.
 293      *
 294      * @param row a <code>CachedRowSet</code> object which will hold the
 295      *        values of a particular row after they have been resolved by
 296      *        the user to synchronize back to datasource.
 297      * @throws SQLException if synchronization does not happen properly
 298      *         maybe beacuse <code>Connection</code> has timed out.
 299      **/
 300      private void writeData(CachedRowSet row) throws SQLException {
 301         crw.updateResolvedConflictToDB(row, crw.getReader().connect((RowSetInternal)crsSync));
 302      }
 303 
 304     /**
 305      * This function builds a row  as a <code>CachedRowSet</code> object
 306      * which has been resolved and is ready to be synchrinized to the datasource
 307      *
 308      * @throws SQLException if there is problem in building
 309      *         the metadata of the row.
 310      **/
 311      private CachedRowSet buildCachedRow() throws SQLException {
 312        int iColCount;
 313        CachedRowSetImpl crsRow = new CachedRowSetImpl();
 314 
 315        RowSetMetaDataImpl rsmd = new RowSetMetaDataImpl();
 316        RowSetMetaDataImpl rsmdWrite = (RowSetMetaDataImpl)crsSync.getMetaData();
 317        RowSetMetaDataImpl rsmdRow = new RowSetMetaDataImpl();
 318 
 319        iColCount = rsmdWrite.getColumnCount();
 320        rsmdRow.setColumnCount(iColCount);
 321 
 322        for(int i =1;i<=iColCount;i++) {
 323           rsmdRow.setColumnType(i,rsmdWrite.getColumnType(i));
 324           rsmdRow.setColumnName(i,rsmdWrite.getColumnName(i));
 325           rsmdRow.setNullable(i,ResultSetMetaData.columnNullableUnknown);
 326 
 327           try {
 328              rsmdRow.setCatalogName(i, rsmdWrite.getCatalogName(i));
 329              rsmdRow.setSchemaName(i, rsmdWrite.getSchemaName(i));
 330           } catch(SQLException e) {
 331                e.printStackTrace();
 332           }
 333         } //end for
 334 
 335        crsRow.setMetaData(rsmdRow);
 336 
 337        crsRow.moveToInsertRow();
 338 
 339        for(int col=1;col<=crsSync.getMetaData().getColumnCount();col++) {
 340            crsRow.updateObject(col, crsSync.getObject(col));
 341        }
 342 
 343        crsRow.insertRow();
 344        crsRow.moveToCurrentRow();
 345 
 346        crsRow.absolute(1);
 347        crsRow.setOriginalRow();
 348 
 349       try {
 350           crsRow.setUrl(crsSync.getUrl());
 351       } catch(SQLException sqle) {
 352 
 353       }
 354 
 355       try {
 356           crsRow.setDataSourceName(crsSync.getCommand());
 357        } catch(SQLException sqle) {
 358 
 359        }
 360 
 361        try {
 362            if(crsSync.getTableName()!= null){
 363               crsRow.setTableName(crsSync.getTableName());
 364            }
 365         } catch(SQLException sqle) {
 366 
 367         }
 368 
 369        try {
 370             if(crsSync.getCommand() != null)
 371                 crsRow.setCommand(crsSync.getCommand());
 372        } catch(SQLException sqle) {
 373 
 374        }
 375 
 376        try {
 377             crsRow.setKeyColumns(crsSync.getKeyColumns());
 378        } catch(SQLException sqle) {
 379 
 380        }
 381        return crsRow;
 382     }
 383 
 384 
 385 
 386     /**
 387      * Sets <i>obj</i> as the value in column <i>columnName</i> in the current row of the
 388      * <code>RowSet</code> object. This value is the resolved value that is to be
 389      * persisted in the data source.
 390      *
 391      * @param columnName a <code>String</code> object giving the name of the column
 392      *        into which to set the value to be persisted
 393      * @param obj an <code>Object</code> that is the value to be set in the data source
 394      */
 395     public void setResolvedValue(String columnName, Object obj) throws SQLException {
 396        // modify method to throw SQLException in spec
 397        // %%% Missing implementation!
 398     }
 399 
 400     /**
 401      * This function is package private,
 402      * i.e. cannot be accesses outside this package.
 403      * This is used to set the actual CachedRowSet
 404      * which is being synchronized to the database
 405      **/
 406    void setCachedRowSet(CachedRowSet crs) {
 407            crsSync = (CachedRowSetImpl)crs;
 408     }
 409 
 410     /**
 411      * This function is package private,
 412      * i.e. cannot be accesses outside this package.
 413      * This is used to set the CachedRowSet formed
 414      * with conflict values.
 415      **/
 416     void setCachedRowSetResolver(CachedRowSet crs){
 417          try {
 418               crsRes = (CachedRowSetImpl)crs;
 419               crsRes.afterLast();
 420               sz = crsRes.size();
 421          } catch (SQLException sqle) {
 422             // do nothing
 423          }
 424     }
 425 
 426     /**
 427      * This function is package private,
 428      * i.e. cannot be accesses outside this package.
 429      * This is used to set the status of each row
 430      * to either of the values SyncResolver.*_CONFLICT
 431      **/
 432     @SuppressWarnings("rawtypes")
 433     void setStatus(ArrayList status){
 434              stats = status;
 435     }
 436 
 437     /**
 438      * This function is package private,
 439      * i.e. cannot be accesses outside this package.
 440      * This is used to set the handle to the writer object
 441      * which will write the resolved values back to datasource
 442      **/
 443     void setCachedRowSetWriter(CachedRowSetWriter CRWriter) {
 444          crw = CRWriter;
 445     }
 446 
 447     /**
 448      * Moves the cursor down one row from its current position. A <code>SyncResolver</code>
 449      * cursor is initially positioned before the first conflict row; the first call to the
 450      * method <code>nextConflict()</code> makes the first conflict row the current row;
 451      * the second call makes the second conflict row the current row, and so on.
 452      * <p>
 453      * If an input stream is open for the current row, a call to the method next will
 454      * implicitly close it. A <code>SyncResolver</code> object's warning chain is cleared
 455      * when a new row
 456      *
 457      * @return true if the new current row is valid; false if there are no more rows
 458      * @throws SQLException if a database access occurs
 459      *
 460      */
 461     public boolean nextConflict() throws SQLException {
 462         /**
 463           * The next() method will hop from
 464           * one conflict to another
 465           *
 466           * Internally do a crs.next() until
 467           * next conflict.
 468           **/
 469       boolean bool = false;
 470 
 471       crsSync.setShowDeleted(true);
 472       while(crsSync.next()) {
 473            crsRes.previous();
 474            rowStatus++;  //sz--;
 475 
 476           if((rowStatus-1) >= stats.size()) {
 477              bool = false;
 478              break;
 479           }
 480 
 481           if(((Integer)stats.get(rowStatus-1)).intValue() == SyncResolver.NO_ROW_CONFLICT) {
 482               // do nothing
 483               // bool remains as false
 484              ;
 485            } else {
 486              bool = true;
 487              break;
 488            } //end if
 489 
 490       } //end while
 491 
 492         crsSync.setShowDeleted(false);
 493         return bool;
 494    } // end next() method
 495 
 496 
 497     /**
 498      * Moves the cursor to the previous conflict row in this <code>SyncResolver</code> object.
 499      *
 500      * @return <code>true</code> if the cursor is on a valid row; <code>false</code>
 501      *     if it is off the result set
 502      * @throws SQLException if a database access error occurs or the result set type
 503      *     is TYPE_FORWARD_ONLY
 504      */
 505    public boolean previousConflict() throws SQLException {
 506        throw new UnsupportedOperationException();
 507    }
 508 
 509     //-----------------------------------------------------------------------
 510     // Properties
 511     //-----------------------------------------------------------------------
 512 
 513     /**
 514      * Sets this <code>CachedRowSetImpl</code> object's command property
 515      * to the given <code>String</code> object and clears the parameters,
 516      * if any, that were set for the previous command.
 517      * <P>
 518      * The command property may not be needed
 519      * if the rowset is produced by a data source, such as a spreadsheet,
 520      * that does not support commands. Thus, this property is optional
 521      * and may be <code>null</code>.
 522      *
 523      * @param cmd a <code>String</code> object containing an SQL query
 524      *            that will be set as the command; may be <code>null</code>
 525      * @throws SQLException if an error occurs
 526      */
 527     public void setCommand(String cmd) throws SQLException {
 528          throw new UnsupportedOperationException();
 529     }
 530 
 531 
 532     //---------------------------------------------------------------------
 533     // Reading and writing data
 534     //---------------------------------------------------------------------
 535 
 536     /**
 537      * Populates this <code>CachedRowSetImpl</code> object with data from
 538      * the given <code>ResultSet</code> object.  This
 539      * method is an alternative to the method <code>execute</code>
 540      * for filling the rowset with data.  The method <code>populate</code>
 541      * does not require that the properties needed by the method
 542      * <code>execute</code>, such as the <code>command</code> property,
 543      * be set. This is true because the method <code>populate</code>
 544      * is given the <code>ResultSet</code> object from
 545      * which to get data and thus does not need to use the properties
 546      * required for setting up a connection and executing this
 547      * <code>CachedRowSetImpl</code> object's command.
 548      * <P>
 549      * After populating this rowset with data, the method
 550      * <code>populate</code> sets the rowset's metadata and
 551      * then sends a <code>RowSetChangedEvent</code> object
 552      * to all registered listeners prior to returning.
 553      *
 554      * @param data the <code>ResultSet</code> object containing the data
 555      *             to be read into this <code>CachedRowSetImpl</code> object
 556      * @throws SQLException if an error occurs; or the max row setting is
 557      *          violated while populating the RowSet
 558      * @see #execute
 559      */
 560     public void populate(ResultSet data) throws SQLException {
 561          throw new UnsupportedOperationException();
 562     }
 563 
 564     /**
 565      * Populates this <code>CachedRowSetImpl</code> object with data,
 566      * using the given connection to produce the result set from
 567      * which data will be read.  A second form of this method,
 568      * which takes no arguments, uses the values from this rowset's
 569      * user, password, and either url or data source properties to
 570      * create a new database connection. The form of <code>execute</code>
 571      * that is given a connection ignores these properties.
 572      *
 573      * @param conn A standard JDBC <code>Connection</code> object that this
 574      * <code>CachedRowSet</code> object can pass to a synchronization provider
 575      * to establish a connection to the data source
 576      * @throws SQLException if an invalid <code>Connection</code> is supplied
 577      *           or an error occurs in establishing the connection to the
 578      *           data source
 579      * @see #populate
 580      * @see java.sql.Connection
 581      */
 582     public void execute(Connection conn) throws SQLException {
 583         throw new UnsupportedOperationException();
 584     }
 585 
 586     /**
 587      * Propagates all row update, insert, and delete changes to the
 588      * underlying data source backing this <code>CachedRowSetImpl</code>
 589      * object.
 590      * <P>
 591      * <b>Note</b>In the reference implementation an optimistic concurrency implementation
 592      * is provided as a sample implementation of a the <code>SyncProvider</code>
 593      * abstract class.
 594      * <P>
 595      * This method fails if any of the updates cannot be propagated back
 596      * to the data source.  When it fails, the caller can assume that
 597      * none of the updates are reflected in the data source.
 598      * When an exception is thrown, the current row
 599      * is set to the first "updated" row that resulted in an exception
 600      * unless the row that caused the exception is a "deleted" row.
 601      * In that case, when deleted rows are not shown, which is usually true,
 602      * the current row is not affected.
 603      * <P>
 604      * If no <code>SyncProvider</code> is configured, the reference implementation
 605      * leverages the <code>RIOptimisticProvider</code> available which provides the
 606      * default and reference synchronization capabilities for disconnected
 607      * <code>RowSets</code>.
 608      *
 609      * @throws SQLException if the cursor is on the insert row or the underlying
 610      *          reference synchronization provider fails to commit the updates
 611      *          to the datasource
 612      * @throws SyncProviderException if an internal error occurs within the
 613      *          <code>SyncProvider</code> instance during either during the
 614      *          process or at any time when the <code>SyncProvider</code>
 615      *          instance touches the data source.
 616      * @see #acceptChanges(java.sql.Connection)
 617      * @see javax.sql.RowSetWriter
 618      * @see javax.sql.rowset.spi.SyncProvider
 619      */
 620     public void acceptChanges() throws SyncProviderException {
 621         throw new UnsupportedOperationException();
 622     }
 623 
 624     /**
 625      * Propagates all row update, insert, and delete changes to the
 626      * data source backing this <code>CachedRowSetImpl</code> object
 627      * using the given <code>Connection</code> object.
 628      * <P>
 629      * The reference implementation <code>RIOptimisticProvider</code>
 630      * modifies its synchronization to a write back function given
 631      * the updated connection
 632      * The reference implementation modifies its synchronization behaviour
 633      * via the <code>SyncProvider</code> to ensure the synchronization
 634      * occurs according to the updated JDBC <code>Connection</code>
 635      * properties.
 636      *
 637      * @param con a standard JDBC <code>Connection</code> object
 638      * @throws SQLException if the cursor is on the insert row or the underlying
 639      *                   synchronization provider fails to commit the updates
 640      *                   back to the data source
 641      * @see #acceptChanges
 642      * @see javax.sql.RowSetWriter
 643      * @see javax.sql.rowset.spi.SyncFactory
 644      * @see javax.sql.rowset.spi.SyncProvider
 645      */
 646     public void acceptChanges(Connection con) throws SyncProviderException{
 647      throw new UnsupportedOperationException();
 648     }
 649 
 650     /**
 651      * Restores this <code>CachedRowSetImpl</code> object to its original state,
 652      * that is, its state before the last set of changes.
 653      * <P>
 654      * Before returning, this method moves the cursor before the first row
 655      * and sends a <code>rowSetChanged</code> event to all registered
 656      * listeners.
 657      * @throws SQLException if an error is occurs rolling back the RowSet
 658      *           state to the definied original value.
 659      * @see javax.sql.RowSetListener#rowSetChanged
 660      */
 661     public void restoreOriginal() throws SQLException {
 662         throw new UnsupportedOperationException();
 663     }
 664 
 665     /**
 666      * Releases the current contents of this <code>CachedRowSetImpl</code>
 667      * object and sends a <code>rowSetChanged</code> event object to all
 668      * registered listeners.
 669      *
 670      * @throws SQLException if an error occurs flushing the contents of
 671      *           RowSet.
 672      * @see javax.sql.RowSetListener#rowSetChanged
 673      */
 674     public void release() throws SQLException {
 675         throw new UnsupportedOperationException();
 676     }
 677 
 678     /**
 679      * Cancels deletion of the current row and notifies listeners that
 680      * a row has changed.
 681      * <P>
 682      * Note:  This method can be ignored if deleted rows are not being shown,
 683      * which is the normal case.
 684      *
 685      * @throws SQLException if the cursor is not on a valid row
 686      */
 687     public void undoDelete() throws SQLException {
 688         throw new UnsupportedOperationException();
 689     }
 690 
 691     /**
 692      * Immediately removes the current row from this
 693      * <code>CachedRowSetImpl</code> object if the row has been inserted, and
 694      * also notifies listeners the a row has changed.  An exception is thrown
 695      * if the row is not a row that has been inserted or the cursor is before
 696      * the first row, after the last row, or on the insert row.
 697      * <P>
 698      * This operation cannot be undone.
 699      *
 700      * @throws SQLException if an error occurs,
 701      *                         the cursor is not on a valid row,
 702      *                         or the row has not been inserted
 703      */
 704     public void undoInsert() throws SQLException {
 705         throw new UnsupportedOperationException();
 706     }
 707 
 708     /**
 709      * Immediately reverses the last update operation if the
 710      * row has been modified. This method can be
 711      * called to reverse updates on a all columns until all updates in a row have
 712      * been rolled back to their originating state since the last synchronization
 713      * (<code>acceptChanges</code>) or population. This method may also be called
 714      * while performing updates to the insert row.
 715      * <P>
 716      * <code>undoUpdate</code may be called at any time during the life-time of a
 717      * rowset, however after a synchronization has occurs this method has no
 718      * affect until further modification to the RowSet data occurs.
 719      *
 720      * @throws SQLException if cursor is before the first row, after the last
 721      *     row in rowset.
 722      * @see #undoDelete
 723      * @see #undoInsert
 724      * @see java.sql.ResultSet#cancelRowUpdates
 725      */
 726     public void undoUpdate() throws SQLException {
 727         throw new UnsupportedOperationException();
 728 
 729     }
 730 
 731     //--------------------------------------------------------------------
 732     // Views
 733     //--------------------------------------------------------------------
 734 
 735     /**
 736      * Returns a new <code>RowSet</code> object backed by the same data as
 737      * that of this <code>CachedRowSetImpl</code> object and sharing a set of cursors
 738      * with it. This allows cursors to interate over a shared set of rows, providing
 739      * multiple views of the underlying data.
 740      *
 741      * @return a <code>RowSet</code> object that is a copy of this <code>CachedRowSetImpl</code>
 742      * object and shares a set of cursors with it
 743      * @throws SQLException if an error occurs or cloning is
 744      *                         not supported
 745      * @see javax.sql.RowSetEvent
 746      * @see javax.sql.RowSetListener
 747      */
 748     public RowSet createShared() throws SQLException {
 749         throw new UnsupportedOperationException();
 750     }
 751 
 752     /**
 753      * Returns a new <code>RowSet</code> object containing by the same data
 754      * as this <code>CachedRowSetImpl</code> object.  This method
 755      * differs from the method <code>createCopy</code> in that it throws a
 756      * <code>CloneNotSupportedException</code> object instead of an
 757      * <code>SQLException</code> object, as the method <code>createShared</code>
 758      * does.  This <code>clone</code>
 759      * method is called internally by the method <code>createShared</code>,
 760      * which catches the <code>CloneNotSupportedException</code> object
 761      * and in turn throws a new <code>SQLException</code> object.
 762      *
 763      * @return a copy of this <code>CachedRowSetImpl</code> object
 764      * @throws CloneNotSupportedException if an error occurs when
 765      * attempting to clone this <code>CachedRowSetImpl</code> object
 766      * @see #createShared
 767      */
 768     protected Object clone() throws CloneNotSupportedException  {
 769        throw new UnsupportedOperationException();
 770     }
 771 
 772     /**
 773      * Creates a <code>RowSet</code> object that is a deep copy of
 774      * this <code>CachedRowSetImpl</code> object's data, including
 775      * constraints.  Updates made
 776      * on a copy are not visible to the original rowset;
 777      * a copy of a rowset is completely independent from the original.
 778      * <P>
 779      * Making a copy saves the cost of creating an identical rowset
 780      * from first principles, which can be quite expensive.
 781      * For example, it can eliminate the need to query a
 782      * remote database server.
 783      * @return a new <code>CachedRowSet</code> object that is a deep copy
 784      *           of this <code>CachedRowSet</code> object and is
 785      *           completely independent from this <code>CachedRowSetImpl</code>
 786      *           object.
 787      * @throws SQLException if an error occurs in generating the copy of this
 788      *           of the <code>CachedRowSetImpl</code>
 789      * @see #createShared
 790      * @see javax.sql.RowSetEvent
 791      * @see javax.sql.RowSetListener
 792      */
 793     public CachedRowSet createCopy() throws SQLException {
 794         throw new UnsupportedOperationException();
 795     }
 796 
 797     /**
 798      * Creates a <code>RowSet</code> object that is a copy of
 799      * this <code>CachedRowSetImpl</code> object's table structure
 800      * and the constraints only.
 801      * There will be no data in the object being returned.
 802      * Updates made on a copy are not visible to the original rowset.
 803      * <P>
 804      * This helps in getting the underlying XML schema which can
 805      * be used as the basis for populating a <code>WebRowSet</code>.
 806      *
 807      * @return a new <code>CachedRowSet</code> object that is a copy
 808      * of this <code>CachedRowSetImpl</code> object's schema and
 809      * retains all the constraints on the original rowset but contains
 810      * no data
 811      * @throws SQLException if an error occurs in generating the copy
 812      * of the <code>CachedRowSet</code> object
 813      * @see #createShared
 814      * @see #createCopy
 815      * @see #createCopyNoConstraints
 816      * @see javax.sql.RowSetEvent
 817      * @see javax.sql.RowSetListener
 818      */
 819     public CachedRowSet createCopySchema() throws SQLException {
 820         throw new UnsupportedOperationException();
 821     }
 822 
 823     /**
 824      * Creates a <code>CachedRowSet</code> object that is a copy of
 825      * this <code>CachedRowSetImpl</code> object's data only.
 826      * All constraints set in this object will not be there
 827      * in the returning object.  Updates made
 828      * on a copy are not visible to the original rowset.
 829      *
 830      * @return a new <code>CachedRowSet</code> object that is a deep copy
 831      * of this <code>CachedRowSetImpl</code> object and is
 832      * completely independent from this <code>CachedRowSetImpl</code> object
 833      * @throws SQLException if an error occurs in generating the copy of the
 834      * of the <code>CachedRowSet</code>
 835      * @see #createShared
 836      * @see #createCopy
 837      * @see #createCopySchema
 838      * @see javax.sql.RowSetEvent
 839      * @see javax.sql.RowSetListener
 840      */
 841     public CachedRowSet createCopyNoConstraints() throws SQLException {
 842         throw new UnsupportedOperationException();
 843     }
 844 
 845     /**
 846      * Converts this <code>CachedRowSetImpl</code> object to a collection
 847      * of tables. The sample implementation utilitizes the <code>TreeMap</code>
 848      * collection type.
 849      * This class guarantees that the map will be in ascending key order,
 850      * sorted according to the natural order for the key's class.
 851      *
 852      * @return a <code>Collection</code> object consisting of tables,
 853      *         each of which is a copy of a row in this
 854      *         <code>CachedRowSetImpl</code> object
 855      * @throws SQLException if an error occurs in generating the collection
 856      * @see #toCollection(int)
 857      * @see #toCollection(String)
 858      * @see java.util.TreeMap
 859      */
 860     @SuppressWarnings("rawtypes")
 861     public Collection toCollection() throws SQLException {
 862        throw new UnsupportedOperationException();
 863     }
 864 
 865     /**
 866      * Returns the specified column of this <code>CachedRowSetImpl</code> object
 867      * as a <code>Collection</code> object.  This method makes a copy of the
 868      * column's data and utilitizes the <code>Vector</code> to establish the
 869      * collection. The <code>Vector</code> class implements a growable array
 870      * objects allowing the individual components to be accessed using an
 871      * an integer index similar to that of an array.
 872      *
 873      * @return a <code>Collection</code> object that contains the value(s)
 874      *         stored in the specified column of this
 875      *         <code>CachedRowSetImpl</code>
 876      *         object
 877      * @throws SQLException if an error occurs generated the collection; or
 878      *          an invalid column is provided.
 879      * @see #toCollection()
 880      * @see #toCollection(String)
 881      * @see java.util.Vector
 882      */
 883     @SuppressWarnings("rawtypes")
 884     public Collection toCollection(int column) throws SQLException {
 885        throw new UnsupportedOperationException();
 886     }
 887 
 888     /**
 889      * Returns the specified column of this <code>CachedRowSetImpl</code> object
 890      * as a <code>Collection</code> object.  This method makes a copy of the
 891      * column's data and utilitizes the <code>Vector</code> to establish the
 892      * collection. The <code>Vector</code> class implements a growable array
 893      * objects allowing the individual components to be accessed using an
 894      * an integer index similar to that of an array.
 895      *
 896      * @return a <code>Collection</code> object that contains the value(s)
 897      *         stored in the specified column of this
 898      *         <code>CachedRowSetImpl</code>
 899      *         object
 900      * @throws SQLException if an error occurs generated the collection; or
 901      *          an invalid column is provided.
 902      * @see #toCollection()
 903      * @see #toCollection(int)
 904      * @see java.util.Vector
 905      */
 906     @SuppressWarnings("rawtypes")
 907     public Collection toCollection(String column) throws SQLException {
 908         throw new UnsupportedOperationException();
 909     }
 910 
 911     //--------------------------------------------------------------------
 912     // Advanced features
 913     //--------------------------------------------------------------------
 914 
 915 
 916     /**
 917      * Returns the <code>SyncProvider</code> implementation being used
 918      * with this <code>CachedRowSetImpl</code> implementation rowset.
 919      *
 920      * @return the SyncProvider used by the rowset. If not provider was
 921      *          set when the rowset was instantiated, the reference
 922      *          implementation (default) provider is returned.
 923      * @throws SQLException if error occurs while return the
 924      *          <code>SyncProvider</code> instance.
 925      */
 926     public SyncProvider getSyncProvider() throws SQLException {
 927       throw new UnsupportedOperationException();
 928     }
 929 
 930     /**
 931      * Sets the active <code>SyncProvider</code> and attempts to load
 932      * load the new provider using the <code>SyncFactory</code> SPI.
 933      *
 934      * @throws SQLException if an error occurs while resetting the
 935      *          <code>SyncProvider</code>.
 936      */
 937     public void setSyncProvider(String providerStr) throws SQLException {
 938         throw new UnsupportedOperationException();
 939     }
 940 
 941 
 942     //-----------------
 943     // methods inherited from RowSet
 944     //-----------------
 945 
 946 
 947 
 948 
 949 
 950 
 951     //---------------------------------------------------------------------
 952     // Reading and writing data
 953     //---------------------------------------------------------------------
 954 
 955     /**
 956      * Populates this <code>CachedRowSetImpl</code> object with data.
 957      * This form of the method uses the rowset's user, password, and url or
 958      * data source name properties to create a database
 959      * connection.  If properties that are needed
 960      * have not been set, this method will throw an exception.
 961      * <P>
 962      * Another form of this method uses an existing JDBC <code>Connection</code>
 963      * object instead of creating a new one; therefore, it ignores the
 964      * properties used for establishing a new connection.
 965      * <P>
 966      * The query specified by the command property is executed to create a
 967      * <code>ResultSet</code> object from which to retrieve data.
 968      * The current contents of the rowset are discarded, and the
 969      * rowset's metadata is also (re)set.  If there are outstanding updates,
 970      * they are also ignored.
 971      * <P>
 972      * The method <code>execute</code> closes any database connections that it
 973      * creates.
 974      *
 975      * @throws SQLException if an error occurs or the
 976      *                         necessary properties have not been set
 977      */
 978     public void execute() throws SQLException {
 979         throw new UnsupportedOperationException();
 980     }
 981 
 982 
 983 
 984     //-----------------------------------
 985     // Methods inherited from ResultSet
 986     //-----------------------------------
 987 
 988     /**
 989      * Moves the cursor down one row from its current position and
 990      * returns <code>true</code> if the new cursor position is a
 991      * valid row.
 992      * The cursor for a new <code>ResultSet</code> object is initially
 993      * positioned before the first row. The first call to the method
 994      * <code>next</code> moves the cursor to the first row, making it
 995      * the current row; the second call makes the second row the
 996      * current row, and so on.
 997      *
 998      * <P>If an input stream from the previous row is open, it is
 999      * implicitly closed. The <code>ResultSet</code> object's warning
1000      * chain is cleared when a new row is read.
1001      *
1002      * @return <code>true</code> if the new current row is valid;
1003      *         <code>false</code> if there are no more rows
1004      * @throws SQLException if an error occurs or
1005      *            the cursor is not positioned in the rowset, before
1006      *            the first row, or after the last row
1007      */
1008     public boolean next() throws SQLException {
1009        throw new UnsupportedOperationException();
1010     }
1011 
1012     /**
1013      * Moves this <code>CachedRowSetImpl</code> object's cursor to the next
1014      * row and returns <code>true</code> if the cursor is still in the rowset;
1015      * returns <code>false</code> if the cursor has moved to the position after
1016      * the last row.
1017      * <P>
1018      * This method handles the cases where the cursor moves to a row that
1019      * has been deleted.
1020      * If this rowset shows deleted rows and the cursor moves to a row
1021      * that has been deleted, this method moves the cursor to the next
1022      * row until the cursor is on a row that has not been deleted.
1023      * <P>
1024      * The method <code>internalNext</code> is called by methods such as
1025      * <code>next</code>, <code>absolute</code>, and <code>relative</code>,
1026      * and, as its name implies, is only called internally.
1027      * <p>
1028      * This is a implementation only method and is not required as a standard
1029      * implementation of the <code>CachedRowSet</code> interface.
1030      *
1031      * @return <code>true</code> if the cursor is on a valid row in this
1032      *         rowset; <code>false</code> if it is after the last row
1033      * @throws SQLException if an error occurs
1034      */
1035     protected boolean internalNext() throws SQLException {
1036         throw new UnsupportedOperationException();
1037     }
1038 
1039     /**
1040      * Closes this <code>CachedRowSetImpl</code> objecy and releases any resources
1041      * it was using.
1042      *
1043      * @throws SQLException if an error occurs when releasing any resources in use
1044      * by this <code>CachedRowSetImpl</code> object
1045      */
1046     public void close() throws SQLException {
1047         throw new UnsupportedOperationException();
1048     }
1049 
1050     /**
1051      * Reports whether the last column read was SQL <code>NULL</code>.
1052      * Note that you must first call the method <code>getXXX</code>
1053      * on a column to try to read its value and then call the method
1054      * <code>wasNull</code> to determine whether the value was
1055      * SQL <code>NULL</code>.
1056      *
1057      * @return <code>true</code> if the value in the last column read
1058      *         was SQL <code>NULL</code>; <code>false</code> otherwise
1059      * @throws SQLException if an error occurs
1060      */
1061     public boolean wasNull() throws SQLException {
1062         throw new UnsupportedOperationException();
1063     }
1064 
1065     /**
1066      * Returns the insert row or the current row of this
1067      * <code>CachedRowSetImpl</code>object.
1068      *
1069      * @return the <code>Row</code> object on which this <code>CachedRowSetImpl</code>
1070      * objects's cursor is positioned
1071      */
1072     protected BaseRow getCurrentRow() {
1073         throw new UnsupportedOperationException();
1074     }
1075 
1076     /**
1077      * Removes the row on which the cursor is positioned.
1078      * <p>
1079      * This is a implementation only method and is not required as a standard
1080      * implementation of the <code>CachedRowSet</code> interface.
1081      *
1082      * @throws SQLException if the cursor is positioned on the insert
1083      *            row
1084      */
1085     protected void removeCurrentRow() {
1086         throw new UnsupportedOperationException();
1087     }
1088 
1089 
1090     /**
1091      * Retrieves the value of the designated column in the current row
1092      * of this <code>CachedRowSetImpl</code> object as a
1093      * <code>String</code> object.
1094      *
1095      * @param columnIndex the first column is <code>1</code>, the second
1096      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1097      *        and equal to or less than the number of columns in the rowset
1098      * @return the column value; if the value is SQL <code>NULL</code>, the
1099      *         result is <code>null</code>
1100      * @throws SQLException if (1) the given column index is out of bounds,
1101      * (2) the cursor is not on one of this rowset's rows or its
1102      * insert row, or (3) the designated column does not store an
1103      * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
1104      * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, <b>CHAR</b>, <b>VARCHAR</b></code>
1105      * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1106      * recommended return type.
1107      */
1108     public String getString(int columnIndex) throws SQLException {
1109         throw new UnsupportedOperationException();
1110     }
1111 
1112     /**
1113      * Retrieves the value of the designated column in the current row
1114      * of this <code>CachedRowSetImpl</code> object as a
1115      * <code>boolean</code> value.
1116      *
1117      * @param columnIndex the first column is <code>1</code>, the second
1118      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1119      *        and equal to or less than the number of columns in the rowset
1120      * @return the column value as a <code>boolean</code> in the Java progamming language;
1121      *        if the value is SQL <code>NULL</code>, the result is <code>false</code>
1122      * @throws SQLException if (1) the given column index is out of bounds,
1123      *            (2) the cursor is not on one of this rowset's rows or its
1124      *            insert row, or (3) the designated column does not store an
1125      *            SQL <code>BOOLEAN</code> value
1126      * @see #getBoolean(String)
1127      */
1128     public boolean getBoolean(int columnIndex) throws SQLException {
1129         throw new UnsupportedOperationException();
1130     }
1131 
1132     /**
1133      * Retrieves the value of the designated column in the current row
1134      * of this <code>CachedRowSetImpl</code> object as a
1135      * <code>byte</code> value.
1136      *
1137      * @param columnIndex the first column is <code>1</code>, the second
1138      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1139      *        and equal to or less than the number of columns in the rowset
1140      * @return the column value as a <code>byte</code> in the Java programming
1141      * language; if the value is SQL <code>NULL</code>, the result is <code>0</code>
1142      * @throws SQLException if (1) the given column index is out of bounds,
1143      *            (2) the cursor is not on one of this rowset's rows or its
1144      *            insert row, or (3) the designated column does not store an
1145      *            SQL <code><b>TINYINT</b>, SMALLINT, INTEGER, BIGINT, REAL,
1146      *            FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1147      *            or <code>LONGVARCHAR</code> value. The bold SQL type
1148      *            designates the recommended return type.
1149      * @see #getByte(String)
1150      */
1151     public byte getByte(int columnIndex) throws SQLException {
1152         throw new UnsupportedOperationException();
1153     }
1154 
1155     /**
1156      * Retrieves the value of the designated column in the current row
1157      * of this <code>CachedRowSetImpl</code> object as a
1158      * <code>short</code> value.
1159      *
1160      * @param columnIndex the first column is <code>1</code>, the second
1161      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1162      *        and equal to or less than the number of columns in the rowset
1163      * @return the column value; if the value is SQL <code>NULL</code>, the
1164      *         result is <code>0</code>
1165      * @throws SQLException if (1) the given column index is out of bounds,
1166      * (2) the cursor is not on one of this rowset's rows or its
1167      * insert row, or (3) the designated column does not store an
1168      * SQL <code>TINYINT, <b>SMALLINT</b>, INTEGER, BIGINT, REAL
1169      * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1170      * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1171      * recommended return type.
1172      * @see #getShort(String)
1173      */
1174     public short getShort(int columnIndex) throws SQLException {
1175         throw new UnsupportedOperationException();
1176     }
1177 
1178     /**
1179      * Retrieves the value of the designated column in the current row
1180      * of this <code>CachedRowSetImpl</code> object as an
1181      * <code>int</code> value.
1182      *
1183      * @param columnIndex the first column is <code>1</code>, the second
1184      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1185      *        and equal to or less than the number of columns in the rowset
1186      * @return the column value; if the value is SQL <code>NULL</code>, the
1187      *         result is <code>0</code>
1188      * @throws SQLException if (1) the given column index is out of bounds,
1189      * (2) the cursor is not on one of this rowset's rows or its
1190      * insert row, or (3) the designated column does not store an
1191      * SQL <code>TINYINT, SMALLINT, <b>INTEGER</b>, BIGINT, REAL
1192      * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1193      * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1194      * recommended return type.
1195      */
1196     public int getInt(int columnIndex) throws SQLException {
1197         throw new UnsupportedOperationException();
1198     }
1199 
1200     /**
1201      * Retrieves the value of the designated column in the current row
1202      * of this <code>CachedRowSetImpl</code> object as a
1203      * <code>long</code> value.
1204      *
1205      * @param columnIndex the first column is <code>1</code>, the second
1206      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1207      *        and equal to or less than the number of columns in the rowset
1208      * @return the column value; if the value is SQL <code>NULL</code>, the
1209      *         result is <code>0</code>
1210      * @throws SQLException if (1) the given column index is out of bounds,
1211      * (2) the cursor is not on one of this rowset's rows or its
1212      * insert row, or (3) the designated column does not store an
1213      * SQL <code>TINYINT, SMALLINT, INTEGER, <b>BIGINT</b>, REAL
1214      * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1215      * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1216      * recommended return type.
1217      * @see #getLong(String)
1218      */
1219     public long getLong(int columnIndex) throws SQLException {
1220         throw new UnsupportedOperationException();
1221     }
1222 
1223     /**
1224      * Retrieves the value of the designated column in the current row
1225      * of this <code>CachedRowSetImpl</code> object as a
1226      * <code>float</code> value.
1227      *
1228      * @param columnIndex the first column is <code>1</code>, the second
1229      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1230      *        and equal to or less than the number of columns in the rowset
1231      * @return the column value; if the value is SQL <code>NULL</code>, the
1232      *         result is <code>0</code>
1233      * @throws SQLException if (1) the given column index is out of bounds,
1234      * (2) the cursor is not on one of this rowset's rows or its
1235      * insert row, or (3) the designated column does not store an
1236      * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, <b>REAL</b>,
1237      * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1238      * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1239      * recommended return type.
1240      * @see #getFloat(String)
1241      */
1242     public float getFloat(int columnIndex) throws SQLException {
1243         throw new UnsupportedOperationException();
1244     }
1245 
1246     /**
1247      * Retrieves the value of the designated column in the current row
1248      * of this <code>CachedRowSetImpl</code> object as a
1249      * <code>double</code> value.
1250      *
1251      * @param columnIndex the first column is <code>1</code>, the second
1252      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1253      *        and equal to or less than the number of columns in the rowset
1254      * @return the column value; if the value is SQL <code>NULL</code>, the
1255      *         result is <code>0</code>
1256      * @throws SQLException if (1) the given column index is out of bounds,
1257      * (2) the cursor is not on one of this rowset's rows or its
1258      * insert row, or (3) the designated column does not store an
1259      * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
1260      * <b>FLOAT</b>, <b>DOUBLE</b>, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1261      * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1262      * recommended return type.
1263      * @see #getDouble(String)
1264      *
1265      */
1266     public double getDouble(int columnIndex) throws SQLException {
1267         throw new UnsupportedOperationException();
1268     }
1269 
1270     /**
1271      * Retrieves the value of the designated column in the current row
1272      * of this <code>CachedRowSetImpl</code> object as a
1273      * <code>java.math.BigDecimal</code> object.
1274      * <P>
1275      * This method is deprecated; use the version of <code>getBigDecimal</code>
1276      * that does not take a scale parameter and returns a value with full
1277      * precision.
1278      *
1279      * @param columnIndex the first column is <code>1</code>, the second
1280      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1281      *        and equal to or less than the number of columns in the rowset
1282      * @param scale the number of digits to the right of the decimal point in the
1283      *        value returned
1284      * @return the column value with the specified number of digits to the right
1285      *         of the decimal point; if the value is SQL <code>NULL</code>, the
1286      *         result is <code>null</code>
1287      * @throws SQLException if the given column index is out of bounds,
1288      *            the cursor is not on a valid row, or this method fails
1289      * @deprecated
1290      */
1291     @Deprecated
1292     public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
1293        throw new UnsupportedOperationException();
1294     }
1295 
1296     /**
1297      * Retrieves the value of the designated column in the current row
1298      * of this <code>CachedRowSetImpl</code> object as a
1299      * <code>byte</code> array value.
1300      *
1301      * @param columnIndex the first column is <code>1</code>, the second
1302      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1303      *        and equal to or less than the number of columns in the rowset
1304      * @return the column value as a <code>byte</code> array in the Java programming
1305      * language; if the value is SQL <code>NULL</code>, the
1306      * result is <code>null</code>
1307      *
1308      * @throws SQLException if (1) the given column index is out of bounds,
1309      * (2) the cursor is not on one of this rowset's rows or its
1310      * insert row, or (3) the designated column does not store an
1311      * SQL <code><b>BINARY</b>, <b>VARBINARY</b> or
1312      * LONGVARBINARY</code> value.
1313      * The bold SQL type designates the recommended return type.
1314      * @see #getBytes(String)
1315      */
1316     public byte[] getBytes(int columnIndex) throws SQLException {
1317         throw new UnsupportedOperationException();
1318     }
1319 
1320     /**
1321      * Retrieves the value of the designated column in the current row
1322      * of this <code>CachedRowSetImpl</code> object as a
1323      * <code>java.sql.Date</code> object.
1324      *
1325      * @param columnIndex the first column is <code>1</code>, the second
1326      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1327      *        and equal to or less than the number of columns in the rowset
1328      * @return the column value as a <code>java.sql.Data</code> object; if
1329      *        the value is SQL <code>NULL</code>, the
1330      *        result is <code>null</code>
1331      * @throws SQLException if the given column index is out of bounds,
1332      *            the cursor is not on a valid row, or this method fails
1333      */
1334     public java.sql.Date getDate(int columnIndex) throws SQLException {
1335         throw new UnsupportedOperationException();
1336     }
1337 
1338     /**
1339      * Retrieves the value of the designated column in the current row
1340      * of this <code>CachedRowSetImpl</code> object as a
1341      * <code>java.sql.Time</code> object.
1342      *
1343      * @param columnIndex the first column is <code>1</code>, the second
1344      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1345      *        and equal to or less than the number of columns in the rowset
1346      * @return the column value; if the value is SQL <code>NULL</code>, the
1347      *         result is <code>null</code>
1348      * @throws SQLException if the given column index is out of bounds,
1349      *         the cursor is not on a valid row, or this method fails
1350      */
1351     public java.sql.Time getTime(int columnIndex) throws SQLException {
1352         throw new UnsupportedOperationException();
1353     }
1354 
1355     /**
1356      * Retrieves the value of the designated column in the current row
1357      * of this <code>CachedRowSetImpl</code> object as a
1358      * <code>java.sql.Timestamp</code> object.
1359      *
1360      * @param columnIndex the first column is <code>1</code>, the second
1361      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1362      *        and equal to or less than the number of columns in the rowset
1363      * @return the column value; if the value is SQL <code>NULL</code>, the
1364      *         result is <code>null</code>
1365      * @throws SQLException if the given column index is out of bounds,
1366      *            the cursor is not on a valid row, or this method fails
1367      */
1368     public java.sql.Timestamp getTimestamp(int columnIndex) throws SQLException {
1369         throw new UnsupportedOperationException();
1370     }
1371 
1372     /**
1373      * Retrieves the value of the designated column in the current row of this
1374      * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
1375      * object.
1376      *
1377      * A column value can be retrieved as a stream of ASCII characters
1378      * and then read in chunks from the stream.  This method is particularly
1379      * suitable for retrieving large <code>LONGVARCHAR</code> values.  The JDBC
1380      * driver will do any necessary conversion from the database format into ASCII.
1381      *
1382      * <P><B>Note:</B> All the data in the returned stream must be
1383      * read prior to getting the value of any other column. The next
1384      * call to a get method implicitly closes the stream. . Also, a
1385      * stream may return <code>0</code> for <code>CachedRowSetImpl.available()</code>
1386      * whether there is data available or not.
1387      *
1388      * @param columnIndex the first column is <code>1</code>, the second
1389      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1390      *        and equal to or less than the number of columns in this rowset
1391      * @return a Java input stream that delivers the database column value
1392      *         as a stream of one-byte ASCII characters.  If the value is SQL
1393      *         <code>NULL</code>, the result is <code>null</code>.
1394      * @throws SQLException if (1) the given column index is out of bounds,
1395      * (2) the cursor is not on one of this rowset's rows or its
1396      * insert row, or (3) the designated column does not store an
1397      * SQL <code>CHAR, VARCHAR</code>, <code><b>LONGVARCHAR</b></code>
1398      * <code>BINARY, VARBINARY</code> or <code>LONGVARBINARY</code> value. The
1399      * bold SQL type designates the recommended return types that this method is
1400      * used to retrieve.
1401      * @see #getAsciiStream(String)
1402      */
1403     public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException {
1404        throw new UnsupportedOperationException();
1405     }
1406 
1407     /**
1408      * A column value can be retrieved as a stream of Unicode characters
1409      * and then read in chunks from the stream.  This method is particularly
1410      * suitable for retrieving large LONGVARCHAR values.  The JDBC driver will
1411      * do any necessary conversion from the database format into Unicode.
1412      *
1413      * <P><B>Note:</B> All the data in the returned stream must be
1414      * read prior to getting the value of any other column. The next
1415      * call to a get method implicitly closes the stream. . Also, a
1416      * stream may return 0 for available() whether there is data
1417      * available or not.
1418      *
1419      * @param columnIndex the first column is <code>1</code>, the second
1420      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1421      *        and equal to or less than the number of columns in this rowset
1422      * @return a Java input stream that delivers the database column value
1423      * as a stream of two byte Unicode characters.  If the value is SQL NULL
1424      * then the result is null.
1425      * @throws SQLException if an error occurs
1426      * @deprecated
1427      */
1428     @Deprecated
1429     public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException {
1430        throw new UnsupportedOperationException();
1431     }
1432 
1433     /**
1434      * Retrieves the value of the designated column in the current row of this
1435      * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
1436      * object.
1437      * <P>
1438      * A column value can be retrieved as a stream of uninterpreted bytes
1439      * and then read in chunks from the stream.  This method is particularly
1440      * suitable for retrieving large <code>LONGVARBINARY</code> values.
1441      *
1442      * <P><B>Note:</B> All the data in the returned stream must be
1443      * read prior to getting the value of any other column. The next
1444      * call to a get method implicitly closes the stream. Also, a
1445      * stream may return <code>0</code> for
1446      * <code>CachedRowSetImpl.available()</code> whether there is data
1447      * available or not.
1448      *
1449      * @param columnIndex the first column is <code>1</code>, the second
1450      * is <code>2</code>, and so on; must be <code>1</code> or larger
1451      * and equal to or less than the number of columns in the rowset
1452      * @return a Java input stream that delivers the database column value
1453      * as a stream of uninterpreted bytes.  If the value is SQL <code>NULL</code>
1454      * then the result is <code>null</code>.
1455      * @throws SQLException if (1) the given column index is out of bounds,
1456      * (2) the cursor is not on one of this rowset's rows or its
1457      * insert row, or (3) the designated column does not store an
1458      * SQL <code>BINARY, VARBINARY</code> or <code><b>LONGVARBINARY</b></code>
1459      * The bold type indicates the SQL type that this method is recommened
1460      * to retrieve.
1461      * @see #getBinaryStream(String)
1462      */
1463     public java.io.InputStream getBinaryStream(int columnIndex) throws SQLException {
1464        throw new UnsupportedOperationException();
1465 
1466     }
1467 
1468 
1469     //======================================================================
1470     // Methods for accessing results by column name
1471     //======================================================================
1472 
1473     /**
1474      * Retrieves the value stored in the designated column
1475      * of the current row as a <code>String</code> object.
1476      *
1477      * @param columnName a <code>String</code> object giving the SQL name of
1478      *        a column in this <code>CachedRowSetImpl</code> object
1479      * @return the column value; if the value is SQL <code>NULL</code>,
1480      *         the result is <code>null</code>
1481      * @throws SQLException if (1) the given column name is not the name of
1482      * a column in this rowset, (2) the cursor is not on one of
1483      * this rowset's rows or its insert row, or (3) the designated
1484      * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
1485      * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, <b>CHAR</b>,
1486      * <b>VARCHAR</b></code> or <code>LONGVARCHAR<</code> value. The bold SQL type
1487      * designates the recommended return type.
1488      */
1489     public String getString(String columnName) throws SQLException {
1490         throw new UnsupportedOperationException();
1491     }
1492 
1493     /**
1494      * Retrieves the value stored in the designated column
1495      * of the current row as a <code>boolean</code> value.
1496      *
1497      * @param columnName a <code>String</code> object giving the SQL name of
1498      *        a column in this <code>CachedRowSetImpl</code> object
1499      * @return the column value as a <code>boolean</code> in the Java programming
1500      *        language; if the value is SQL <code>NULL</code>,
1501      *        the result is <code>false</code>
1502      * @throws SQLException if (1) the given column name is not the name of
1503      *            a column in this rowset, (2) the cursor is not on one of
1504      *            this rowset's rows or its insert row, or (3) the designated
1505      *            column does not store an SQL <code>BOOLEAN</code> value
1506      * @see #getBoolean(int)
1507      */
1508     public boolean getBoolean(String columnName) throws SQLException {
1509         throw new UnsupportedOperationException();
1510     }
1511 
1512     /**
1513      * Retrieves the value stored in the designated column
1514      * of the current row as a <code>byte</code> value.
1515      *
1516      * @param columnName a <code>String</code> object giving the SQL name of
1517      *        a column in this <code>CachedRowSetImpl</code> object
1518      * @return the column value as a <code>byte</code> in the Java programming
1519      * language; if the value is SQL <code>NULL</code>, the result is <code>0</code>
1520      * @throws SQLException if (1) the given column name is not the name of
1521      * a column in this rowset, (2) the cursor is not on one of
1522      * this rowset's rows or its insert row, or (3) the designated
1523      * column does not store an SQL <code><B>TINYINT</B>, SMALLINT, INTEGER,
1524      * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
1525      * VARCHAR</code> or <code>LONGVARCHAR</code> value. The
1526      * bold type designates the recommended return type
1527      */
1528     public byte getByte(String columnName) throws SQLException {
1529         throw new UnsupportedOperationException();
1530     }
1531 
1532     /**
1533      * Retrieves the value stored in the designated column
1534      * of the current row as a <code>short</code> value.
1535      *
1536      * @param columnName a <code>String</code> object giving the SQL name of
1537      *        a column in this <code>CachedRowSetImpl</code> object
1538      * @return the column value; if the value is SQL <code>NULL</code>,
1539      *         the result is <code>0</code>
1540      * @throws SQLException if (1) the given column name is not the name of
1541      * a column in this rowset, (2) the cursor is not on one of
1542      * this rowset's rows or its insert row, or (3) the designated
1543      * column does not store an SQL <code>TINYINT, <b>SMALLINT</b>, INTEGER
1544      * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
1545      * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
1546      * designates the recommended return type.
1547      * @see #getShort(int)
1548      */
1549     public short getShort(String columnName) throws SQLException {
1550        throw new UnsupportedOperationException();
1551     }
1552 
1553     /**
1554      * Retrieves the value stored in the designated column
1555      * of the current row as an <code>int</code> value.
1556      *
1557      * @param columnName a <code>String</code> object giving the SQL name of
1558      *        a column in this <code>CachedRowSetImpl</code> object
1559      * @return the column value; if the value is SQL <code>NULL</code>,
1560      *         the result is <code>0</code>
1561      * @throws SQLException if (1) the given column name is not the name
1562      * of a column in this rowset,
1563      * (2) the cursor is not on one of this rowset's rows or its
1564      * insert row, or (3) the designated column does not store an
1565      * SQL <code>TINYINT, SMALLINT, <b>INTEGER</b>, BIGINT, REAL
1566      * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1567      * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1568      * recommended return type.
1569      */
1570     public int getInt(String columnName) throws SQLException {
1571         throw new UnsupportedOperationException();
1572     }
1573 
1574     /**
1575      * Retrieves the value stored in the designated column
1576      * of the current row as a <code>long</code> value.
1577      *
1578      * @param columnName a <code>String</code> object giving the SQL name of
1579      *        a column in this <code>CachedRowSetImpl</code> object
1580      * @return the column value; if the value is SQL <code>NULL</code>,
1581      *         the result is <code>0</code>
1582      * @throws SQLException if (1) the given column name is not the name of
1583      * a column in this rowset, (2) the cursor is not on one of
1584      * this rowset's rows or its insert row, or (3) the designated
1585      * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
1586      * <b>BIGINT</b>, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
1587      * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
1588      * designates the recommended return type.
1589      * @see #getLong(int)
1590      */
1591     public long getLong(String columnName) throws SQLException {
1592         throw new UnsupportedOperationException();
1593     }
1594 
1595     /**
1596      * Retrieves the value stored in the designated column
1597      * of the current row as a <code>float</code> value.
1598      *
1599      * @param columnName a <code>String</code> object giving the SQL name of
1600      *        a column in this <code>CachedRowSetImpl</code> object
1601      * @return the column value; if the value is SQL <code>NULL</code>,
1602      *         the result is <code>0</code>
1603      * @throws SQLException if (1) the given column name is not the name of
1604      * a column in this rowset, (2) the cursor is not on one of
1605      * this rowset's rows or its insert row, or (3) the designated
1606      * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
1607      * BIGINT, <b>REAL</b>, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
1608      * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
1609      * designates the recommended return type.
1610      * @see #getFloat(String)
1611      */
1612     public float getFloat(String columnName) throws SQLException {
1613        throw new UnsupportedOperationException();
1614     }
1615 
1616     /**
1617      * Retrieves the value stored in the designated column
1618      * of the current row of this <code>CachedRowSetImpl</code> object
1619      * as a <code>double</code> value.
1620      *
1621      * @param columnName a <code>String</code> object giving the SQL name of
1622      *        a column in this <code>CachedRowSetImpl</code> object
1623      * @return the column value; if the value is SQL <code>NULL</code>,
1624      *         the result is <code>0</code>
1625      * @throws SQLException if (1) the given column name is not the name of
1626      * a column in this rowset, (2) the cursor is not on one of
1627      * this rowset's rows or its insert row, or (3) the designated
1628      * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
1629      * BIGINT, REAL, <b>FLOAT</b>, <b>DOUBLE</b>, DECIMAL, NUMERIC, BIT, CHAR,
1630      * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
1631      * designates the recommended return types.
1632      * @see #getDouble(int)
1633      */
1634     public double getDouble(String columnName) throws SQLException {
1635         throw new UnsupportedOperationException();
1636     }
1637 
1638     /**
1639      * Retrieves the value stored in the designated column
1640      * of the current row as a <code>java.math.BigDecimal</code> object.
1641      *
1642      * @param columnName a <code>String</code> object giving the SQL name of
1643      *        a column in this <code>CachedRowSetImpl</code> object
1644      * @param scale the number of digits to the right of the decimal point
1645      * @return a java.math.BugDecimal object with <code><i>scale</i></code>
1646      * number of digits to the right of the decimal point.
1647      * @throws SQLException if (1) the given column name is not the name of
1648      * a column in this rowset, (2) the cursor is not on one of
1649      * this rowset's rows or its insert row, or (3) the designated
1650      * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
1651      * BIGINT, REAL, FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT CHAR,
1652      * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
1653      * designates the recommended return type that this method is used to
1654      * retrieve.
1655      * @deprecated Use the <code>getBigDecimal(String columnName)</code>
1656      *             method instead
1657      */
1658     @Deprecated
1659     public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException {
1660         throw new UnsupportedOperationException();
1661     }
1662 
1663     /**
1664      * Retrieves the value stored in the designated column
1665      * of the current row as a <code>byte</code> array.
1666      * The bytes represent the raw values returned by the driver.
1667      *
1668      * @param columnName a <code>String</code> object giving the SQL name of
1669      *        a column in this <code>CachedRowSetImpl</code> object
1670      * @return the column value as a <code>byte</code> array in the Java programming
1671      * language; if the value is SQL <code>NULL</code>, the result is <code>null</code>
1672      * @throws SQLException if (1) the given column name is not the name of
1673      * a column in this rowset, (2) the cursor is not on one of
1674      * this rowset's rows or its insert row, or (3) the designated
1675      * column does not store an SQL <code><b>BINARY</b>, <b>VARBINARY</b>
1676      * </code> or <code>LONGVARBINARY</code> values
1677      * The bold SQL type designates the recommended return type.
1678      * @see #getBytes(int)
1679      */
1680     public byte[] getBytes(String columnName) throws SQLException {
1681         throw new UnsupportedOperationException();
1682     }
1683 
1684     /**
1685      * Retrieves the value stored in the designated column
1686      * of the current row as a <code>java.sql.Date</code> object.
1687      *
1688      * @param columnName a <code>String</code> object giving the SQL name of
1689      *        a column in this <code>CachedRowSetImpl</code> object
1690      * @return the column value; if the value is SQL <code>NULL</code>,
1691      *         the result is <code>null</code>
1692      * @throws SQLException if (1) the given column name is not the name of
1693      *            a column in this rowset, (2) the cursor is not on one of
1694      *            this rowset's rows or its insert row, or (3) the designated
1695      *            column does not store an SQL <code>DATE</code> or
1696      *            <code>TIMESTAMP</code> value
1697      */
1698     public java.sql.Date getDate(String columnName) throws SQLException {
1699         throw new UnsupportedOperationException();
1700     }
1701 
1702     /**
1703      * Retrieves the value stored in the designated column
1704      * of the current row as a <code>java.sql.Time</code> object.
1705      *
1706      * @param columnName a <code>String</code> object giving the SQL name of
1707      *        a column in this <code>CachedRowSetImpl</code> object
1708      * @return the column value; if the value is SQL <code>NULL</code>,
1709      *         the result is <code>null</code>
1710      * @throws SQLException if the given column name does not match one of
1711      *            this rowset's column names or the cursor is not on one of
1712      *            this rowset's rows or its insert row
1713      */
1714     public java.sql.Time getTime(String columnName) throws SQLException {
1715         throw new UnsupportedOperationException();
1716     }
1717 
1718     /**
1719      * Retrieves the value stored in the designated column
1720      * of the current row as a <code>java.sql.Timestamp</code> object.
1721      *
1722      * @param columnName a <code>String</code> object giving the SQL name of
1723      *        a column in this <code>CachedRowSetImpl</code> object
1724      * @return the column value; if the value is SQL <code>NULL</code>,
1725      *         the result is <code>null</code>
1726      * @throws SQLException if the given column name does not match one of
1727      *            this rowset's column names or the cursor is not on one of
1728      *            this rowset's rows or its insert row
1729      */
1730     public java.sql.Timestamp getTimestamp(String columnName) throws SQLException {
1731         throw new UnsupportedOperationException();
1732     }
1733 
1734     /**
1735      * Retrieves the value of the designated column in the current row of this
1736      * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
1737      * object.
1738      *
1739      * A column value can be retrieved as a stream of ASCII characters
1740      * and then read in chunks from the stream. This method is particularly
1741      * suitable for retrieving large <code>LONGVARCHAR</code> values. The
1742      * <code>SyncProvider</code> will rely on the JDBC driver to do any necessary
1743      * conversion from the database format into ASCII format.
1744      *
1745      * <P><B>Note:</B> All the data in the returned stream must
1746      * be read prior to getting the value of any other column. The
1747      * next call to a <code>getXXX</code> method implicitly closes the stream.
1748      *
1749      * @param columnName a <code>String</code> object giving the SQL name of
1750      *        a column in this <code>CachedRowSetImpl</code> object
1751      * @return a Java input stream that delivers the database column value
1752      *         as a stream of one-byte ASCII characters.  If the value is SQL
1753      *         <code>NULL</code>, the result is <code>null</code>.
1754      * @throws SQLException if (1) the given column name is not the name of
1755      * a column in this rowset
1756      * (2) the cursor is not on one of this rowset's rows or its
1757      * insert row, or (3) the designated column does not store an
1758      * SQL <code>CHAR, VARCHAR</code>, <code><b>LONGVARCHAR</b></code>
1759      * <code>BINARY, VARBINARY</code> or <code>LONGVARBINARY</code> value. The
1760      * bold SQL type designates the recommended return types that this method is
1761      * used to retrieve.
1762      * @see #getAsciiStream(int)
1763      */
1764     public java.io.InputStream getAsciiStream(String columnName) throws SQLException {
1765         throw new UnsupportedOperationException();
1766 
1767     }
1768 
1769     /**
1770      * A column value can be retrieved as a stream of Unicode characters
1771      * and then read in chunks from the stream.  This method is particularly
1772      * suitable for retrieving large <code>LONGVARCHAR</code> values.
1773      * The JDBC driver will do any necessary conversion from the database
1774      * format into Unicode.
1775      *
1776      * <P><B>Note:</B> All the data in the returned stream must
1777      * be read prior to getting the value of any other column. The
1778      * next call to a <code>getXXX</code> method implicitly closes the stream.
1779      *
1780      * @param columnName a <code>String</code> object giving the SQL name of
1781      *        a column in this <code>CachedRowSetImpl</code> object
1782      * @return a Java input stream that delivers the database column value
1783      *         as a stream of two-byte Unicode characters.  If the value is
1784      *         SQL <code>NULL</code>, the result is <code>null</code>.
1785      * @throws SQLException if the given column name does not match one of
1786      *            this rowset's column names or the cursor is not on one of
1787      *            this rowset's rows or its insert row
1788      * @deprecated use the method <code>getCharacterStream</code> instead
1789      */
1790     @Deprecated
1791     public java.io.InputStream getUnicodeStream(String columnName) throws SQLException {
1792         throw new UnsupportedOperationException();
1793     }
1794 
1795     /**
1796      * Retrieves the value of the designated column in the current row of this
1797      * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
1798      * object.
1799      * <P>
1800      * A column value can be retrieved as a stream of uninterpreted bytes
1801      * and then read in chunks from the stream.  This method is particularly
1802      * suitable for retrieving large <code>LONGVARBINARY</code> values.
1803      *
1804      * <P><B>Note:</B> All the data in the returned stream must be
1805      * read prior to getting the value of any other column. The next
1806      * call to a get method implicitly closes the stream. Also, a
1807      * stream may return <code>0</code> for <code>CachedRowSetImpl.available()</code>
1808      * whether there is data available or not.
1809      *
1810      * @param columnName a <code>String</code> object giving the SQL name of
1811      *        a column in this <code>CachedRowSetImpl</code> object
1812      * @return a Java input stream that delivers the database column value
1813      *         as a stream of uninterpreted bytes.  If the value is SQL
1814      *         <code>NULL</code>, the result is <code>null</code>.
1815      * @throws SQLException if (1) the given column name is unknown,
1816      * (2) the cursor is not on one of this rowset's rows or its
1817      * insert row, or (3) the designated column does not store an
1818      * SQL <code>BINARY, VARBINARY</code> or <code><b>LONGVARBINARY</b></code>
1819      * The bold type indicates the SQL type that this method is recommened
1820      * to retrieve.
1821      * @see #getBinaryStream(int)
1822      *
1823      */
1824     public java.io.InputStream getBinaryStream(String columnName) throws SQLException {
1825         throw new UnsupportedOperationException();
1826     }
1827 
1828 
1829     //=====================================================================
1830     // Advanced features:
1831     //=====================================================================
1832 
1833     /**
1834      * The first warning reported by calls on this <code>CachedRowSetImpl</code>
1835      * object is returned. Subsequent <code>CachedRowSetImpl</code> warnings will
1836      * be chained to this <code>SQLWarning</code>.
1837      *
1838      * <P>The warning chain is automatically cleared each time a new
1839      * row is read.
1840      *
1841      * <P><B>Note:</B> This warning chain only covers warnings caused
1842      * by <code>ResultSet</code> methods.  Any warning caused by statement
1843      * methods (such as reading OUT parameters) will be chained on the
1844      * <code>Statement</code> object.
1845      *
1846      * @return the first SQLWarning or null
1847      */
1848     public SQLWarning getWarnings() {
1849         throw new UnsupportedOperationException();
1850     }
1851 
1852     /**
1853      * Clears all the warnings reporeted for the <code>CachedRowSetImpl</code>
1854      * object. After a call to this method, the <code>getWarnings</code> method
1855      * returns <code>null</code> until a new warning is reported for this
1856      * <code>CachedRowSetImpl</code> object.
1857      */
1858     public void clearWarnings() {
1859        throw new UnsupportedOperationException();
1860     }
1861 
1862     /**
1863      * Retrieves the name of the SQL cursor used by this
1864      * <code>CachedRowSetImpl</code> object.
1865      *
1866      * <P>In SQL, a result table is retrieved through a cursor that is
1867      * named. The current row of a <code>ResultSet</code> can be updated or deleted
1868      * using a positioned update/delete statement that references the
1869      * cursor name. To ensure that the cursor has the proper isolation
1870      * level to support an update operation, the cursor's <code>SELECT</code>
1871      * statement should be of the form <code>select for update</code>.
1872      * If the <code>for update</code> clause
1873      * is omitted, positioned updates may fail.
1874      *
1875      * <P>JDBC supports this SQL feature by providing the name of the
1876      * SQL cursor used by a <code>ResultSet</code> object. The current row
1877      * of a result set is also the current row of this SQL cursor.
1878      *
1879      * <P><B>Note:</B> If positioned updates are not supported, an
1880      * <code>SQLException</code> is thrown.
1881      *
1882      * @return the SQL cursor name for this <code>CachedRowSetImpl</code> object's
1883      *         cursor
1884      * @throws SQLException if an error occurs
1885      */
1886     public String getCursorName() throws SQLException {
1887         throw new UnsupportedOperationException();
1888     }
1889 
1890     /**
1891      * Retrieves a <code>ResultSetMetaData</code> object instance that
1892      * contains information about the <code>CachedRowSet</code> object.
1893      * However, applications should cast the returned object to a
1894      * <code>RowSetMetaData</code> interface implementation. In the
1895      * reference implementation, this cast can be done on the
1896      * <code>RowSetMetaDataImpl</code> class.
1897      * <P>
1898      * For example:
1899      * <pre>
1900      * CachedRowSet crs = new CachedRowSetImpl();
1901      * RowSetMetaDataImpl metaData =
1902      *     (RowSetMetaDataImpl)crs.getMetaData();
1903      * // Set the number of columns in the RowSet object for
1904      * // which this RowSetMetaDataImpl object was created to the
1905      * // given number.
1906      * metaData.setColumnCount(3);
1907      * crs.setMetaData(metaData);
1908      * </pre>
1909      *
1910      * @return the <code>ResultSetMetaData</code> object that describes this
1911      *         <code>CachedRowSetImpl</code> object's columns
1912      * @throws SQLException if an error occurs in generating the RowSet
1913      * meta data; or if the <code>CachedRowSetImpl</code> is empty.
1914      * @see javax.sql.RowSetMetaData
1915      */
1916     public ResultSetMetaData getMetaData() throws SQLException {
1917         throw new UnsupportedOperationException();
1918     }
1919 
1920 
1921     /**
1922      * Retrieves the value of the designated column in the current row
1923      * of this <code>CachedRowSetImpl</code> object as an
1924      * <code>Object</code> value.
1925      * <P>
1926      * The type of the <code>Object</code> will be the default
1927      * Java object type corresponding to the column's SQL type,
1928      * following the mapping for built-in types specified in the JDBC 3.0
1929      * specification.
1930      * <P>
1931      * This method may also be used to read datatabase-specific
1932      * abstract data types.
1933      * <P>
1934      * This implementation of the method <code>getObject</code> extends its
1935      * behavior so that it gets the attributes of an SQL structured type
1936      * as an array of <code>Object</code> values.  This method also custom
1937      * maps SQL user-defined types to classes in the Java programming language.
1938      * When the specified column contains
1939      * a structured or distinct value, the behavior of this method is as
1940      * if it were a call to the method <code>getObject(columnIndex,
1941      * this.getStatement().getConnection().getTypeMap())</code>.
1942      *
1943      * @param columnIndex the first column is <code>1</code>, the second
1944      *        is <code>2</code>, and so on; must be <code>1</code> or larger
1945      *        and equal to or less than the number of columns in the rowset
1946      * @return a <code>java.lang.Object</code> holding the column value;
1947      *         if the value is SQL <code>NULL</code>, the result is <code>null</code>
1948      * @throws SQLException if the given column index is out of bounds,
1949      *            the cursor is not on a valid row, or there is a problem getting
1950      *            the <code>Class</code> object for a custom mapping
1951      * @see #getObject(String)
1952      */
1953     public Object getObject(int columnIndex) throws SQLException {
1954         throw new UnsupportedOperationException();
1955     }
1956 
1957     /**
1958      * Retrieves the value of the designated column in the current row
1959      * of this <code>CachedRowSetImpl</code> object as an
1960      * <code>Object</code> value.
1961      * <P>
1962      * The type of the <code>Object</code> will be the default
1963      * Java object type corresponding to the column's SQL type,
1964      * following the mapping for built-in types specified in the JDBC 3.0
1965      * specification.
1966      * <P>
1967      * This method may also be used to read datatabase-specific
1968      * abstract data types.
1969      * <P>
1970      * This implementation of the method <code>getObject</code> extends its
1971      * behavior so that it gets the attributes of an SQL structured type
1972      * as an array of <code>Object</code> values.  This method also custom
1973      * maps SQL user-defined types to classes
1974      * in the Java programming language. When the specified column contains
1975      * a structured or distinct value, the behavior of this method is as
1976      * if it were a call to the method <code>getObject(columnIndex,
1977      * this.getStatement().getConnection().getTypeMap())</code>.
1978      *
1979      * @param columnName a <code>String</code> object that must match the
1980      *        SQL name of a column in this rowset, ignoring case
1981      * @return a <code>java.lang.Object</code> holding the column value;
1982      *         if the value is SQL <code>NULL</code>, the result is <code>null</code>
1983      * @throws SQLException if (1) the given column name does not match one of
1984      *            this rowset's column names, (2) the cursor is not
1985      *            on a valid row, or (3) there is a problem getting
1986      *            the <code>Class</code> object for a custom mapping
1987      * @see #getObject(int)
1988      */
1989     public Object getObject(String columnName) throws SQLException {
1990        throw new UnsupportedOperationException();
1991     }
1992 
1993     //----------------------------------------------------------------
1994 
1995     /**
1996      * Maps the given column name for one of this <code>CachedRowSetImpl</code>
1997      * object's columns to its column number.
1998      *
1999      * @param columnName a <code>String</code> object that must match the
2000      *        SQL name of a column in this rowset, ignoring case
2001      * @return the column index of the given column name
2002      * @throws SQLException if the given column name does not match one
2003      *            of this rowset's column names
2004      */
2005     public int findColumn(String columnName) throws SQLException {
2006        throw new UnsupportedOperationException();
2007     }
2008 
2009     //--------------------------JDBC 2.0-----------------------------------
2010 
2011     //---------------------------------------------------------------------
2012     // Getter's and Setter's
2013     //---------------------------------------------------------------------
2014 
2015     /**
2016      * Retrieves the value stored in the designated column
2017      * of the current row as a <code>java.io.Reader</code> object.
2018      *
2019      * <P><B>Note:</B> All the data in the returned stream must
2020      * be read prior to getting the value of any other column. The
2021      * next call to a <code>getXXX</code> method implicitly closes the stream.
2022      *
2023      * @param columnIndex the first column is <code>1</code>, the second
2024      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2025      *        and equal to or less than the number of columns in the rowset
2026      * @return a Java character stream that delivers the database column value
2027      * as a stream of two-byte unicode characters in a
2028      * <code>java.io.Reader</code> object.  If the value is
2029      * SQL <code>NULL</code>, the result is <code>null</code>.
2030      * @throws SQLException if (1) the given column index is out of bounds,
2031      * (2) the cursor is not on one of this rowset's rows or its
2032      * insert row, or (3) the designated column does not store an
2033      * SQL <code>CHAR, VARCHAR, <b>LONGVARCHAR</b>, BINARY, VARBINARY</code> or
2034      * <code>LONGVARBINARY</code> value.
2035      * The bold SQL type designates the recommended return type.
2036      * @see #getCharacterStream(String)
2037      */
2038     public java.io.Reader getCharacterStream(int columnIndex) throws SQLException{
2039         throw new UnsupportedOperationException();
2040     }
2041 
2042     /**
2043      * Retrieves the value stored in the designated column
2044      * of the current row as a <code>java.io.Reader</code> object.
2045      *
2046      * <P><B>Note:</B> All the data in the returned stream must
2047      * be read prior to getting the value of any other column. The
2048      * next call to a <code>getXXX</code> method implicitly closes the stream.
2049      *
2050      * @param columnName a <code>String</code> object giving the SQL name of
2051      *        a column in this <code>CachedRowSetImpl</code> object
2052      * @return a Java input stream that delivers the database column value
2053      *         as a stream of two-byte Unicode characters.  If the value is
2054      *         SQL <code>NULL</code>, the result is <code>null</code>.
2055      * @throws SQLException if (1) the given column name is not the name of
2056      * a column in this rowset, (2) the cursor is not on one of
2057      * this rowset's rows or its insert row, or (3) the designated
2058      * column does not store an SQL <code>CHAR, VARCHAR, <b>LONGVARCHAR</b>,
2059      * BINARY, VARYBINARY</code> or <code>LONGVARBINARY</code> value.
2060      * The bold SQL type designates the recommended return type.
2061      */
2062     public java.io.Reader getCharacterStream(String columnName) throws SQLException {
2063         throw new UnsupportedOperationException();
2064     }
2065 
2066     /**
2067      * Retrieves the value of the designated column in the current row
2068      * of this <code>CachedRowSetImpl</code> object as a
2069      * <code>java.math.BigDecimal</code> object.
2070      *
2071      * @param columnIndex the first column is <code>1</code>, the second
2072      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2073      *        and equal to or less than the number of columns in the rowset
2074      * @return a <code>java.math.BigDecimal</code> value with full precision;
2075      *         if the value is SQL <code>NULL</code>, the result is <code>null</code>
2076      * @throws SQLException if (1) the given column index is out of bounds,
2077      * (2) the cursor is not on one of this rowset's rows or its
2078      * insert row, or (3) the designated column does not store an
2079      * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
2080      * FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT, CHAR, VARCHAR</code>
2081      * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
2082      * recommended return types that this method is used to retrieve.
2083      * @see #getBigDecimal(String)
2084      */
2085     public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
2086         throw new UnsupportedOperationException();
2087     }
2088 
2089     /**
2090      * Retrieves the value of the designated column in the current row
2091      * of this <code>CachedRowSetImpl</code> object as a
2092      * <code>java.math.BigDecimal</code> object.
2093      *
2094      * @param columnName a <code>String</code> object that must match the
2095      *        SQL name of a column in this rowset, ignoring case
2096      * @return a <code>java.math.BigDecimal</code> value with full precision;
2097      *         if the value is SQL <code>NULL</code>, the result is <code>null</code>
2098      * @throws SQLException if (1) the given column name is not the name of
2099      * a column in this rowset, (2) the cursor is not on one of
2100      * this rowset's rows or its insert row, or (3) the designated
2101      * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
2102      * BIGINT, REAL, FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT CHAR,
2103      * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
2104      * designates the recommended return type that this method is used to
2105      * retrieve
2106      * @see #getBigDecimal(int)
2107      */
2108     public BigDecimal getBigDecimal(String columnName) throws SQLException {
2109         throw new UnsupportedOperationException();
2110     }
2111 
2112     //---------------------------------------------------------------------
2113     // Traversal/Positioning
2114     //---------------------------------------------------------------------
2115 
2116     /**
2117      * Returns the number of rows in this <code>CachedRowSetImpl</code> object.
2118      *
2119      * @return number of rows in the rowset
2120      */
2121     public int size() {
2122         throw new UnsupportedOperationException();
2123     }
2124 
2125     /**
2126      * Indicates whether the cursor is before the first row in this
2127      * <code>CachedRowSetImpl</code> object.
2128      *
2129      * @return <code>true</code> if the cursor is before the first row;
2130      *         <code>false</code> otherwise or if the rowset contains no rows
2131      * @throws SQLException if an error occurs
2132      */
2133     public boolean isBeforeFirst() throws SQLException {
2134         throw new UnsupportedOperationException();
2135     }
2136 
2137     /**
2138      * Indicates whether the cursor is after the last row in this
2139      * <code>CachedRowSetImpl</code> object.
2140      *
2141      * @return <code>true</code> if the cursor is after the last row;
2142      *         <code>false</code> otherwise or if the rowset contains no rows
2143      * @throws SQLException if an error occurs
2144      */
2145     public boolean isAfterLast() throws SQLException {
2146         throw new UnsupportedOperationException();
2147     }
2148 
2149     /**
2150      * Indicates whether the cursor is on the first row in this
2151      * <code>CachedRowSetImpl</code> object.
2152      *
2153      * @return <code>true</code> if the cursor is on the first row;
2154      *         <code>false</code> otherwise or if the rowset contains no rows
2155      * @throws SQLException if an error occurs
2156      */
2157     public boolean isFirst() throws SQLException {
2158         throw new UnsupportedOperationException();
2159     }
2160 
2161     /**
2162      * Indicates whether the cursor is on the last row in this
2163      * <code>CachedRowSetImpl</code> object.
2164      * <P>
2165      * Note: Calling the method <code>isLast</code> may be expensive
2166      * because the JDBC driver might need to fetch ahead one row in order
2167      * to determine whether the current row is the last row in this rowset.
2168      *
2169      * @return <code>true</code> if the cursor is on the last row;
2170      *         <code>false</code> otherwise or if this rowset contains no rows
2171      * @throws SQLException if an error occurs
2172      */
2173     public boolean isLast() throws SQLException {
2174         throw new UnsupportedOperationException();
2175     }
2176 
2177     /**
2178      * Moves this <code>CachedRowSetImpl</code> object's cursor to the front of
2179      * the rowset, just before the first row. This method has no effect if
2180      * this rowset contains no rows.
2181      *
2182      * @throws SQLException if an error occurs or the type of this rowset
2183      *            is <code>ResultSet.TYPE_FORWARD_ONLY</code>
2184      */
2185     public void beforeFirst() throws SQLException {
2186         throw new UnsupportedOperationException();
2187     }
2188 
2189     /**
2190      * Moves this <code>CachedRowSetImpl</code> object's cursor to the end of
2191      * the rowset, just after the last row. This method has no effect if
2192      * this rowset contains no rows.
2193      *
2194      * @throws SQLException if an error occurs
2195      */
2196     public void afterLast() throws SQLException {
2197         throw new UnsupportedOperationException();
2198     }
2199 
2200     /**
2201      * Moves this <code>CachedRowSetImpl</code> object's cursor to the first row
2202      * and returns <code>true</code> if the operation was successful.  This
2203      * method also notifies registered listeners that the cursor has moved.
2204      *
2205      * @return <code>true</code> if the cursor is on a valid row;
2206      *         <code>false</code> otherwise or if there are no rows in this
2207      *         <code>CachedRowSetImpl</code> object
2208      * @throws SQLException if the type of this rowset
2209      *            is <code>ResultSet.TYPE_FORWARD_ONLY</code>
2210      */
2211     public boolean first() throws SQLException {
2212         throw new UnsupportedOperationException();
2213     }
2214 
2215     /**
2216      * Moves this <code>CachedRowSetImpl</code> object's cursor to the first
2217      * row and returns <code>true</code> if the operation is successful.
2218      * <P>
2219      * This method is called internally by the methods <code>first</code>,
2220      * <code>isFirst</code>, and <code>absolute</code>.
2221      * It in turn calls the method <code>internalNext</code> in order to
2222      * handle the case where the first row is a deleted row that is not visible.
2223      * <p>
2224      * This is a implementation only method and is not required as a standard
2225      * implementation of the <code>CachedRowSet</code> interface.
2226      *
2227      * @return <code>true</code> if the cursor moved to the first row;
2228      *         <code>false</code> otherwise
2229      * @throws SQLException if an error occurs
2230      */
2231     protected boolean internalFirst() throws SQLException {
2232         throw new UnsupportedOperationException();
2233     }
2234 
2235     /**
2236      * Moves this <code>CachedRowSetImpl</code> object's cursor to the last row
2237      * and returns <code>true</code> if the operation was successful.  This
2238      * method also notifies registered listeners that the cursor has moved.
2239      *
2240      * @return <code>true</code> if the cursor is on a valid row;
2241      *         <code>false</code> otherwise or if there are no rows in this
2242      *         <code>CachedRowSetImpl</code> object
2243      * @throws SQLException if the type of this rowset
2244      *            is <code>ResultSet.TYPE_FORWARD_ONLY</code>
2245      */
2246     public boolean last() throws SQLException {
2247         throw new UnsupportedOperationException();
2248     }
2249 
2250     /**
2251      * Moves this <code>CachedRowSetImpl</code> object's cursor to the last
2252      * row and returns <code>true</code> if the operation is successful.
2253      * <P>
2254      * This method is called internally by the method <code>last</code>
2255      * when rows have been deleted and the deletions are not visible.
2256      * The method <code>internalLast</code> handles the case where the
2257      * last row is a deleted row that is not visible by in turn calling
2258      * the method <code>internalPrevious</code>.
2259      * <p>
2260      * This is a implementation only method and is not required as a standard
2261      * implementation of the <code>CachedRowSet</code> interface.
2262      *
2263      * @return <code>true</code> if the cursor moved to the last row;
2264      *         <code>false</code> otherwise
2265      * @throws SQLException if an error occurs
2266      */
2267     protected boolean internalLast() throws SQLException {
2268         throw new UnsupportedOperationException();
2269     }
2270 
2271     /**
2272      * Returns the number of the current row in this <code>CachedRowSetImpl</code>
2273      * object. The first row is number 1, the second number 2, and so on.
2274      *
2275      * @return the number of the current row;  <code>0</code> if there is no
2276      *         current row
2277      * @throws SQLException if an error occurs; or if the <code>CacheRowSetImpl</code>
2278      *         is empty
2279      */
2280     public int getRow() throws SQLException {
2281         return crsSync.getRow();
2282     }
2283 
2284     /**
2285      * Moves this <code>CachedRowSetImpl</code> object's cursor to the row number
2286      * specified.
2287      *
2288      * <p>If the number is positive, the cursor moves to an absolute row with
2289      * respect to the beginning of the rowset.  The first row is row 1, the second
2290      * is row 2, and so on.  For example, the following command, in which
2291      * <code>crs</code> is a <code>CachedRowSetImpl</code> object, moves the cursor
2292      * to the fourth row, starting from the beginning of the rowset.
2293      * <PRE><code>
2294      *
2295      *    crs.absolute(4);
2296      *
2297      * </code> </PRE>
2298      * <P>
2299      * If the number is negative, the cursor moves to an absolute row position
2300      * with respect to the end of the rowset.  For example, calling
2301      * <code>absolute(-1)</code> positions the cursor on the last row,
2302      * <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
2303      * If the <code>CachedRowSetImpl</code> object <code>crs</code> has five rows,
2304      * the following command moves the cursor to the fourth-to-last row, which
2305      * in the case of a  rowset with five rows, is also the second row, counting
2306      * from the beginning.
2307      * <PRE><code>
2308      *
2309      *    crs.absolute(-4);
2310      *
2311      * </code> </PRE>
2312      *
2313      * If the number specified is larger than the number of rows, the cursor
2314      * will move to the position after the last row. If the number specified
2315      * would move the cursor one or more rows before the first row, the cursor
2316      * moves to the position before the first row.
2317      * <P>
2318      * Note: Calling <code>absolute(1)</code> is the same as calling the
2319      * method <code>first()</code>.  Calling <code>absolute(-1)</code> is the
2320      * same as calling <code>last()</code>.
2321      *
2322      * @param row a positive number to indicate the row, starting row numbering from
2323      *        the first row, which is <code>1</code>; a negative number to indicate
2324      *        the row, starting row numbering from the last row, which is
2325      *        <code>-1</code>; it must not be <code>0</code>
2326      * @return <code>true</code> if the cursor is on the rowset; <code>false</code>
2327      *         otherwise
2328      * @throws SQLException if the given cursor position is <code>0</code> or the
2329      *            type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
2330      */
2331     public boolean absolute( int row ) throws SQLException {
2332         throw new UnsupportedOperationException();
2333     }
2334 
2335     /**
2336      * Moves the cursor the specified number of rows from the current
2337      * position, with a positive number moving it forward and a
2338      * negative number moving it backward.
2339      * <P>
2340      * If the number is positive, the cursor moves the specified number of
2341      * rows toward the end of the rowset, starting at the current row.
2342      * For example, the following command, in which
2343      * <code>crs</code> is a <code>CachedRowSetImpl</code> object with 100 rows,
2344      * moves the cursor forward four rows from the current row.  If the
2345      * current row is 50, the cursor would move to row 54.
2346      * <PRE><code>
2347      *
2348      *    crs.relative(4);
2349      *
2350      * </code> </PRE>
2351      * <P>
2352      * If the number is negative, the cursor moves back toward the beginning
2353      * the specified number of rows, starting at the current row.
2354      * For example, calling the method
2355      * <code>absolute(-1)</code> positions the cursor on the last row,
2356      * <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
2357      * If the <code>CachedRowSetImpl</code> object <code>crs</code> has five rows,
2358      * the following command moves the cursor to the fourth-to-last row, which
2359      * in the case of a  rowset with five rows, is also the second row
2360      * from the beginning.
2361      * <PRE><code>
2362      *
2363      *    crs.absolute(-4);
2364      *
2365      * </code> </PRE>
2366      *
2367      * If the number specified is larger than the number of rows, the cursor
2368      * will move to the position after the last row. If the number specified
2369      * would move the cursor one or more rows before the first row, the cursor
2370      * moves to the position before the first row. In both cases, this method
2371      * throws an <code>SQLException</code>.
2372      * <P>
2373      * Note: Calling <code>absolute(1)</code> is the same as calling the
2374      * method <code>first()</code>.  Calling <code>absolute(-1)</code> is the
2375      * same as calling <code>last()</code>.  Calling <code>relative(0)</code>
2376      * is valid, but it does not change the cursor position.
2377      *
2378      * @param rows an <code>int</code> indicating the number of rows to move
2379      *             the cursor, starting at the current row; a positive number
2380      *             moves the cursor forward; a negative number moves the cursor
2381      *             backward; must not move the cursor past the valid
2382      *             rows
2383      * @return <code>true</code> if the cursor is on a row in this
2384      *         <code>CachedRowSetImpl</code> object; <code>false</code>
2385      *         otherwise
2386      * @throws SQLException if there are no rows in this rowset, the cursor is
2387      *         positioned either before the first row or after the last row, or
2388      *         the rowset is type <code>ResultSet.TYPE_FORWARD_ONLY</code>
2389      */
2390     public boolean relative(int rows) throws SQLException {
2391         throw new UnsupportedOperationException();
2392     }
2393 
2394     /**
2395      * Moves this <code>CachedRowSetImpl</code> object's cursor to the
2396      * previous row and returns <code>true</code> if the cursor is on
2397      * a valid row or <code>false</code> if it is not.
2398      * This method also notifies all listeners registered with this
2399      * <code>CachedRowSetImpl</code> object that its cursor has moved.
2400      * <P>
2401      * Note: calling the method <code>previous()</code> is not the same
2402      * as calling the method <code>relative(-1)</code>.  This is true
2403      * because it is possible to call <code>previous()</code> from the insert
2404      * row, from after the last row, or from the current row, whereas
2405      * <code>relative</code> may only be called from the current row.
2406      * <P>
2407      * The method <code>previous</code> may used in a <code>while</code>
2408      * loop to iterate through a rowset starting after the last row
2409      * and moving toward the beginning. The loop ends when <code>previous</code>
2410      * returns <code>false</code>, meaning that there are no more rows.
2411      * For example, the following code fragment retrieves all the data in
2412      * the <code>CachedRowSetImpl</code> object <code>crs</code>, which has
2413      * three columns.  Note that the cursor must initially be positioned
2414      * after the last row so that the first call to the method
2415      * <code>previous</code> places the cursor on the last line.
2416      * <PRE> <code>
2417      *
2418      *     crs.afterLast();
2419      *     while (previous()) {
2420      *         String name = crs.getString(1);
2421      *         int age = crs.getInt(2);
2422      *         short ssn = crs.getShort(3);
2423      *         System.out.println(name + "   " + age + "   " + ssn);
2424      *     }
2425      *
2426      * </code> </PRE>
2427      * This method throws an <code>SQLException</code> if the cursor is not
2428      * on a row in the rowset, before the first row, or after the last row.
2429      *
2430      * @return <code>true</code> if the cursor is on a valid row;
2431      *         <code>false</code> if it is before the first row or after the
2432      *         last row
2433      * @throws SQLException if the cursor is not on a valid position or the
2434      *           type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
2435      */
2436     public boolean previous() throws SQLException {
2437         throw new UnsupportedOperationException();
2438     }
2439 
2440     /**
2441      * Moves the cursor to the previous row in this <code>CachedRowSetImpl</code>
2442      * object, skipping past deleted rows that are not visible; returns
2443      * <code>true</code> if the cursor is on a row in this rowset and
2444      * <code>false</code> when the cursor goes before the first row.
2445      * <P>
2446      * This method is called internally by the method <code>previous</code>.
2447      * <P>
2448      * This is a implementation only method and is not required as a standard
2449      * implementation of the <code>CachedRowSet</code> interface.
2450      *
2451      * @return <code>true</code> if the cursor is on a row in this rowset;
2452      *         <code>false</code> when the cursor reaches the position before
2453      *         the first row
2454      * @throws SQLException if an error occurs
2455      */
2456     protected boolean internalPrevious() throws SQLException {
2457         throw new UnsupportedOperationException();
2458     }
2459 
2460 
2461     //---------------------------------------------------------------------
2462     // Updates
2463     //---------------------------------------------------------------------
2464 
2465     /**
2466      * Indicates whether the current row of this <code>CachedRowSetImpl</code>
2467      * object has been updated.  The value returned
2468      * depends on whether this rowset can detect updates: <code>false</code>
2469      * will always be returned if it does not detect updates.
2470      *
2471      * @return <code>true</code> if the row has been visibly updated
2472      *         by the owner or another and updates are detected;
2473      *         <code>false</code> otherwise
2474      * @throws SQLException if the cursor is on the insert row or not
2475      *            not on a valid row
2476      *
2477      * @see DatabaseMetaData#updatesAreDetected
2478      */
2479     public boolean rowUpdated() throws SQLException {
2480         throw new UnsupportedOperationException();
2481     }
2482 
2483     /**
2484      * Indicates whether the designated column of the current row of
2485      * this <code>CachedRowSetImpl</code> object has been updated. The
2486      * value returned depends on whether this rowset can detcted updates:
2487      * <code>false</code> will always be returned if it does not detect updates.
2488      *
2489      * @param idx the index identifier of the column that may be have been updated.
2490      * @return <code>true</code> is the designated column has been updated
2491      * and the rowset detects updates; <code>false</code> if the rowset has not
2492      * been updated or the rowset does not detect updates
2493      * @throws SQLException if the cursor is on the insert row or not
2494      *          on a valid row
2495      * @see DatabaseMetaData#updatesAreDetected
2496      */
2497     public boolean columnUpdated(int idx) throws SQLException {
2498         throw new UnsupportedOperationException();
2499     }
2500 
2501     /**
2502      * Indicates whether the designated column of the current row of
2503      * this <code>CachedRowSetImpl</code> object has been updated. The
2504      * value returned depends on whether this rowset can detcted updates:
2505      * <code>false</code> will always be returned if it does not detect updates.
2506      *
2507      * @param columnName the <code>String</code> column name column that may be have
2508      * been updated.
2509      * @return <code>true</code> is the designated column has been updated
2510      * and the rowset detects updates; <code>false</code> if the rowset has not
2511      * been updated or the rowset does not detect updates
2512      * @throws SQLException if the cursor is on the insert row or not
2513      *          on a valid row
2514      * @see DatabaseMetaData#updatesAreDetected
2515      */
2516     public boolean columnUpdated(String columnName) throws SQLException {
2517         throw new UnsupportedOperationException();
2518     }
2519 
2520     /**
2521      * Indicates whether the current row has been inserted.  The value returned
2522      * depends on whether or not the rowset can detect visible inserts.
2523      *
2524      * @return <code>true</code> if a row has been inserted and inserts are detected;
2525      *         <code>false</code> otherwise
2526      * @throws SQLException if the cursor is on the insert row or not
2527      *            not on a valid row
2528      *
2529      * @see DatabaseMetaData#insertsAreDetected
2530      */
2531     public boolean rowInserted() throws SQLException {
2532         throw new UnsupportedOperationException();
2533     }
2534 
2535     /**
2536      * Indicates whether the current row has been deleted.  A deleted row
2537      * may leave a visible "hole" in a rowset.  This method can be used to
2538      * detect such holes if the rowset can detect deletions. This method
2539      * will always return <code>false</code> if this rowset cannot detect
2540      * deletions.
2541      *
2542      * @return <code>true</code> if (1)the current row is blank, indicating that
2543      *         the row has been deleted, and (2)deletions are detected;
2544      *         <code>false</code> otherwise
2545      * @throws SQLException if the cursor is on a valid row in this rowset
2546      * @see DatabaseMetaData#deletesAreDetected
2547      */
2548     public boolean rowDeleted() throws SQLException {
2549         throw new UnsupportedOperationException();
2550     }
2551 
2552     /**
2553      * Sets the designated nullable column in the current row or the
2554      * insert row of this <code>CachedRowSetImpl</code> object with
2555      * <code>null</code> value.
2556      * <P>
2557      * This method updates a column value in the current row or the insert
2558      * row of this rowset; however, another method must be called to complete
2559      * the update process. If the cursor is on a row in the rowset, the
2560      * method {@link #updateRow} must be called to mark the row as updated
2561      * and to notify listeners that the row has changed.
2562      * If the cursor is on the insert row, the method {@link #insertRow}
2563      * must be called to insert the new row into this rowset and to notify
2564      * listeners that a row has changed.
2565      * <P>
2566      * In order to propagate updates in this rowset to the underlying
2567      * data source, an application must call the method {@link #acceptChanges}
2568      * after it calls either <code>updateRow</code> or <code>insertRow</code>.
2569      *
2570      * @param columnIndex the first column is <code>1</code>, the second
2571      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2572      *        and equal to or less than the number of columns in this rowset
2573      * @throws SQLException if (1) the given column index is out of bounds,
2574      *            (2) the cursor is not on one of this rowset's rows or its
2575      *            insert row, or (3) this rowset is
2576      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2577      */
2578     public void updateNull(int columnIndex) throws SQLException {
2579         throw new UnsupportedOperationException();
2580     }
2581 
2582     /**
2583      * Sets the designated column in either the current row or the insert
2584      * row of this <code>CachedRowSetImpl</code> object with the given
2585      * <code>boolean</code> value.
2586      * <P>
2587      * This method updates a column value in the current row or the insert
2588      * row of this rowset, but it does not update the database.
2589      * If the cursor is on a row in the rowset, the
2590      * method {@link #updateRow} must be called to update the database.
2591      * If the cursor is on the insert row, the method {@link #insertRow}
2592      * must be called, which will insert the new row into both this rowset
2593      * and the database. Both of these methods must be called before the
2594      * cursor moves to another row.
2595      *
2596      * @param columnIndex the first column is <code>1</code>, the second
2597      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2598      *        and equal to or less than the number of columns in this rowset
2599      * @param x the new column value
2600      * @throws SQLException if (1) the given column index is out of bounds,
2601      *            (2) the cursor is not on one of this rowset's rows or its
2602      *            insert row, or (3) this rowset is
2603      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2604      */
2605     public void updateBoolean(int columnIndex, boolean x) throws SQLException {
2606         throw new UnsupportedOperationException();
2607     }
2608 
2609     /**
2610      * Sets the designated column in either the current row or the insert
2611      * row of this <code>CachedRowSetImpl</code> object with the given
2612      * <code>byte</code> value.
2613      * <P>
2614      * This method updates a column value in the current row or the insert
2615      * row of this rowset, but it does not update the database.
2616      * If the cursor is on a row in the rowset, the
2617      * method {@link #updateRow} must be called to update the database.
2618      * If the cursor is on the insert row, the method {@link #insertRow}
2619      * must be called, which will insert the new row into both this rowset
2620      * and the database. Both of these methods must be called before the
2621      * cursor moves to another row.
2622      *
2623      * @param columnIndex the first column is <code>1</code>, the second
2624      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2625      *        and equal to or less than the number of columns in this rowset
2626      * @param x the new column value
2627      * @throws SQLException if (1) the given column index is out of bounds,
2628      *            (2) the cursor is not on one of this rowset's rows or its
2629      *            insert row, or (3) this rowset is
2630      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2631      */
2632     public void updateByte(int columnIndex, byte x) throws SQLException {
2633         throw new UnsupportedOperationException();
2634     }
2635 
2636     /**
2637      * Sets the designated column in either the current row or the insert
2638      * row of this <code>CachedRowSetImpl</code> object with the given
2639      * <code>short</code> value.
2640      * <P>
2641      * This method updates a column value in the current row or the insert
2642      * row of this rowset, but it does not update the database.
2643      * If the cursor is on a row in the rowset, the
2644      * method {@link #updateRow} must be called to update the database.
2645      * If the cursor is on the insert row, the method {@link #insertRow}
2646      * must be called, which will insert the new row into both this rowset
2647      * and the database. Both of these methods must be called before the
2648      * cursor moves to another row.
2649      *
2650      * @param columnIndex the first column is <code>1</code>, the second
2651      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2652      *        and equal to or less than the number of columns in this rowset
2653      * @param x the new column value
2654      * @throws SQLException if (1) the given column index is out of bounds,
2655      *            (2) the cursor is not on one of this rowset's rows or its
2656      *            insert row, or (3) this rowset is
2657      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2658      */
2659     public void updateShort(int columnIndex, short x) throws SQLException {
2660         throw new UnsupportedOperationException();
2661     }
2662 
2663     /**
2664      * Sets the designated column in either the current row or the insert
2665      * row of this <code>CachedRowSetImpl</code> object with the given
2666      * <code>int</code> value.
2667      * <P>
2668      * This method updates a column value in the current row or the insert
2669      * row of this rowset, but it does not update the database.
2670      * If the cursor is on a row in the rowset, the
2671      * method {@link #updateRow} must be called to update the database.
2672      * If the cursor is on the insert row, the method {@link #insertRow}
2673      * must be called, which will insert the new row into both this rowset
2674      * and the database. Both of these methods must be called before the
2675      * cursor moves to another row.
2676      *
2677      * @param columnIndex the first column is <code>1</code>, the second
2678      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2679      *        and equal to or less than the number of columns in this rowset
2680      * @param x the new column value
2681      * @throws SQLException if (1) the given column index is out of bounds,
2682      *            (2) the cursor is not on one of this rowset's rows or its
2683      *            insert row, or (3) this rowset is
2684      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2685      */
2686     public void updateInt(int columnIndex, int x) throws SQLException {
2687         throw new UnsupportedOperationException();
2688     }
2689 
2690     /**
2691      * Sets the designated column in either the current row or the insert
2692      * row of this <code>CachedRowSetImpl</code> object with the given
2693      * <code>long</code> value.
2694      * <P>
2695      * This method updates a column value in the current row or the insert
2696      * row of this rowset, but it does not update the database.
2697      * If the cursor is on a row in the rowset, the
2698      * method {@link #updateRow} must be called to update the database.
2699      * If the cursor is on the insert row, the method {@link #insertRow}
2700      * must be called, which will insert the new row into both this rowset
2701      * and the database. Both of these methods must be called before the
2702      * cursor moves to another row.
2703      *
2704      * @param columnIndex the first column is <code>1</code>, the second
2705      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2706      *        and equal to or less than the number of columns in this rowset
2707      * @param x the new column value
2708      * @throws SQLException if (1) the given column index is out of bounds,
2709      *            (2) the cursor is not on one of this rowset's rows or its
2710      *            insert row, or (3) this rowset is
2711      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2712      */
2713     public void updateLong(int columnIndex, long x) throws SQLException {
2714        throw new UnsupportedOperationException();
2715 
2716     }
2717 
2718     /**
2719      * Sets the designated column in either the current row or the insert
2720      * row of this <code>CachedRowSetImpl</code> object with the given
2721      * <code>float</code> value.
2722      * <P>
2723      * This method updates a column value in the current row or the insert
2724      * row of this rowset, but it does not update the database.
2725      * If the cursor is on a row in the rowset, the
2726      * method {@link #updateRow} must be called to update the database.
2727      * If the cursor is on the insert row, the method {@link #insertRow}
2728      * must be called, which will insert the new row into both this rowset
2729      * and the database. Both of these methods must be called before the
2730      * cursor moves to another row.
2731      *
2732      * @param columnIndex the first column is <code>1</code>, the second
2733      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2734      *        and equal to or less than the number of columns in this rowset
2735      * @param x the new column value
2736      * @throws SQLException if (1) the given column index is out of bounds,
2737      *            (2) the cursor is not on one of this rowset's rows or its
2738      *            insert row, or (3) this rowset is
2739      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2740      */
2741     public void updateFloat(int columnIndex, float x) throws SQLException {
2742         throw new UnsupportedOperationException();
2743     }
2744 
2745     /**
2746      * Sets the designated column in either the current row or the insert
2747      * row of this <code>CachedRowSetImpl</code> object with the given
2748      * <code>double</code> value.
2749      *
2750      * This method updates a column value in either the current row or
2751      * the insert row of this rowset, but it does not update the
2752      * database.  If the cursor is on a row in the rowset, the
2753      * method {@link #updateRow} must be called to update the database.
2754      * If the cursor is on the insert row, the method {@link #insertRow}
2755      * must be called, which will insert the new row into both this rowset
2756      * and the database. Both of these methods must be called before the
2757      * cursor moves to another row.
2758      *
2759      * @param columnIndex the first column is <code>1</code>, the second
2760      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2761      *        and equal to or less than the number of columns in this rowset
2762      * @param x the new column value
2763      * @throws SQLException if (1) the given column index is out of bounds,
2764      *            (2) the cursor is not on one of this rowset's rows or its
2765      *            insert row, or (3) this rowset is
2766      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2767      */
2768     public void updateDouble(int columnIndex, double x) throws SQLException {
2769         throw new UnsupportedOperationException();
2770     }
2771 
2772     /**
2773      * Sets the designated column in either the current row or the insert
2774      * row of this <code>CachedRowSetImpl</code> object with the given
2775      * <code>java.math.BigDecimal</code> object.
2776      * <P>
2777      * This method updates a column value in the current row or the insert
2778      * row of this rowset, but it does not update the database.
2779      * If the cursor is on a row in the rowset, the
2780      * method {@link #updateRow} must be called to update the database.
2781      * If the cursor is on the insert row, the method {@link #insertRow}
2782      * must be called, which will insert the new row into both this rowset
2783      * and the database. Both of these methods must be called before the
2784      * cursor moves to another row.
2785      *
2786      * @param columnIndex the first column is <code>1</code>, the second
2787      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2788      *        and equal to or less than the number of columns in this rowset
2789      * @param x the new column value
2790      * @throws SQLException if (1) the given column index is out of bounds,
2791      *            (2) the cursor is not on one of this rowset's rows or its
2792      *            insert row, or (3) this rowset is
2793      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2794      */
2795     public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
2796         throw new UnsupportedOperationException();
2797     }
2798 
2799     /**
2800      * Sets the designated column in either the current row or the insert
2801      * row of this <code>CachedRowSetImpl</code> object with the given
2802      * <code>String</code> object.
2803      * <P>
2804      * This method updates a column value in either the current row or
2805      * the insert row of this rowset, but it does not update the
2806      * database.  If the cursor is on a row in the rowset, the
2807      * method {@link #updateRow} must be called to mark the row as updated.
2808      * If the cursor is on the insert row, the method {@link #insertRow}
2809      * must be called to insert the new row into this rowset and mark it
2810      * as inserted. Both of these methods must be called before the
2811      * cursor moves to another row.
2812      * <P>
2813      * The method <code>acceptChanges</code> must be called if the
2814      * updated values are to be written back to the underlying database.
2815      *
2816      * @param columnIndex the first column is <code>1</code>, the second
2817      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2818      *        and equal to or less than the number of columns in this rowset
2819      * @param x the new column value
2820      * @throws SQLException if (1) the given column index is out of bounds,
2821      *            (2) the cursor is not on one of this rowset's rows or its
2822      *            insert row, or (3) this rowset is
2823      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2824      */
2825     public void updateString(int columnIndex, String x) throws SQLException {
2826         throw new UnsupportedOperationException();
2827     }
2828 
2829     /**
2830      * Sets the designated column in either the current row or the insert
2831      * row of this <code>CachedRowSetImpl</code> object with the given
2832      * <code>byte</code> array.
2833      *
2834      * This method updates a column value in either the current row or
2835      * the insert row of this rowset, but it does not update the
2836      * database.  If the cursor is on a row in the rowset, the
2837      * method {@link #updateRow} must be called to update the database.
2838      * If the cursor is on the insert row, the method {@link #insertRow}
2839      * must be called, which will insert the new row into both this rowset
2840      * and the database. Both of these methods must be called before the
2841      * cursor moves to another row.
2842      *
2843      * @param columnIndex the first column is <code>1</code>, the second
2844      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2845      *        and equal to or less than the number of columns in this rowset
2846      * @param x the new column value
2847      * @throws SQLException if (1) the given column index is out of bounds,
2848      *            (2) the cursor is not on one of this rowset's rows or its
2849      *            insert row, or (3) this rowset is
2850      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2851      */
2852     public void updateBytes(int columnIndex, byte x[]) throws SQLException {
2853         throw new UnsupportedOperationException();
2854     }
2855 
2856     /**
2857      * Sets the designated column in either the current row or the insert
2858      * row of this <code>CachedRowSetImpl</code> object with the given
2859      * <code>Date</code> object.
2860      *
2861      * This method updates a column value in either the current row or
2862      * the insert row of this rowset, but it does not update the
2863      * database.  If the cursor is on a row in the rowset, the
2864      * method {@link #updateRow} must be called to update the database.
2865      * If the cursor is on the insert row, the method {@link #insertRow}
2866      * must be called, which will insert the new row into both this rowset
2867      * and the database. Both of these methods must be called before the
2868      * cursor moves to another row.
2869      *
2870      * @param columnIndex the first column is <code>1</code>, the second
2871      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2872      *        and equal to or less than the number of columns in this rowset
2873      * @param x the new column value
2874      * @throws SQLException if (1) the given column index is out of bounds,
2875      *            (2) the cursor is not on one of this rowset's rows or its
2876      *            insert row, (3) the type of the designated column is not
2877      *            an SQL <code>DATE</code> or <code>TIMESTAMP</code>, or
2878      *            (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2879      */
2880     public void updateDate(int columnIndex, java.sql.Date x) throws SQLException {
2881         throw new UnsupportedOperationException();
2882     }
2883 
2884     /**
2885      * Sets the designated column in either the current row or the insert
2886      * row of this <code>CachedRowSetImpl</code> object with the given
2887      * <code>Time</code> object.
2888      *
2889      * This method updates a column value in either the current row or
2890      * the insert row of this rowset, but it does not update the
2891      * database.  If the cursor is on a row in the rowset, the
2892      * method {@link #updateRow} must be called to update the database.
2893      * If the cursor is on the insert row, the method {@link #insertRow}
2894      * must be called, which will insert the new row into both this rowset
2895      * and the database. Both of these methods must be called before the
2896      * cursor moves to another row.
2897      *
2898      * @param columnIndex the first column is <code>1</code>, the second
2899      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2900      *        and equal to or less than the number of columns in this rowset
2901      * @param x the new column value
2902      * @throws SQLException if (1) the given column index is out of bounds,
2903      *            (2) the cursor is not on one of this rowset's rows or its
2904      *            insert row, (3) the type of the designated column is not
2905      *            an SQL <code>TIME</code> or <code>TIMESTAMP</code>, or
2906      *            (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2907      */
2908     public void updateTime(int columnIndex, java.sql.Time x) throws SQLException {
2909        throw new UnsupportedOperationException();
2910     }
2911 
2912     /**
2913      * Sets the designated column in either the current row or the insert
2914      * row of this <code>CachedRowSetImpl</code> object with the given
2915      * <code>Timestamp</code> object.
2916      *
2917      * This method updates a column value in either the current row or
2918      * the insert row of this rowset, but it does not update the
2919      * database.  If the cursor is on a row in the rowset, the
2920      * method {@link #updateRow} must be called to update the database.
2921      * If the cursor is on the insert row, the method {@link #insertRow}
2922      * must be called, which will insert the new row into both this rowset
2923      * and the database. Both of these methods must be called before the
2924      * cursor moves to another row.
2925      *
2926      * @param columnIndex the first column is <code>1</code>, the second
2927      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2928      *        and equal to or less than the number of columns in this rowset
2929      * @param x the new column value
2930      * @throws SQLException if (1) the given column index is out of bounds,
2931      *            (2) the cursor is not on one of this rowset's rows or its
2932      *            insert row, (3) the type of the designated column is not
2933      *            an SQL <code>DATE</code>, <code>TIME</code>, or
2934      *            <code>TIMESTAMP</code>, or (4) this rowset is
2935      *            <code>ResultSet.CONCUR_READ_ONLY</code>
2936      */
2937     public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException {
2938         throw new UnsupportedOperationException();
2939     }
2940 
2941     /**
2942      * Sets the designated column in either the current row or the insert
2943      * row of this <code>CachedRowSetImpl</code> object with the given
2944      * ASCII stream value.
2945      * <P>
2946      * This method updates a column value in either the current row or
2947      * the insert row of this rowset, but it does not update the
2948      * database.  If the cursor is on a row in the rowset, the
2949      * method {@link #updateRow} must be called to update the database.
2950      * If the cursor is on the insert row, the method {@link #insertRow}
2951      * must be called, which will insert the new row into both this rowset
2952      * and the database. Both of these methods must be called before the
2953      * cursor moves to another row.
2954      *
2955      * @param columnIndex the first column is <code>1</code>, the second
2956      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2957      *        and equal to or less than the number of columns in this rowset
2958      * @param x the new column value
2959      * @param length the number of one-byte ASCII characters in the stream
2960      * @throws SQLException if this method is invoked
2961      */
2962     public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException {
2963         throw new UnsupportedOperationException();
2964     }
2965 
2966     /**
2967      * Sets the designated column in either the current row or the insert
2968      * row of this <code>CachedRowSetImpl</code> object with the given
2969      * <code>java.io.InputStream</code> object.
2970      * <P>
2971      * This method updates a column value in either the current row or
2972      * the insert row of this rowset, but it does not update the
2973      * database.  If the cursor is on a row in the rowset, the
2974      * method {@link #updateRow} must be called to update the database.
2975      * If the cursor is on the insert row, the method {@link #insertRow}
2976      * must be called, which will insert the new row into both this rowset
2977      * and the database. Both of these methods must be called before the
2978      * cursor moves to another row.
2979      *
2980      * @param columnIndex the first column is <code>1</code>, the second
2981      *        is <code>2</code>, and so on; must be <code>1</code> or larger
2982      *        and equal to or less than the number of columns in this rowset
2983      * @param x the new column value; must be a <code>java.io.InputStream</code>
2984      *          containing <code>BINARY</code>, <code>VARBINARY</code>, or
2985      *          <code>LONGVARBINARY</code> data
2986      * @param length the length of the stream in bytes
2987      * @throws SQLException if (1) the given column index is out of bounds,
2988      *            (2) the cursor is not on one of this rowset's rows or its
2989      *            insert row, (3) the data in the stream is not binary, or
2990      *            (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2991      */
2992     public void updateBinaryStream(int columnIndex, java.io.InputStream x,int length) throws SQLException {
2993         throw new UnsupportedOperationException();
2994     }
2995 
2996     /**
2997      * Sets the designated column in either the current row or the insert
2998      * row of this <code>CachedRowSetImpl</code> object with the given
2999      * <code>java.io.Reader</code> object.
3000      * <P>
3001      * This method updates a column value in either the current row or
3002      * the insert row of this rowset, but it does not update the
3003      * database.  If the cursor is on a row in the rowset, the
3004      * method {@link #updateRow} must be called to update the database.
3005      * If the cursor is on the insert row, the method {@link #insertRow}
3006      * must be called, which will insert the new row into both this rowset
3007      * and the database. Both of these methods must be called before the
3008      * cursor moves to another row.
3009      *
3010      * @param columnIndex the first column is <code>1</code>, the second
3011      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3012      *        and equal to or less than the number of columns in this rowset
3013      * @param x the new column value; must be a <code>java.io.Reader</code>
3014      *          containing <code>BINARY</code>, <code>VARBINARY</code>,
3015      *          <code>LONGVARBINARY</code>, <code>CHAR</code>, <code>VARCHAR</code>,
3016      *          or <code>LONGVARCHAR</code> data
3017      * @param length the length of the stream in characters
3018      * @throws SQLException if (1) the given column index is out of bounds,
3019      *            (2) the cursor is not on one of this rowset's rows or its
3020      *            insert row, (3) the data in the stream is not a binary or
3021      *            character type, or (4) this rowset is
3022      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3023      */
3024     public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException {
3025         throw new UnsupportedOperationException();
3026     }
3027 
3028     /**
3029      * Sets the designated column in either the current row or the insert
3030      * row of this <code>CachedRowSetImpl</code> object with the given
3031      * <code>Object</code> value.  The <code>scale</code> parameter indicates
3032      * the number of digits to the right of the decimal point and is ignored
3033      * if the new column value is not a type that will be mapped to an SQL
3034      * <code>DECIMAL</code> or <code>NUMERIC</code> value.
3035      * <P>
3036      * This method updates a column value in either the current row or
3037      * the insert row of this rowset, but it does not update the
3038      * database.  If the cursor is on a row in the rowset, the
3039      * method {@link #updateRow} must be called to update the database.
3040      * If the cursor is on the insert row, the method {@link #insertRow}
3041      * must be called, which will insert the new row into both this rowset
3042      * and the database. Both of these methods must be called before the
3043      * cursor moves to another row.
3044      *
3045      * @param columnIndex the first column is <code>1</code>, the second
3046      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3047      *        and equal to or less than the number of columns in this rowset
3048      * @param x the new column value
3049      * @param scale the number of digits to the right of the decimal point (for
3050      *              <code>DECIMAL</code> and <code>NUMERIC</code> types only)
3051      * @throws SQLException if (1) the given column index is out of bounds,
3052      *            (2) the cursor is not on one of this rowset's rows or its
3053      *            insert row, or (3) this rowset is
3054      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3055      */
3056     public void updateObject(int columnIndex, Object x, int scale) throws SQLException {
3057        throw new UnsupportedOperationException();
3058     }
3059 
3060     /**
3061      * Sets the designated column in either the current row or the insert
3062      * row of this <code>CachedRowSetImpl</code> object with the given
3063      * <code>Object</code> value.
3064      * <P>
3065      * This method updates a column value in either the current row or
3066      * the insert row of this rowset, but it does not update the
3067      * database.  If the cursor is on a row in the rowset, the
3068      * method {@link #updateRow} must be called to update the database.
3069      * If the cursor is on the insert row, the method {@link #insertRow}
3070      * must be called, which will insert the new row into both this rowset
3071      * and the database. Both of these methods must be called before the
3072      * cursor moves to another row.
3073      *
3074      * @param columnIndex the first column is <code>1</code>, the second
3075      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3076      *        and equal to or less than the number of columns in this rowset
3077      * @param x the new column value
3078      * @throws SQLException if (1) the given column index is out of bounds,
3079      *            (2) the cursor is not on one of this rowset's rows or its
3080      *            insert row, or (3) this rowset is
3081      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3082      */
3083     public void updateObject(int columnIndex, Object x) throws SQLException {
3084         throw new UnsupportedOperationException();
3085     }
3086 
3087 
3088     /**
3089      * Sets the designated nullable column in the current row or the
3090      * insert row of this <code>CachedRowSetImpl</code> object with
3091      * <code>null</code> value.
3092      * <P>
3093      * This method updates a column value in the current row or the insert
3094      * row of this rowset, but it does not update the database.
3095      * If the cursor is on a row in the rowset, the
3096      * method {@link #updateRow} must be called to update the database.
3097      * If the cursor is on the insert row, the method {@link #insertRow}
3098      * must be called, which will insert the new row into both this rowset
3099      * and the database.
3100      *
3101      * @param columnName a <code>String</code> object that must match the
3102      *        SQL name of a column in this rowset, ignoring case
3103      * @throws SQLException if (1) the given column name does not match the
3104      *            name of a column in this rowset, (2) the cursor is not on
3105      *            one of this rowset's rows or its insert row, or (3) this
3106      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3107      */
3108     public void updateNull(String columnName) throws SQLException {
3109         throw new UnsupportedOperationException();
3110     }
3111 
3112     /**
3113      * Sets the designated column in either the current row or the insert
3114      * row of this <code>CachedRowSetImpl</code> object with the given
3115      * <code>boolean</code> value.
3116      * <P>
3117      * This method updates a column value in the current row or the insert
3118      * row of this rowset, but it does not update the database.
3119      * If the cursor is on a row in the rowset, the
3120      * method {@link #updateRow} must be called to update the database.
3121      * If the cursor is on the insert row, the method {@link #insertRow}
3122      * must be called, which will insert the new row into both this rowset
3123      * and the database. Both of these methods must be called before the
3124      * cursor moves to another row.
3125      *
3126      * @param columnName a <code>String</code> object that must match the
3127      *        SQL name of a column in this rowset, ignoring case
3128      * @param x the new column value
3129      * @throws SQLException if (1) the given column name does not match the
3130      *            name of a column in this rowset, (2) the cursor is not on
3131      *            one of this rowset's rows or its insert row, or (3) this
3132      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3133      */
3134     public void updateBoolean(String columnName, boolean x) throws SQLException {
3135        throw new UnsupportedOperationException();
3136     }
3137 
3138     /**
3139      * Sets the designated column in either the current row or the insert
3140      * row of this <code>CachedRowSetImpl</code> object with the given
3141      * <code>byte</code> value.
3142      * <P>
3143      * This method updates a column value in the current row or the insert
3144      * row of this rowset, but it does not update the database.
3145      * If the cursor is on a row in the rowset, the
3146      * method {@link #updateRow} must be called to update the database.
3147      * If the cursor is on the insert row, the method {@link #insertRow}
3148      * must be called, which will insert the new row into both this rowset
3149      * and the database. Both of these methods must be called before the
3150      * cursor moves to another row.
3151      *
3152      * @param columnName a <code>String</code> object that must match the
3153      *        SQL name of a column in this rowset, ignoring case
3154      * @param x the new column value
3155      * @throws SQLException if (1) the given column name does not match the
3156      *            name of a column in this rowset, (2) the cursor is not on
3157      *            one of this rowset's rows or its insert row, or (3) this
3158      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3159      */
3160     public void updateByte(String columnName, byte x) throws SQLException {
3161         throw new UnsupportedOperationException();
3162     }
3163 
3164     /**
3165      * Sets the designated column in either the current row or the insert
3166      * row of this <code>CachedRowSetImpl</code> object with the given
3167      * <code>short</code> value.
3168      * <P>
3169      * This method updates a column value in the current row or the insert
3170      * row of this rowset, but it does not update the database.
3171      * If the cursor is on a row in the rowset, the
3172      * method {@link #updateRow} must be called to update the database.
3173      * If the cursor is on the insert row, the method {@link #insertRow}
3174      * must be called, which will insert the new row into both this rowset
3175      * and the database. Both of these methods must be called before the
3176      * cursor moves to another row.
3177      *
3178      * @param columnName a <code>String</code> object that must match the
3179      *        SQL name of a column in this rowset, ignoring case
3180      * @param x the new column value
3181      * @throws SQLException if (1) the given column name does not match the
3182      *            name of a column in this rowset, (2) the cursor is not on
3183      *            one of this rowset's rows or its insert row, or (3) this
3184      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3185      */
3186     public void updateShort(String columnName, short x) throws SQLException {
3187         throw new UnsupportedOperationException();
3188     }
3189 
3190     /**
3191      * Sets the designated column in either the current row or the insert
3192      * row of this <code>CachedRowSetImpl</code> object with the given
3193      * <code>int</code> value.
3194      * <P>
3195      * This method updates a column value in the current row or the insert
3196      * row of this rowset, but it does not update the database.
3197      * If the cursor is on a row in the rowset, the
3198      * method {@link #updateRow} must be called to update the database.
3199      * If the cursor is on the insert row, the method {@link #insertRow}
3200      * must be called, which will insert the new row into both this rowset
3201      * and the database. Both of these methods must be called before the
3202      * cursor moves to another row.
3203      *
3204      * @param columnName a <code>String</code> object that must match the
3205      *        SQL name of a column in this rowset, ignoring case
3206      * @param x the new column value
3207      * @throws SQLException if (1) the given column name does not match the
3208      *            name of a column in this rowset, (2) the cursor is not on
3209      *            one of this rowset's rows or its insert row, or (3) this
3210      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3211      */
3212     public void updateInt(String columnName, int x) throws SQLException {
3213         throw new UnsupportedOperationException();
3214     }
3215 
3216     /**
3217      * Sets the designated column in either the current row or the insert
3218      * row of this <code>CachedRowSetImpl</code> object with the given
3219      * <code>long</code> value.
3220      * <P>
3221      * This method updates a column value in the current row or the insert
3222      * row of this rowset, but it does not update the database.
3223      * If the cursor is on a row in the rowset, the
3224      * method {@link #updateRow} must be called to update the database.
3225      * If the cursor is on the insert row, the method {@link #insertRow}
3226      * must be called, which will insert the new row into both this rowset
3227      * and the database. Both of these methods must be called before the
3228      * cursor moves to another row.
3229      *
3230      * @param columnName a <code>String</code> object that must match the
3231      *        SQL name of a column in this rowset, ignoring case
3232      * @param x the new column value
3233      * @throws SQLException if (1) the given column name does not match the
3234      *            name of a column in this rowset, (2) the cursor is not on
3235      *            one of this rowset's rows or its insert row, or (3) this
3236      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3237      */
3238     public void updateLong(String columnName, long x) throws SQLException {
3239         throw new UnsupportedOperationException();
3240     }
3241 
3242     /**
3243      * Sets the designated column in either the current row or the insert
3244      * row of this <code>CachedRowSetImpl</code> object with the given
3245      * <code>float</code> value.
3246      * <P>
3247      * This method updates a column value in the current row or the insert
3248      * row of this rowset, but it does not update the database.
3249      * If the cursor is on a row in the rowset, the
3250      * method {@link #updateRow} must be called to update the database.
3251      * If the cursor is on the insert row, the method {@link #insertRow}
3252      * must be called, which will insert the new row into both this rowset
3253      * and the database. Both of these methods must be called before the
3254      * cursor moves to another row.
3255      *
3256      * @param columnName a <code>String</code> object that must match the
3257      *        SQL name of a column in this rowset, ignoring case
3258      * @param x the new column value
3259      * @throws SQLException if (1) the given column name does not match the
3260      *            name of a column in this rowset, (2) the cursor is not on
3261      *            one of this rowset's rows or its insert row, or (3) this
3262      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3263      */
3264     public void updateFloat(String columnName, float x) throws SQLException {
3265         throw new UnsupportedOperationException();
3266     }
3267 
3268     /**
3269      * Sets the designated column in either the current row or the insert
3270      * row of this <code>CachedRowSetImpl</code> object with the given
3271      * <code>double</code> value.
3272      *
3273      * This method updates a column value in either the current row or
3274      * the insert row of this rowset, but it does not update the
3275      * database.  If the cursor is on a row in the rowset, the
3276      * method {@link #updateRow} must be called to update the database.
3277      * If the cursor is on the insert row, the method {@link #insertRow}
3278      * must be called, which will insert the new row into both this rowset
3279      * and the database. Both of these methods must be called before the
3280      * cursor moves to another row.
3281      *
3282      * @param columnName a <code>String</code> object that must match the
3283      *        SQL name of a column in this rowset, ignoring case
3284      * @param x the new column value
3285      * @throws SQLException if (1) the given column name does not match the
3286      *            name of a column in this rowset, (2) the cursor is not on
3287      *            one of this rowset's rows or its insert row, or (3) this
3288      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3289      */
3290     public void updateDouble(String columnName, double x) throws SQLException {
3291         throw new UnsupportedOperationException();
3292     }
3293 
3294     /**
3295      * Sets the designated column in either the current row or the insert
3296      * row of this <code>CachedRowSetImpl</code> object with the given
3297      * <code>java.math.BigDecimal</code> object.
3298      * <P>
3299      * This method updates a column value in the current row or the insert
3300      * row of this rowset, but it does not update the database.
3301      * If the cursor is on a row in the rowset, the
3302      * method {@link #updateRow} must be called to update the database.
3303      * If the cursor is on the insert row, the method {@link #insertRow}
3304      * must be called, which will insert the new row into both this rowset
3305      * and the database. Both of these methods must be called before the
3306      * cursor moves to another row.
3307      *
3308      * @param columnName a <code>String</code> object that must match the
3309      *        SQL name of a column in this rowset, ignoring case
3310      * @param x the new column value
3311      * @throws SQLException if (1) the given column name does not match the
3312      *            name of a column in this rowset, (2) the cursor is not on
3313      *            one of this rowset's rows or its insert row, or (3) this
3314      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3315      */
3316     public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException {
3317         throw new UnsupportedOperationException();
3318     }
3319 
3320     /**
3321      * Sets the designated column in either the current row or the insert
3322      * row of this <code>CachedRowSetImpl</code> object with the given
3323      * <code>String</code> object.
3324      *
3325      * This method updates a column value in either the current row or
3326      * the insert row of this rowset, but it does not update the
3327      * database.  If the cursor is on a row in the rowset, the
3328      * method {@link #updateRow} must be called to update the database.
3329      * If the cursor is on the insert row, the method {@link #insertRow}
3330      * must be called, which will insert the new row into both this rowset
3331      * and the database. Both of these methods must be called before the
3332      * cursor moves to another row.
3333      *
3334      * @param columnName a <code>String</code> object that must match the
3335      *        SQL name of a column in this rowset, ignoring case
3336      * @param x the new column value
3337      * @throws SQLException if (1) the given column name does not match the
3338      *            name of a column in this rowset, (2) the cursor is not on
3339      *            one of this rowset's rows or its insert row, or (3) this
3340      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3341      */
3342     public void updateString(String columnName, String x) throws SQLException {
3343         throw new UnsupportedOperationException();
3344     }
3345 
3346     /**
3347      * Sets the designated column in either the current row or the insert
3348      * row of this <code>CachedRowSetImpl</code> object with the given
3349      * <code>byte</code> array.
3350      *
3351      * This method updates a column value in either the current row or
3352      * the insert row of this rowset, but it does not update the
3353      * database.  If the cursor is on a row in the rowset, the
3354      * method {@link #updateRow} must be called to update the database.
3355      * If the cursor is on the insert row, the method {@link #insertRow}
3356      * must be called, which will insert the new row into both this rowset
3357      * and the database. Both of these methods must be called before the
3358      * cursor moves to another row.
3359      *
3360      * @param columnName a <code>String</code> object that must match the
3361      *        SQL name of a column in this rowset, ignoring case
3362      * @param x the new column value
3363      * @throws SQLException if (1) the given column name does not match the
3364      *            name of a column in this rowset, (2) the cursor is not on
3365      *            one of this rowset's rows or its insert row, or (3) this
3366      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3367      */
3368     public void updateBytes(String columnName, byte x[]) throws SQLException {
3369         throw new UnsupportedOperationException();
3370     }
3371 
3372     /**
3373      * Sets the designated column in either the current row or the insert
3374      * row of this <code>CachedRowSetImpl</code> object with the given
3375      * <code>Date</code> object.
3376      *
3377      * This method updates a column value in either the current row or
3378      * the insert row of this rowset, but it does not update the
3379      * database.  If the cursor is on a row in the rowset, the
3380      * method {@link #updateRow} must be called to update the database.
3381      * If the cursor is on the insert row, the method {@link #insertRow}
3382      * must be called, which will insert the new row into both this rowset
3383      * and the database. Both of these methods must be called before the
3384      * cursor moves to another row.
3385      *
3386      * @param columnName a <code>String</code> object that must match the
3387      *        SQL name of a column in this rowset, ignoring case
3388      * @param x the new column value
3389      * @throws SQLException if (1) the given column name does not match the
3390      *            name of a column in this rowset, (2) the cursor is not on
3391      *            one of this rowset's rows or its insert row, (3) the type
3392      *            of the designated column is not an SQL <code>DATE</code> or
3393      *            <code>TIMESTAMP</code>, or (4) this rowset is
3394      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3395      */
3396     public void updateDate(String columnName, java.sql.Date x) throws SQLException {
3397         throw new UnsupportedOperationException();
3398     }
3399 
3400     /**
3401      * Sets the designated column in either the current row or the insert
3402      * row of this <code>CachedRowSetImpl</code> object with the given
3403      * <code>Time</code> object.
3404      *
3405      * This method updates a column value in either the current row or
3406      * the insert row of this rowset, but it does not update the
3407      * database.  If the cursor is on a row in the rowset, the
3408      * method {@link #updateRow} must be called to update the database.
3409      * If the cursor is on the insert row, the method {@link #insertRow}
3410      * must be called, which will insert the new row into both this rowset
3411      * and the database. Both of these methods must be called before the
3412      * cursor moves to another row.
3413      *
3414      * @param columnName a <code>String</code> object that must match the
3415      *        SQL name of a column in this rowset, ignoring case
3416      * @param x the new column value
3417      * @throws SQLException if (1) the given column name does not match the
3418      *            name of a column in this rowset, (2) the cursor is not on
3419      *            one of this rowset's rows or its insert row, (3) the type
3420      *            of the designated column is not an SQL <code>TIME</code> or
3421      *            <code>TIMESTAMP</code>, or (4) this rowset is
3422      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3423      */
3424     public void updateTime(String columnName, java.sql.Time x) throws SQLException {
3425         throw new UnsupportedOperationException();
3426     }
3427 
3428     /**
3429      * Sets the designated column in either the current row or the insert
3430      * row of this <code>CachedRowSetImpl</code> object with the given
3431      * <code>Timestamp</code> object.
3432      *
3433      * This method updates a column value in either the current row or
3434      * the insert row of this rowset, but it does not update the
3435      * database.  If the cursor is on a row in the rowset, the
3436      * method {@link #updateRow} must be called to update the database.
3437      * If the cursor is on the insert row, the method {@link #insertRow}
3438      * must be called, which will insert the new row into both this rowset
3439      * and the database. Both of these methods must be called before the
3440      * cursor moves to another row.
3441      *
3442      * @param columnName a <code>String</code> object that must match the
3443      *        SQL name of a column in this rowset, ignoring case
3444      * @param x the new column value
3445      * @throws SQLException if the given column index is out of bounds or
3446      *            the cursor is not on one of this rowset's rows or its
3447      *            insert row
3448      * @throws SQLException if (1) the given column name does not match the
3449      *            name of a column in this rowset, (2) the cursor is not on
3450      *            one of this rowset's rows or its insert row, (3) the type
3451      *            of the designated column is not an SQL <code>DATE</code>,
3452      *            <code>TIME</code>, or <code>TIMESTAMP</code>, or (4) this
3453      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3454      */
3455     public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException {
3456         throw new UnsupportedOperationException();
3457     }
3458 
3459     /**
3460      * Sets the designated column in either the current row or the insert
3461      * row of this <code>CachedRowSetImpl</code> object with the given
3462      * ASCII stream value.
3463      * <P>
3464      * This method updates a column value in either the current row or
3465      * the insert row of this rowset, but it does not update the
3466      * database.  If the cursor is on a row in the rowset, the
3467      * method {@link #updateRow} must be called to update the database.
3468      * If the cursor is on the insert row, the method {@link #insertRow}
3469      * must be called, which will insert the new row into both this rowset
3470      * and the database. Both of these methods must be called before the
3471      * cursor moves to another row.
3472      *
3473      * @param columnName a <code>String</code> object that must match the
3474      *        SQL name of a column in this rowset, ignoring case
3475      * @param x the new column value
3476      * @param length the number of one-byte ASCII characters in the stream
3477      */
3478     public void updateAsciiStream(String columnName,
3479     java.io.InputStream x,
3480     int length) throws SQLException {
3481        throw new UnsupportedOperationException();
3482     }
3483 
3484     /**
3485      * Sets the designated column in either the current row or the insert
3486      * row of this <code>CachedRowSetImpl</code> object with the given
3487      * <code>java.io.InputStream</code> object.
3488      * <P>
3489      * This method updates a column value in either the current row or
3490      * the insert row of this rowset, but it does not update the
3491      * database.  If the cursor is on a row in the rowset, the
3492      * method {@link #updateRow} must be called to update the database.
3493      * If the cursor is on the insert row, the method {@link #insertRow}
3494      * must be called, which will insert the new row into both this rowset
3495      * and the database. Both of these methods must be called before the
3496      * cursor moves to another row.
3497      *
3498      * @param columnName a <code>String</code> object that must match the
3499      *        SQL name of a column in this rowset, ignoring case
3500      * @param x the new column value; must be a <code>java.io.InputStream</code>
3501      *          containing <code>BINARY</code>, <code>VARBINARY</code>, or
3502      *          <code>LONGVARBINARY</code> data
3503      * @param length the length of the stream in bytes
3504      * @throws SQLException if (1) the given column name does not match the
3505      *            name of a column in this rowset, (2) the cursor is not on
3506      *            one of this rowset's rows or its insert row, (3) the data
3507      *            in the stream is not binary, or (4) this rowset is
3508      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3509      */
3510     public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException {
3511         throw new UnsupportedOperationException();
3512     }
3513 
3514     /**
3515      * Sets the designated column in either the current row or the insert
3516      * row of this <code>CachedRowSetImpl</code> object with the given
3517      * <code>java.io.Reader</code> object.
3518      * <P>
3519      * This method updates a column value in either the current row or
3520      * the insert row of this rowset, but it does not update the
3521      * database.  If the cursor is on a row in the rowset, the
3522      * method {@link #updateRow} must be called to update the database.
3523      * If the cursor is on the insert row, the method {@link #insertRow}
3524      * must be called, which will insert the new row into both this rowset
3525      * and the database. Both of these methods must be called before the
3526      * cursor moves to another row.
3527      *
3528      * @param columnName a <code>String</code> object that must match the
3529      *        SQL name of a column in this rowset, ignoring case
3530      * @param reader the new column value; must be a
3531      * <code>java.io.Reader</code> containing <code>BINARY</code>,
3532      * <code>VARBINARY</code>, <code>LONGVARBINARY</code>, <code>CHAR</code>,
3533      * <code>VARCHAR</code>, or <code>LONGVARCHAR</code> data
3534      * @param length the length of the stream in characters
3535      * @throws SQLException if (1) the given column name does not match the
3536      *            name of a column in this rowset, (2) the cursor is not on
3537      *            one of this rowset's rows or its insert row, (3) the data
3538      *            in the stream is not a binary or character type, or (4) this
3539      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3540      */
3541     public void updateCharacterStream(String columnName,
3542     java.io.Reader reader,
3543     int length) throws SQLException {
3544         throw new UnsupportedOperationException();
3545     }
3546 
3547     /**
3548      * Sets the designated column in either the current row or the insert
3549      * row of this <code>CachedRowSetImpl</code> object with the given
3550      * <code>Object</code> value.  The <code>scale</code> parameter
3551      * indicates the number of digits to the right of the decimal point
3552      * and is ignored if the new column value is not a type that will be
3553      *  mapped to an SQL <code>DECIMAL</code> or <code>NUMERIC</code> value.
3554      * <P>
3555      * This method updates a column value in either the current row or
3556      * the insert row of this rowset, but it does not update the
3557      * database.  If the cursor is on a row in the rowset, the
3558      * method {@link #updateRow} must be called to update the database.
3559      * If the cursor is on the insert row, the method {@link #insertRow}
3560      * must be called, which will insert the new row into both this rowset
3561      * and the database. Both of these methods must be called before the
3562      * cursor moves to another row.
3563      *
3564      * @param columnName a <code>String</code> object that must match the
3565      *        SQL name of a column in this rowset, ignoring case
3566      * @param x the new column value
3567      * @param scale the number of digits to the right of the decimal point (for
3568      *              <code>DECIMAL</code> and <code>NUMERIC</code> types only)
3569      * @throws SQLException if (1) the given column name does not match the
3570      *            name of a column in this rowset, (2) the cursor is not on
3571      *            one of this rowset's rows or its insert row, or (3) this
3572      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3573      */
3574     public void updateObject(String columnName, Object x, int scale) throws SQLException {
3575         throw new UnsupportedOperationException();
3576     }
3577 
3578     /**
3579      * Sets the designated column in either the current row or the insert
3580      * row of this <code>CachedRowSetImpl</code> object with the given
3581      * <code>Object</code> value.
3582      * <P>
3583      * This method updates a column value in either the current row or
3584      * the insert row of this rowset, but it does not update the
3585      * database.  If the cursor is on a row in the rowset, the
3586      * method {@link #updateRow} must be called to update the database.
3587      * If the cursor is on the insert row, the method {@link #insertRow}
3588      * must be called, which will insert the new row into both this rowset
3589      * and the database. Both of these methods must be called before the
3590      * cursor moves to another row.
3591      *
3592      * @param columnName a <code>String</code> object that must match the
3593      *        SQL name of a column in this rowset, ignoring case
3594      * @param x the new column value
3595      * @throws SQLException if (1) the given column name does not match the
3596      *            name of a column in this rowset, (2) the cursor is not on
3597      *            one of this rowset's rows or its insert row, or (3) this
3598      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3599      */
3600     public void updateObject(String columnName, Object x) throws SQLException {
3601         throw new UnsupportedOperationException();
3602     }
3603 
3604     /**
3605      * Inserts the contents of this <code>CachedRowSetImpl</code> object's insert
3606      * row into this rowset immediately following the current row.
3607      * If the current row is the
3608      * position after the last row or before the first row, the new row will
3609      * be inserted at the end of the rowset.  This method also notifies
3610      * listeners registered with this rowset that the row has changed.
3611      * <P>
3612      * The cursor must be on the insert row when this method is called.
3613      *
3614      * @throws SQLException if (1) the cursor is not on the insert row,
3615      *            (2) one or more of the non-nullable columns in the insert
3616      *            row has not been given a value, or (3) this rowset is
3617      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3618      */
3619     public void insertRow() throws SQLException {
3620         throw new UnsupportedOperationException();
3621     }
3622 
3623     /**
3624      * Marks the current row of this <code>CachedRowSetImpl</code> object as
3625      * updated and notifies listeners registered with this rowset that the
3626      * row has changed.
3627      * <P>
3628      * This method  cannot be called when the cursor is on the insert row, and
3629      * it should be called before the cursor moves to another row.  If it is
3630      * called after the cursor moves to another row, this method has no effect,
3631      * and the updates made before the cursor moved will be lost.
3632      *
3633      * @throws SQLException if the cursor is on the insert row or this
3634      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3635      */
3636     public void updateRow() throws SQLException {
3637         throw new UnsupportedOperationException();
3638     }
3639 
3640     /**
3641      * Deletes the current row from this <code>CachedRowSetImpl</code> object and
3642      * notifies listeners registered with this rowset that a row has changed.
3643      * This method cannot be called when the cursor is on the insert row.
3644      * <P>
3645      * This method marks the current row as deleted, but it does not delete
3646      * the row from the underlying data source.  The method
3647      * <code>acceptChanges</code> must be called to delete the row in
3648      * the data source.
3649      *
3650      * @throws SQLException if (1) this method is called when the cursor
3651      *            is on the insert row, before the first row, or after the
3652      *            last row or (2) this rowset is
3653      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3654      */
3655     public void deleteRow() throws SQLException {
3656         throw new UnsupportedOperationException();
3657     }
3658 
3659     /**
3660      * Sets the current row with its original value and marks the row as
3661      * not updated, thus undoing any changes made to the row since the
3662      * last call to the methods <code>updateRow</code> or <code>deleteRow</code>.
3663      * This method should be called only when the cursor is on a row in
3664      * this rowset.
3665      *
3666      * @throws SQLException if the cursor is on the insert row, before the
3667      *            first row, or after the last row
3668      */
3669     public void refreshRow() throws SQLException {
3670         throw new UnsupportedOperationException();
3671     }
3672 
3673     /**
3674      * Rolls back any updates made to the current row of this
3675      * <code>CachedRowSetImpl</code> object and notifies listeners that
3676      * a row has changed.  To have an effect, this method
3677      * must be called after an <code>updateXXX</code> method has been
3678      * called and before the method <code>updateRow</code> has been called.
3679      * If no updates have been made or the method <code>updateRow</code>
3680      * has already been called, this method has no effect.
3681      *
3682      * @throws SQLException if the cursor is on the insert row, before the
3683      *            first row, or after the last row
3684      */
3685     public void cancelRowUpdates() throws SQLException {
3686         throw new UnsupportedOperationException();
3687     }
3688 
3689     /**
3690      * Moves the cursor for this <code>CachedRowSetImpl</code> object
3691      * to the insert row.  The current row in the rowset is remembered
3692      * while the cursor is on the insert row.
3693      * <P>
3694      * The insert row is a special row associated with an updatable
3695      * rowset.  It is essentially a buffer where a new row may
3696      * be constructed by calling the appropriate <code>updateXXX</code>
3697      * methods to assign a value to each column in the row.  A complete
3698      * row must be constructed; that is, every column that is not nullable
3699      * must be assigned a value.  In order for the new row to become part
3700      * of this rowset, the method <code>insertRow</code> must be called
3701      * before the cursor is moved back to the rowset.
3702      * <P>
3703      * Only certain methods may be invoked while the cursor is on the insert
3704      * row; many methods throw an exception if they are called while the
3705      * cursor is there.  In addition to the <code>updateXXX</code>
3706      * and <code>insertRow</code> methods, only the <code>getXXX</code> methods
3707      * may be called when the cursor is on the insert row.  A <code>getXXX</code>
3708      * method should be called on a column only after an <code>updateXXX</code>
3709      * method has been called on that column; otherwise, the value returned is
3710      * undetermined.
3711      *
3712      * @throws SQLException if this <code>CachedRowSetImpl</code> object is
3713      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3714      */
3715     public void moveToInsertRow() throws SQLException {
3716         throw new UnsupportedOperationException();
3717     }
3718 
3719     /**
3720      * Moves the cursor for this <code>CachedRowSetImpl</code> object to
3721      * the current row.  The current row is the row the cursor was on
3722      * when the method <code>moveToInsertRow</code> was called.
3723      * <P>
3724      * Calling this method has no effect unless it is called while the
3725      * cursor is on the insert row.
3726      *
3727      * @throws SQLException if an error occurs
3728      */
3729     public void moveToCurrentRow() throws SQLException {
3730         throw new UnsupportedOperationException();
3731     }
3732 
3733     /**
3734      * Returns <code>null</code>.
3735      *
3736      * @return <code>null</code>
3737      * @throws SQLException if an error occurs
3738      */
3739     public Statement getStatement() throws SQLException {
3740         throw new UnsupportedOperationException();
3741     }
3742 
3743     /**
3744      * Retrieves the value of the designated column in this
3745      * <code>CachedRowSetImpl</code> object as an <code>Object</code> in
3746      * the Java programming language, using the given
3747      * <code>java.util.Map</code> object to custom map the value if
3748      * appropriate.
3749      *
3750      * @param columnIndex the first column is <code>1</code>, the second
3751      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3752      *        and equal to or less than the number of columns in this rowset
3753      * @param map a <code>java.util.Map</code> object showing the mapping
3754      *            from SQL type names to classes in the Java programming
3755      *            language
3756      * @return an <code>Object</code> representing the SQL value
3757      * @throws SQLException if the given column index is out of bounds or
3758      *            the cursor is not on one of this rowset's rows or its
3759      *            insert row
3760      */
3761     public Object getObject(int columnIndex,
3762                             java.util.Map<String,Class<?>> map)
3763           throws SQLException
3764     {
3765        throw new UnsupportedOperationException();
3766     }
3767 
3768     /**
3769      * Retrieves the value of the designated column in this
3770      * <code>CachedRowSetImpl</code> object as a <code>Ref</code> object
3771      * in the Java programming language.
3772      *
3773      * @param columnIndex the first column is <code>1</code>, the second
3774      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3775      *        and equal to or less than the number of columns in this rowset
3776      * @return a <code>Ref</code> object representing an SQL<code> REF</code> value
3777      * @throws SQLException if (1) the given column index is out of bounds,
3778      *            (2) the cursor is not on one of this rowset's rows or its
3779      *            insert row, or (3) the designated column does not store an
3780      *            SQL <code>REF</code> value
3781      * @see #getRef(String)
3782      */
3783     public Ref getRef(int columnIndex) throws SQLException {
3784         throw new UnsupportedOperationException();
3785     }
3786 
3787     /**
3788      * Retrieves the value of the designated column in this
3789      * <code>CachedRowSetImpl</code> object as a <code>Blob</code> object
3790      * in the Java programming language.
3791      *
3792      * @param columnIndex the first column is <code>1</code>, the second
3793      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3794      *        and equal to or less than the number of columns in this rowset
3795      * @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
3796      * @throws SQLException if (1) the given column index is out of bounds,
3797      *            (2) the cursor is not on one of this rowset's rows or its
3798      *            insert row, or (3) the designated column does not store an
3799      *            SQL <code>BLOB</code> value
3800      * @see #getBlob(String)
3801      */
3802     public Blob getBlob(int columnIndex) throws SQLException {
3803        throw new UnsupportedOperationException();
3804     }
3805 
3806     /**
3807      * Retrieves the value of the designated column in this
3808      * <code>CachedRowSetImpl</code> object as a <code>Clob</code> object
3809      * in the Java programming language.
3810      *
3811      * @param columnIndex the first column is <code>1</code>, the second
3812      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3813      *        and equal to or less than the number of columns in this rowset
3814      * @return a <code>Clob</code> object representing an SQL <code>CLOB</code> value
3815      * @throws SQLException if (1) the given column index is out of bounds,
3816      *            (2) the cursor is not on one of this rowset's rows or its
3817      *            insert row, or (3) the designated column does not store an
3818      *            SQL <code>CLOB</code> value
3819      * @see #getClob(String)
3820      */
3821     public Clob getClob(int columnIndex) throws SQLException {
3822         throw new UnsupportedOperationException();
3823     }
3824 
3825     /**
3826      * Retrieves the value of the designated column in this
3827      * <code>CachedRowSetImpl</code> object as an <code>Array</code> object
3828      * in the Java programming language.
3829      *
3830      * @param columnIndex the first column is <code>1</code>, the second
3831      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3832      *        and equal to or less than the number of columns in this rowset
3833      * @return an <code>Array</code> object representing an SQL
3834      *         <code>ARRAY</code> value
3835      * @throws SQLException if (1) the given column index is out of bounds,
3836      *            (2) the cursor is not on one of this rowset's rows or its
3837      *            insert row, or (3) the designated column does not store an
3838      *            SQL <code>ARRAY</code> value
3839      * @see #getArray(String)
3840      */
3841     public Array getArray(int columnIndex) throws SQLException {
3842         throw new UnsupportedOperationException();
3843     }
3844 
3845     /**
3846      * Retrieves the value of the designated column in this
3847      * <code>CachedRowSetImpl</code> object as an <code>Object</code> in
3848      * the Java programming language, using the given
3849      * <code>java.util.Map</code> object to custom map the value if
3850      * appropriate.
3851      *
3852      * @param columnName a <code>String</code> object that must match the
3853      *        SQL name of a column in this rowset, ignoring case
3854      * @param map a <code>java.util.Map</code> object showing the mapping
3855      *        from SQL type names to classes in the Java programming
3856      *        language
3857      * @return an <code>Object</code> representing the SQL value
3858      * @throws SQLException if the given column name is not the name of
3859      *         a column in this rowset or the cursor is not on one of
3860      *         this rowset's rows or its insert row
3861      */
3862     public Object getObject(String columnName,
3863                             java.util.Map<String,Class<?>> map)
3864     throws SQLException {
3865         throw new UnsupportedOperationException();
3866     }
3867 
3868     /**
3869      * Retrieves the value of the designated column in this
3870      * <code>CachedRowSetImpl</code> object as a <code>Ref</code> object
3871      * in the Java programming language.
3872      *
3873      * @param colName a <code>String</code> object that must match the
3874      *        SQL name of a column in this rowset, ignoring case
3875      * @return a <code>Ref</code> object representing an SQL<code> REF</code> value
3876      * @throws SQLException  if (1) the given column name is not the name of
3877      *            a column in this rowset, (2) the cursor is not on one of
3878      *            this rowset's rows or its insert row, or (3) the column value
3879      *            is not an SQL <code>REF</code> value
3880      * @see #getRef(int)
3881      */
3882     public Ref getRef(String colName) throws SQLException {
3883         throw new UnsupportedOperationException();
3884     }
3885 
3886     /**
3887      * Retrieves the value of the designated column in this
3888      * <code>CachedRowSetImpl</code> object as a <code>Blob</code> object
3889      * in the Java programming language.
3890      *
3891      * @param colName a <code>String</code> object that must match the
3892      *        SQL name of a column in this rowset, ignoring case
3893      * @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
3894      * @throws SQLException if (1) the given column name is not the name of
3895      *            a column in this rowset, (2) the cursor is not on one of
3896      *            this rowset's rows or its insert row, or (3) the designated
3897      *            column does not store an SQL <code>BLOB</code> value
3898      * @see #getBlob(int)
3899      */
3900     public Blob getBlob(String colName) throws SQLException {
3901        throw new UnsupportedOperationException();
3902     }
3903 
3904     /**
3905      * Retrieves the value of the designated column in this
3906      * <code>CachedRowSetImpl</code> object as a <code>Clob</code> object
3907      * in the Java programming language.
3908      *
3909      * @param colName a <code>String</code> object that must match the
3910      *        SQL name of a column in this rowset, ignoring case
3911      * @return a <code>Clob</code> object representing an SQL
3912      *         <code>CLOB</code> value
3913      * @throws SQLException if (1) the given column name is not the name of
3914      *            a column in this rowset, (2) the cursor is not on one of
3915      *            this rowset's rows or its insert row, or (3) the designated
3916      *            column does not store an SQL <code>CLOB</code> value
3917      * @see #getClob(int)
3918      */
3919     public Clob getClob(String colName) throws SQLException {
3920         throw new UnsupportedOperationException();
3921     }
3922 
3923     /**
3924      * Retrieves the value of the designated column in this
3925      * <code>CachedRowSetImpl</code> object as an <code>Array</code> object
3926      * in the Java programming langugage.
3927      *
3928      * @param colName a <code>String</code> object that must match the
3929      *        SQL name of a column in this rowset, ignoring case
3930      * @return an <code>Array</code> object representing an SQL
3931      *         <code>ARRAY</code> value
3932      * @throws SQLException if (1) the given column name is not the name of
3933      *            a column in this rowset, (2) the cursor is not on one of
3934      *            this rowset's rows or its insert row, or (3) the designated
3935      *            column does not store an SQL <code>ARRAY</code> value
3936      * @see #getArray(int)
3937      */
3938     public Array getArray(String colName) throws SQLException {
3939         throw new UnsupportedOperationException();
3940     }
3941 
3942     /**
3943      * Retrieves the value of the designated column in the current row
3944      * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Date</code>
3945      * object, using the given <code>Calendar</code> object to construct an
3946      * appropriate millisecond value for the date.
3947      *
3948      * @param columnIndex the first column is <code>1</code>, the second
3949      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3950      *        and equal to or less than the number of columns in the rowset
3951      * @param cal the <code>java.util.Calendar</code> object to use in
3952      *            constructing the date
3953      * @return the column value; if the value is SQL <code>NULL</code>,
3954      *         the result is <code>null</code>
3955      * @throws SQLException if (1) the given column name is not the name of
3956      *            a column in this rowset, (2) the cursor is not on one of
3957      *            this rowset's rows or its insert row, or (3) the designated
3958      *            column does not store an SQL <code>DATE</code> or
3959      *            <code>TIMESTAMP</code> value
3960      */
3961     public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException {
3962         throw new UnsupportedOperationException();
3963     }
3964 
3965     /**
3966      * Retrieves the value of the designated column in the current row
3967      * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Date</code>
3968      * object, using the given <code>Calendar</code> object to construct an
3969      * appropriate millisecond value for the date.
3970      *
3971      * @param columnName a <code>String</code> object that must match the
3972      *        SQL name of a column in this rowset, ignoring case
3973      * @param cal the <code>java.util.Calendar</code> object to use in
3974      *            constructing the date
3975      * @return the column value; if the value is SQL <code>NULL</code>,
3976      *         the result is <code>null</code>
3977      * @throws SQLException if (1) the given column name is not the name of
3978      *            a column in this rowset, (2) the cursor is not on one of
3979      *            this rowset's rows or its insert row, or (3) the designated
3980      *            column does not store an SQL <code>DATE</code> or
3981      *            <code>TIMESTAMP</code> value
3982      */
3983     public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException {
3984         throw new UnsupportedOperationException();
3985     }
3986 
3987     /**
3988      * Retrieves the value of the designated column in the current row
3989      * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Time</code>
3990      * object, using the given <code>Calendar</code> object to construct an
3991      * appropriate millisecond value for the date.
3992      *
3993      * @param columnIndex the first column is <code>1</code>, the second
3994      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3995      *        and equal to or less than the number of columns in the rowset
3996      * @param cal the <code>java.util.Calendar</code> object to use in
3997      *            constructing the date
3998      * @return the column value; if the value is SQL <code>NULL</code>,
3999      *         the result is <code>null</code>
4000      * @throws SQLException if (1) the given column name is not the name of
4001      *            a column in this rowset, (2) the cursor is not on one of
4002      *            this rowset's rows or its insert row, or (3) the designated
4003      *            column does not store an SQL <code>TIME</code> or
4004      *            <code>TIMESTAMP</code> value
4005      */
4006     public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException {
4007         throw new UnsupportedOperationException();
4008     }
4009 
4010     /**
4011      * Retrieves the value of the designated column in the current row
4012      * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Time</code>
4013      * object, using the given <code>Calendar</code> object to construct an
4014      * appropriate millisecond value for the date.
4015      *
4016      * @param columnName a <code>String</code> object that must match the
4017      *        SQL name of a column in this rowset, ignoring case
4018      * @param cal the <code>java.util.Calendar</code> object to use in
4019      *            constructing the date
4020      * @return the column value; if the value is SQL <code>NULL</code>,
4021      *         the result is <code>null</code>
4022      * @throws SQLException if (1) the given column name is not the name of
4023      *            a column in this rowset, (2) the cursor is not on one of
4024      *            this rowset's rows or its insert row, or (3) the designated
4025      *            column does not store an SQL <code>TIME</code> or
4026      *            <code>TIMESTAMP</code> value
4027      */
4028     public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException {
4029         throw new UnsupportedOperationException();
4030     }
4031 
4032     /**
4033      * Retrieves the value of the designated column in the current row
4034      * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Timestamp</code>
4035      * object, using the given <code>Calendar</code> object to construct an
4036      * appropriate millisecond value for the date.
4037      *
4038      * @param columnIndex the first column is <code>1</code>, the second
4039      *        is <code>2</code>, and so on; must be <code>1</code> or larger
4040      *        and equal to or less than the number of columns in the rowset
4041      * @param cal the <code>java.util.Calendar</code> object to use in
4042      *            constructing the date
4043      * @return the column value; if the value is SQL <code>NULL</code>,
4044      *         the result is <code>null</code>
4045      * @throws SQLException if (1) the given column name is not the name of
4046      *            a column in this rowset, (2) the cursor is not on one of
4047      *            this rowset's rows or its insert row, or (3) the designated
4048      *            column does not store an SQL <code>TIME</code> or
4049      *            <code>TIMESTAMP</code> value
4050      */
4051     public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
4052         throw new UnsupportedOperationException();
4053     }
4054 
4055     /**
4056      * Retrieves the value of the designated column in the current row
4057      * of this <code>CachedRowSetImpl</code> object as a
4058      * <code>java.sql.Timestamp</code> object, using the given
4059      * <code>Calendar</code> object to construct an appropriate
4060      * millisecond value for the date.
4061      *
4062      * @param columnName a <code>String</code> object that must match the
4063      *        SQL name of a column in this rowset, ignoring case
4064      * @param cal the <code>java.util.Calendar</code> object to use in
4065      *            constructing the date
4066      * @return the column value; if the value is SQL <code>NULL</code>,
4067      *         the result is <code>null</code>
4068      * @throws SQLException if (1) the given column name is not the name of
4069      *            a column in this rowset, (2) the cursor is not on one of
4070      *            this rowset's rows or its insert row, or (3) the designated
4071      *            column does not store an SQL <code>DATE</code>,
4072      *            <code>TIME</code>, or <code>TIMESTAMP</code> value
4073      */
4074     public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException {
4075         throw new UnsupportedOperationException();
4076     }
4077 
4078     /*
4079      * RowSetInternal Interface
4080      */
4081 
4082     /**
4083      * Retrieves the <code>Connection</code> object passed to this
4084      * <code>CachedRowSetImpl</code> object.  This connection may be
4085      * used to populate this rowset with data or to write data back
4086      * to its underlying data source.
4087      *
4088      * @return the <code>Connection</code> object passed to this rowset;
4089      *         may be <code>null</code> if there is no connection
4090      * @throws SQLException if an error occurs
4091      */
4092     public Connection getConnection() throws SQLException{
4093         throw new UnsupportedOperationException();
4094     }
4095 
4096     /**
4097      * Sets the metadata for this <code>CachedRowSetImpl</code> object
4098      * with the given <code>RowSetMetaData</code> object.
4099      *
4100      * @param md a <code>RowSetMetaData</code> object instance containing
4101      *            metadata about the columsn in the rowset
4102      * @throws SQLException if invalid meta data is supplied to the
4103      *            rowset
4104      */
4105     public void setMetaData(RowSetMetaData md) throws SQLException {
4106         throw new UnsupportedOperationException();
4107     }
4108 
4109     /**
4110      * Returns a result set containing the original value of the rowset. The
4111      * original value is the state of the <code>CachedRowSetImpl</code> after the
4112      * last population or synchronization (whichever occurred most recently) with
4113      * the data source.
4114      * <p>
4115      * The cursor is positioned before the first row in the result set.
4116      * Only rows contained in the result set returned by <code>getOriginal()</code>
4117      * are said to have an original value.
4118      *
4119      * @return the original result set of the rowset
4120      * @throws SQLException if an error occurs produce the
4121      *           <code>ResultSet</code> object
4122      */
4123     public ResultSet getOriginal() throws SQLException {
4124        throw new UnsupportedOperationException();
4125     }
4126 
4127     /**
4128      * Returns a result set containing the original value of the current
4129      * row only.
4130      * The original value is the state of the <code>CachedRowSetImpl</code> after
4131      * the last population or synchronization (whichever occurred most recently)
4132      * with the data source.
4133      *
4134      * @return the original result set of the row
4135      * @throws SQLException if there is no current row
4136      * @see #setOriginalRow
4137      */
4138     public ResultSet getOriginalRow() throws SQLException {
4139         throw new UnsupportedOperationException();
4140 
4141     }
4142 
4143     /**
4144      * Marks the current row in this rowset as being an original row.
4145      *
4146      * @throws SQLException if there is no current row
4147      * @see #getOriginalRow
4148      */
4149     public void setOriginalRow() throws SQLException {
4150         throw new UnsupportedOperationException();
4151     }
4152 
4153     /**
4154      * Marks all rows in this rowset as being original rows. Any updates
4155      * made to the rows become the original values for the rowset.
4156      * Calls to the method <code>setOriginal</code> connot be reversed.
4157      *
4158      * @throws SQLException if an error occurs
4159      */
4160     public void setOriginal() throws SQLException {
4161         throw new UnsupportedOperationException();
4162     }
4163 
4164     /**
4165      * Returns an identifier for the object (table) that was used to create this
4166      * rowset.
4167      *
4168      * @return a <code>String</code> object that identifies the table from
4169      *         which this <code>CachedRowSetImpl</code> object was derived
4170      * @throws SQLException if an error occurs
4171      */
4172     public String getTableName() throws SQLException {
4173         throw new UnsupportedOperationException();
4174     }
4175 
4176     /**
4177      * Sets the identifier for the table from which this rowset was derived
4178      * to the given table name.
4179      *
4180      * @param tabName a <code>String</code> object that identifies the
4181      *          table from which this <code>CachedRowSetImpl</code> object
4182      *          was derived
4183      * @throws SQLException if an error occurs
4184      */
4185     public void setTableName(String tabName) throws SQLException {
4186         throw new UnsupportedOperationException();
4187     }
4188 
4189     /**
4190      * Returns the columns that make a key to uniquely identify a
4191      * row in this <code>CachedRowSetImpl</code> object.
4192      *
4193      * @return an array of column numbers that constitutes a primary
4194      *           key for this rowset. This array should be empty
4195      *           if no column is representitive of a primary key
4196      * @throws SQLException if the rowset is empty or no columns
4197      *           are designated as primary keys
4198      * @see #setKeyColumns
4199      */
4200     public int[] getKeyColumns() throws SQLException {
4201         throw new UnsupportedOperationException();
4202     }
4203 
4204 
4205     /**
4206      * Sets this <code>CachedRowSetImpl</code> object's
4207      * <code>keyCols</code> field with the given array of column
4208      * numbers, which forms a key for uniquely identifying a row
4209      * in this rowset.
4210      *
4211      * @param keys an array of <code>int</code> indicating the
4212      *        columns that form a primary key for this
4213      *        <code>CachedRowSetImpl</code> object; every
4214      *        element in the array must be greater than
4215      *        <code>0</code> and less than or equal to the number
4216      *        of columns in this rowset
4217      * @throws SQLException if any of the numbers in the
4218      *            given array is not valid for this rowset
4219      * @see #getKeyColumns
4220      */
4221     public void setKeyColumns(int [] keys) throws SQLException {
4222         throw new UnsupportedOperationException();
4223     }
4224 
4225     /**
4226      * Sets the designated column in either the current row or the insert
4227      * row of this <code>CachedRowSetImpl</code> object with the given
4228      * <code>double</code> value.
4229      *
4230      * This method updates a column value in either the current row or
4231      * the insert row of this rowset, but it does not update the
4232      * database.  If the cursor is on a row in the rowset, the
4233      * method {@link #updateRow} must be called to update the database.
4234      * If the cursor is on the insert row, the method {@link #insertRow}
4235      * must be called, which will insert the new row into both this rowset
4236      * and the database. Both of these methods must be called before the
4237      * cursor moves to another row.
4238      *
4239      * @param columnIndex the first column is <code>1</code>, the second
4240      *        is <code>2</code>, and so on; must be <code>1</code> or larger
4241      *        and equal to or less than the number of columns in this rowset
4242      * @param ref the new column <code>java.sql.Ref</code> value
4243      * @throws SQLException if (1) the given column index is out of bounds,
4244      *        (2) the cursor is not on one of this rowset's rows or its
4245      *        insert row, or (3) this rowset is
4246      *        <code>ResultSet.CONCUR_READ_ONLY</code>
4247      */
4248     public void updateRef(int columnIndex, java.sql.Ref ref) throws SQLException {
4249         throw new UnsupportedOperationException();
4250     }
4251 
4252     /**
4253      * Sets the designated column in either the current row or the insert
4254      * row of this <code>CachedRowSetImpl</code> object with the given
4255      * <code>double</code> value.
4256      *
4257      * This method updates a column value in either the current row or
4258      * the insert row of this rowset, but it does not update the
4259      * database.  If the cursor is on a row in the rowset, the
4260      * method {@link #updateRow} must be called to update the database.
4261      * If the cursor is on the insert row, the method {@link #insertRow}
4262      * must be called, which will insert the new row into both this rowset
4263      * and the database. Both of these methods must be called before the
4264      * cursor moves to another row.
4265      *
4266      * @param columnName a <code>String</code> object that must match the
4267      *        SQL name of a column in this rowset, ignoring case
4268      * @param ref the new column <code>java.sql.Ref</code> value
4269      * @throws SQLException if (1) the given column name does not match the
4270      *        name of a column in this rowset, (2) the cursor is not on
4271      *        one of this rowset's rows or its insert row, or (3) this
4272      *        rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4273      */
4274     public void updateRef(String columnName, java.sql.Ref ref) throws SQLException {
4275         throw new UnsupportedOperationException();
4276     }
4277 
4278     /**
4279      * Sets the designated column in either the current row or the insert
4280      * row of this <code>CachedRowSetImpl</code> object with the given
4281      * <code>double</code> value.
4282      *
4283      * This method updates a column value in either the current row or
4284      * the insert row of this rowset, but it does not update the
4285      * database.  If the cursor is on a row in the rowset, the
4286      * method {@link #updateRow} must be called to update the database.
4287      * If the cursor is on the insert row, the method {@link #insertRow}
4288      * must be called, which will insert the new row into both this rowset
4289      * and the database. Both of these methods must be called before the
4290      * cursor moves to another row.
4291      *
4292      * @param columnIndex the first column is <code>1</code>, the second
4293      *        is <code>2</code>, and so on; must be <code>1</code> or larger
4294      *        and equal to or less than the number of columns in this rowset
4295      * @param c the new column <code>Clob value
4296      * @throws SQLException if (1) the given column index is out of bounds,
4297      *        (2) the cursor is not on one of this rowset's rows or its
4298      *        insert row, or (3) this rowset is
4299      *        <code>ResultSet.CONCUR_READ_ONLY</code>
4300      */
4301     public void updateClob(int columnIndex, Clob c) throws SQLException {
4302        throw new UnsupportedOperationException();
4303     }
4304 
4305     /**
4306      * Sets the designated column in either the current row or the insert
4307      * row of this <code>CachedRowSetImpl</code> object with the given
4308      * <code>double</code> value.
4309      *
4310      * This method updates a column value in either the current row or
4311      * the insert row of this rowset, but it does not update the
4312      * database.  If the cursor is on a row in the rowset, the
4313      * method {@link #updateRow} must be called to update the database.
4314      * If the cursor is on the insert row, the method {@link #insertRow}
4315      * must be called, which will insert the new row into both this rowset
4316      * and the database. Both of these methods must be called before the
4317      * cursor moves to another row.
4318      *
4319      * @param columnName a <code>String</code> object that must match the
4320      *        SQL name of a column in this rowset, ignoring case
4321      * @param c the new column <code>Clob</code>value
4322      * @throws SQLException if (1) the given column name does not match the
4323      *            name of a column in this rowset, (2) the cursor is not on
4324      *            one of this rowset's rows or its insert row, or (3) this
4325      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4326      */
4327     public void updateClob(String columnName, Clob c) throws SQLException {
4328         throw new UnsupportedOperationException();
4329     }
4330 
4331     /**
4332      * Sets the designated column in either the current row or the insert
4333      * row of this <code>CachedRowSetImpl</code> object with the given
4334      * <code>java.sql.Blob</code> value.
4335      *
4336      * This method updates a column value in either the current row or
4337      * the insert row of this rowset, but it does not update the
4338      * database.  If the cursor is on a row in the rowset, the
4339      * method {@link #updateRow} must be called to update the database.
4340      * If the cursor is on the insert row, the method {@link #insertRow}
4341      * must be called, which will insert the new row into both this rowset
4342      * and the database. Both of these methods must be called before the
4343      * cursor moves to another row.
4344      *
4345      * @param columnIndex the first column is <code>1</code>, the second
4346      *        is <code>2</code>, and so on; must be <code>1</code> or larger
4347      *        and equal to or less than the number of columns in this rowset
4348      * @param b the new column <code>Blob</code> value
4349      * @throws SQLException if (1) the given column index is out of bounds,
4350      *            (2) the cursor is not on one of this rowset's rows or its
4351      *            insert row, or (3) this rowset is
4352      *            <code>ResultSet.CONCUR_READ_ONLY</code>
4353      */
4354     public void updateBlob(int columnIndex, Blob b) throws SQLException {
4355        throw new UnsupportedOperationException();
4356     }
4357 
4358     /**
4359      * Sets the designated column in either the current row or the insert
4360      * row of this <code>CachedRowSetImpl</code> object with the given
4361      * <code>java.sql.Blob </code> value.
4362      *
4363      * This method updates a column value in either the current row or
4364      * the insert row of this rowset, but it does not update the
4365      * database.  If the cursor is on a row in the rowset, the
4366      * method {@link #updateRow} must be called to update the database.
4367      * If the cursor is on the insert row, the method {@link #insertRow}
4368      * must be called, which will insert the new row into both this rowset
4369      * and the database. Both of these methods must be called before the
4370      * cursor moves to another row.
4371      *
4372      * @param columnName a <code>String</code> object that must match the
4373      *        SQL name of a column in this rowset, ignoring case
4374      * @param b the new column <code>Blob</code> value
4375      * @throws SQLException if (1) the given column name does not match the
4376      *            name of a column in this rowset, (2) the cursor is not on
4377      *            one of this rowset's rows or its insert row, or (3) this
4378      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4379      */
4380     public void updateBlob(String columnName, Blob b) throws SQLException {
4381         throw new UnsupportedOperationException();
4382     }
4383 
4384     /**
4385      * Sets the designated column in either the current row or the insert
4386      * row of this <code>CachedRowSetImpl</code> object with the given
4387      * <code>java.sql.Array</code> values.
4388      *
4389      * This method updates a column value in either the current row or
4390      * the insert row of this rowset, but it does not update the
4391      * database.  If the cursor is on a row in the rowset, the
4392      * method {@link #updateRow} must be called to update the database.
4393      * If the cursor is on the insert row, the method {@link #insertRow}
4394      * must be called, which will insert the new row into both this rowset
4395      * and the database. Both of these methods must be called before the
4396      * cursor moves to another row.
4397      *
4398      * @param columnIndex the first column is <code>1</code>, the second
4399      *        is <code>2</code>, and so on; must be <code>1</code> or larger
4400      *        and equal to or less than the number of columns in this rowset
4401      * @param a the new column <code>Array</code> value
4402      * @throws SQLException if (1) the given column index is out of bounds,
4403      *            (2) the cursor is not on one of this rowset's rows or its
4404      *            insert row, or (3) this rowset is
4405      *            <code>ResultSet.CONCUR_READ_ONLY</code>
4406      */
4407     public void updateArray(int columnIndex, Array a) throws SQLException {
4408         throw new UnsupportedOperationException();
4409     }
4410 
4411     /**
4412      * Sets the designated column in either the current row or the insert
4413      * row of this <code>CachedRowSetImpl</code> object with the given
4414      * <code>java.sql.Array</code> value.
4415      *
4416      * This method updates a column value in either the current row or
4417      * the insert row of this rowset, but it does not update the
4418      * database.  If the cursor is on a row in the rowset, the
4419      * method {@link #updateRow} must be called to update the database.
4420      * If the cursor is on the insert row, the method {@link #insertRow}
4421      * must be called, which will insert the new row into both this rowset
4422      * and the database. Both of these methods must be called before the
4423      * cursor moves to another row.
4424      *
4425      * @param columnName a <code>String</code> object that must match the
4426      *        SQL name of a column in this rowset, ignoring case
4427      * @param a the new column <code>Array</code> value
4428      * @throws SQLException if (1) the given column name does not match the
4429      *            name of a column in this rowset, (2) the cursor is not on
4430      *            one of this rowset's rows or its insert row, or (3) this
4431      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4432      */
4433     public void updateArray(String columnName, Array a) throws SQLException {
4434         throw new UnsupportedOperationException();
4435     }
4436 
4437 
4438     /**
4439      * Retrieves the value of the designated column in this
4440      * <code>CachedRowSetImpl</code> object as a <code>java.net.URL</code> object
4441      * in the Java programming language.
4442      *
4443      * @return a java.net.URL object containing the resource reference described by
4444      * the URL
4445      * @throws SQLException if (1) the given column index is out of bounds,
4446      * (2) the cursor is not on one of this rowset's rows or its
4447      * insert row, or (3) the designated column does not store an
4448      * SQL <code>DATALINK</code> value.
4449      * @see #getURL(String)
4450      */
4451     public java.net.URL getURL(int columnIndex) throws SQLException {
4452         throw new UnsupportedOperationException();
4453     }
4454 
4455     /**
4456      * Retrieves the value of the designated column in this
4457      * <code>CachedRowSetImpl</code> object as a <code>java.net.URL</code> object
4458      * in the Java programming language.
4459      *
4460      * @return a java.net.URL object containing the resource reference described by
4461      * the URL
4462      * @throws SQLException if (1) the given column name not the name of a column
4463      * in this rowset, or
4464      * (2) the cursor is not on one of this rowset's rows or its
4465      * insert row, or (3) the designated column does not store an
4466      * SQL <code>DATALINK</code> value.
4467      * @see #getURL(int)
4468      */
4469     public java.net.URL getURL(String columnName) throws SQLException {
4470         throw new UnsupportedOperationException();
4471 
4472     }
4473 
4474     /**
4475      * The first warning reported by calls on this <code>CachedRowSetImpl</code>
4476      * object is returned. Subsequent <code>CachedRowSetImpl</code> warnings will
4477      * be chained to this <code>SQLWarning</code>. All <code>RowSetWarnings</code>
4478      * warnings are generated in the disconnected environment and remain a
4479      * seperate warning chain to that provided by the <code>getWarnings</code>
4480      * method.
4481      *
4482      * <P>The warning chain is automatically cleared each time a new
4483      * row is read.
4484      *
4485      * <P><B>Note:</B> This warning chain only covers warnings caused
4486      * by <code>CachedRowSet</code> (and their child interface)
4487      * methods. All <code>SQLWarnings</code> can be obtained using the
4488      * <code>getWarnings</code> method which tracks warnings generated
4489      * by the underlying JDBC driver.
4490      * @return the first SQLWarning or null
4491      *
4492      */
4493     public RowSetWarning getRowSetWarnings() {
4494         throw new UnsupportedOperationException();
4495     }
4496 
4497      /**
4498      * Commits all changes performed by the <code>acceptChanges()</code>
4499      * methods
4500      *
4501      * @see java.sql.Connection#commit
4502      */
4503     public void commit() throws SQLException {
4504         throw new UnsupportedOperationException();
4505     }
4506 
4507     /**
4508      * Rolls back all changes performed by the <code>acceptChanges()</code>
4509      * methods
4510      *
4511      * @see java.sql.Connection#rollback
4512      */
4513     public void rollback() throws SQLException {
4514         throw new UnsupportedOperationException();
4515     }
4516 
4517     /**
4518      * Rolls back all changes performed by the <code>acceptChanges()</code>
4519      * to the last <code>Savepoint</code> transaction marker.
4520      *
4521      * @see java.sql.Connection#rollback(Savepoint)
4522      */
4523     public void rollback(Savepoint s) throws SQLException {
4524         throw new UnsupportedOperationException();
4525     }
4526 
4527     /**
4528      * Unsets the designated parameter to the given int array.
4529      * This was set using <code>setMatchColumn</code>
4530      * as the column which will form the basis of the join.
4531      * <P>
4532      * The parameter value unset by this method should be same
4533      * as was set.
4534      *
4535      * @param columnIdxes the index into this rowset
4536      *        object's internal representation of parameter values
4537      * @throws SQLException if an error occurs or the
4538      *  parameter index is out of bounds or if the columnIdx is
4539      *  not the same as set using <code>setMatchColumn(int [])</code>
4540      */
4541     public void unsetMatchColumn(int[] columnIdxes) throws SQLException {
4542          throw new UnsupportedOperationException();
4543     }
4544 
4545    /**
4546      * Unsets the designated parameter to the given String array.
4547      * This was set using <code>setMatchColumn</code>
4548      * as the column which will form the basis of the join.
4549      * <P>
4550      * The parameter value unset by this method should be same
4551      * as was set.
4552      *
4553      * @param columnIdxes the index into this rowset
4554      *        object's internal representation of parameter values
4555      * @throws SQLException if an error occurs or the
4556      *  parameter index is out of bounds or if the columnName is
4557      *  not the same as set using <code>setMatchColumn(String [])</code>
4558      */
4559     public void unsetMatchColumn(String[] columnIdxes) throws SQLException {
4560        throw new UnsupportedOperationException();
4561     }
4562 
4563     /**
4564      * Retrieves the column name as <code>String</code> array
4565      * that was set using <code>setMatchColumn(String [])</code>
4566      * for this rowset.
4567      *
4568      * @return a <code>String</code> array object that contains the column names
4569      *         for the rowset which has this the match columns
4570      *
4571      * @throws SQLException if an error occurs or column name is not set
4572      */
4573     public String[] getMatchColumnNames() throws SQLException {
4574         throw new UnsupportedOperationException();
4575     }
4576 
4577     /**
4578      * Retrieves the column id as <code>int</code> array that was set using
4579      * <code>setMatchColumn(int [])</code> for this rowset.
4580      *
4581      * @return a <code>int</code> array object that contains the column ids
4582      *         for the rowset which has this as the match columns.
4583      *
4584      * @throws SQLException if an error occurs or column index is not set
4585      */
4586     public int[] getMatchColumnIndexes() throws SQLException {
4587         throw new UnsupportedOperationException();
4588     }
4589 
4590     /**
4591      * Sets the designated parameter to the given int array.
4592      * This forms the basis of the join for the
4593      * <code>JoinRowSet</code> as the column which will form the basis of the
4594      * join.
4595      * <P>
4596      * The parameter value set by this method is stored internally and
4597      * will be supplied as the appropriate parameter in this rowset's
4598      * command when the method <code>getMatchColumnIndexes</code> is called.
4599      *
4600      * @param columnIdxes the indexes into this rowset
4601      *        object's internal representation of parameter values; the
4602      *        first parameter is 0, the second is 1, and so on; must be
4603      *        <code>0</code> or greater
4604      * @throws SQLException if an error occurs or the
4605      *                         parameter index is out of bounds
4606      */
4607     public void setMatchColumn(int[] columnIdxes) throws SQLException {
4608         throw new UnsupportedOperationException();
4609     }
4610 
4611     /**
4612      * Sets the designated parameter to the given String array.
4613      *  This forms the basis of the join for the
4614      * <code>JoinRowSet</code> as the column which will form the basis of the
4615      * join.
4616      * <P>
4617      * The parameter value set by this method is stored internally and
4618      * will be supplied as the appropriate parameter in this rowset's
4619      * command when the method <code>getMatchColumn</code> is called.
4620      *
4621      * @param columnNames the name of the column into this rowset
4622      *        object's internal representation of parameter values
4623      * @throws SQLException if an error occurs or the
4624      *  parameter index is out of bounds
4625      */
4626     public void setMatchColumn(String[] columnNames) throws SQLException {
4627         throw new UnsupportedOperationException();
4628     }
4629 
4630 
4631     /**
4632      * Sets the designated parameter to the given <code>int</code>
4633      * object.  This forms the basis of the join for the
4634      * <code>JoinRowSet</code> as the column which will form the basis of the
4635      * join.
4636      * <P>
4637      * The parameter value set by this method is stored internally and
4638      * will be supplied as the appropriate parameter in this rowset's
4639      * command when the method <code>getMatchColumn</code> is called.
4640      *
4641      * @param columnIdx the index into this rowset
4642      *        object's internal representation of parameter values; the
4643      *        first parameter is 0, the second is 1, and so on; must be
4644      *        <code>0</code> or greater
4645      * @throws SQLException if an error occurs or the
4646      *                         parameter index is out of bounds
4647      */
4648     public void setMatchColumn(int columnIdx) throws SQLException {
4649         throw new UnsupportedOperationException();
4650     }
4651 
4652     /**
4653      * Sets the designated parameter to the given <code>String</code>
4654      * object.  This forms the basis of the join for the
4655      * <code>JoinRowSet</code> as the column which will form the basis of the
4656      * join.
4657      * <P>
4658      * The parameter value set by this method is stored internally and
4659      * will be supplied as the appropriate parameter in this rowset's
4660      * command when the method <code>getMatchColumn</code> is called.
4661      *
4662      * @param columnName the name of the column into this rowset
4663      *        object's internal representation of parameter values
4664      * @throws SQLException if an error occurs or the
4665      *  parameter index is out of bounds
4666      */
4667     public void setMatchColumn(String columnName) throws SQLException {
4668         throw new UnsupportedOperationException();
4669     }
4670 
4671     /**
4672      * Unsets the designated parameter to the given <code>int</code>
4673      * object.  This was set using <code>setMatchColumn</code>
4674      * as the column which will form the basis of the join.
4675      * <P>
4676      * The parameter value unset by this method should be same
4677      * as was set.
4678      *
4679      * @param columnIdx the index into this rowset
4680      *        object's internal representation of parameter values
4681      * @throws SQLException if an error occurs or the
4682      *  parameter index is out of bounds or if the columnIdx is
4683      *  not the same as set using <code>setMatchColumn(int)</code>
4684      */
4685     public void unsetMatchColumn(int columnIdx) throws SQLException {
4686         throw new UnsupportedOperationException();
4687     }
4688 
4689     /**
4690      * Unsets the designated parameter to the given <code>String</code>
4691      * object.  This was set using <code>setMatchColumn</code>
4692      * as the column which will form the basis of the join.
4693      * <P>
4694      * The parameter value unset by this method should be same
4695      * as was set.
4696      *
4697      * @param columnName the index into this rowset
4698      *        object's internal representation of parameter values
4699      * @throws SQLException if an error occurs or the
4700      *  parameter index is out of bounds or if the columnName is
4701      *  not the same as set using <code>setMatchColumn(String)</code>
4702      */
4703     public void unsetMatchColumn(String columnName) throws SQLException {
4704         throw new UnsupportedOperationException();
4705     }
4706 
4707     /**
4708      * Notifies registered listeners that a RowSet object in the given RowSetEvent
4709      * object has populated a number of additional rows. The <code>numRows</code> parameter
4710      * ensures that this event will only be fired every <code>numRow</code>.
4711      * <p>
4712      * The source of the event can be retrieved with the method event.getSource.
4713      *
4714      * @param event a <code>RowSetEvent</code> object that contains the
4715      *     <code>RowSet</code> object that is the source of the events
4716      * @param numRows when populating, the number of rows interval on which the
4717      *     <code>CachedRowSet</code> populated should fire; the default value
4718      *     is zero; cannot be less than <code>fetchSize</code> or zero
4719      */
4720     public void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException {
4721         throw new UnsupportedOperationException();
4722     }
4723 
4724     /**
4725      * Populates this <code>CachedRowSet</code> object with data from
4726      * the given <code>ResultSet</code> object. While related to the <code>populate(ResultSet)</code>
4727      * method, an additional parameter is provided to allow starting position within
4728      * the <code>ResultSet</code> from where to populate the CachedRowSet
4729      * instance.
4730      *
4731      * This method is an alternative to the method <code>execute</code>
4732      * for filling the rowset with data.  The method <code>populate</code>
4733      * does not require that the properties needed by the method
4734      * <code>execute</code>, such as the <code>command</code> property,
4735      * be set. This is true because the method <code>populate</code>
4736      * is given the <code>ResultSet</code> object from
4737      * which to get data and thus does not need to use the properties
4738      * required for setting up a connection and executing this
4739      * <code>CachedRowSetImpl</code> object's command.
4740      * <P>
4741      * After populating this rowset with data, the method
4742      * <code>populate</code> sets the rowset's metadata and
4743      * then sends a <code>RowSetChangedEvent</code> object
4744      * to all registered listeners prior to returning.
4745      *
4746      * @param data the <code>ResultSet</code> object containing the data
4747      *             to be read into this <code>CachedRowSetImpl</code> object
4748      * @param start the integer specifing the position in the
4749      *        <code>ResultSet</code> object to popultate the
4750      *        <code>CachedRowSetImpl</code> object.
4751      * @throws SQLException if an error occurs; or the max row setting is
4752      *          violated while populating the RowSet.Also id the start position
4753      *          is negative.
4754      * @see #execute
4755      */
4756      public void populate(ResultSet data, int start) throws SQLException{
4757         throw new UnsupportedOperationException();
4758 
4759      }
4760 
4761     /**
4762      * The nextPage gets the next page, that is a <code>CachedRowSetImpl</code> object
4763      * containing the number of rows specified by page size.
4764      * @return boolean value true indicating whether there are more pages to come and
4765      *         false indicating that this is the last page.
4766      * @throws SQLException if an error occurs or this called before calling populate.
4767      */
4768      public boolean nextPage() throws SQLException {
4769          throw new UnsupportedOperationException();
4770      }
4771 
4772     /**
4773      * This is the setter function for setting the size of the page, which specifies
4774      * how many rows have to be retrived at a time.
4775      *
4776      * @param size which is the page size
4777      * @throws SQLException if size is less than zero or greater than max rows.
4778      */
4779      public void setPageSize (int size) throws SQLException {
4780         throw new UnsupportedOperationException();
4781      }
4782 
4783     /**
4784      * This is the getter function for the size of the page.
4785      *
4786      * @return an integer that is the page size.
4787      */
4788     public int getPageSize() {
4789         throw new UnsupportedOperationException();
4790     }
4791 
4792 
4793     /**
4794      * Retrieves the data present in the page prior to the page from where it is
4795      * called.
4796      * @return boolean value true if it retrieves the previous page, flase if it
4797      *         is on the first page.
4798      * @throws SQLException if it is called before populate is called or ResultSet
4799      *         is of type <code>ResultSet.TYPE_FORWARD_ONLY</code> or if an error
4800      *         occurs.
4801      */
4802     public boolean previousPage() throws SQLException {
4803        throw new UnsupportedOperationException();
4804     }
4805 
4806     /**
4807        * Updates the designated column with a character stream value, which will
4808        * have the specified number of bytes. The driver does the necessary conversion
4809        * from Java character format to the national character set in the database.
4810        * It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
4811        * The updater methods are used to update column values in the current row or
4812        * the insert row. The updater methods do not update the underlying database;
4813        * instead the updateRow or insertRow methods are called to update the database.
4814        *
4815        * @param columnIndex - the first column is 1, the second is 2, ...
4816        * @param x - the new column value
4817        * @param length - the length of the stream
4818        * @exception SQLException if a database access error occurs
4819        * @since 1.6
4820        */
4821        public void updateNCharacterStream(int columnIndex,
4822                             java.io.Reader x,
4823                             int length)
4824                             throws SQLException {
4825           throw new UnsupportedOperationException("Operation not yet supported");
4826        }
4827 
4828      /**
4829        * Updates the designated column with a character stream value, which will
4830        * have the specified number of bytes. The driver does the necessary conversion
4831        * from Java character format to the national character set in the database.
4832        * It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
4833        * The updater methods are used to update column values in the current row or
4834        * the insert row. The updater methods do not update the underlying database;
4835        * instead the updateRow or insertRow methods are called to update the database.
4836        *
4837        * @param columnName - name of the Column
4838        * @param x - the new column value
4839        * @param length - the length of the stream
4840        * @exception SQLException if a database access error occurs
4841        * @since 1.6
4842        */
4843        public void updateNCharacterStream(String columnName,
4844                             java.io.Reader x,
4845                             int length)
4846                             throws SQLException {
4847           throw new UnsupportedOperationException("Operation not yet supported");
4848        }
4849 
4850       /**
4851        * This method re populates the resBundle
4852        * during the deserialization process
4853        *
4854        */
4855        private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
4856          // Default state initialization happens here
4857          ois.defaultReadObject();
4858          // Initialization of transient Res Bundle happens here .
4859          try {
4860             resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
4861          } catch(IOException ioe) {
4862              throw new RuntimeException(ioe);
4863          }
4864 
4865        }
4866 
4867        static final long serialVersionUID = -3345004441725080251L;
4868 } //end class