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
26package com.sun.rowset.internal;
27
28import java.sql.*;
29import javax.sql.*;
30import java.util.*;
31import java.math.BigDecimal;
32
33import javax.sql.rowset.*;
34import javax.sql.rowset.spi.*;
35
36import com.sun.rowset.*;
37import java.io.IOException;
38import 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} will utilize the
43 * {@code SyncResolver} to synchronize the changes back to database.
44 */
45public 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} object
83     */
84    private int sz;
85
86    /**
87     * The {@code Connection} 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} 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}, which indicates the operationthe {@code RowSet}
127     * object was attempting when the conflict occurred.
128     *
129     * @return one of the following constants:
130     *         {@code SyncResolver.UPDATE_ROW_CONFLICT},
131     *         {@code SyncResolver.DELETE_ROW_CONFLICT}, or
132     *         {@code SyncResolver.INSERT_ROW_CONFLICT}
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} object, which is the value that caused a conflict.
141     *
142     * @param index {@code int} designating the column in this row of this
143     *        {@code SyncResolver} 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} object, which is the value that caused a conflict.
157     *
158     * @param columnName a {@code String} object designating the column in this row of this
159     *        {@code SyncResolver} 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} object. This value is the resolved value that is to be
173     * persisted in the data source.
174     *
175     * @param index an {@code int} giving the number of the column into which to
176     *        set the value to be persisted
177     * @param obj an {@code Object} 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} 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} 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} 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} object. This value is the resolved value that is to be
389     * persisted in the data source.
390     *
391     * @param columnName a {@code String} object giving the name of the column
392     *        into which to set the value to be persisted
393     * @param obj an {@code Object} 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}
449     * cursor is initially positioned before the first conflict row; the first call to the
450     * method {@code nextConflict()} 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} 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} object.
499     *
500     * @return {@code true} if the cursor is on a valid row; {@code false}
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} object's command property
515     * to the given {@code String} 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}.
522     *
523     * @param cmd a {@code String} object containing an SQL query
524     *            that will be set as the command; may be {@code null}
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} object with data from
538     * the given {@code ResultSet} object.  This
539     * method is an alternative to the method {@code execute}
540     * for filling the rowset with data.  The method {@code populate}
541     * does not require that the properties needed by the method
542     * {@code execute}, such as the {@code command} property,
543     * be set. This is true because the method {@code populate}
544     * is given the {@code ResultSet} 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} object's command.
548     * <P>
549     * After populating this rowset with data, the method
550     * {@code populate} sets the rowset's metadata and
551     * then sends a {@code RowSetChangedEvent} object
552     * to all registered listeners prior to returning.
553     *
554     * @param data the {@code ResultSet} object containing the data
555     *             to be read into this {@code CachedRowSetImpl} 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} 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}
571     * that is given a connection ignores these properties.
572     *
573     * @param conn A standard JDBC {@code Connection} object that this
574     * {@code CachedRowSet} object can pass to a synchronization provider
575     * to establish a connection to the data source
576     * @throws SQLException if an invalid {@code Connection} 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}
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}
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} is configured, the reference implementation
605     * leverages the {@code RIOptimisticProvider} available which provides the
606     * default and reference synchronization capabilities for disconnected
607     * {@code RowSets}.
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} instance during either during the
614     *          process or at any time when the {@code SyncProvider}
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} object
627     * using the given {@code Connection} object.
628     * <P>
629     * The reference implementation {@code RIOptimisticProvider}
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} to ensure the synchronization
634     * occurs according to the updated JDBC {@code Connection}
635     * properties.
636     *
637     * @param con a standard JDBC {@code Connection} 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} 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} 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}
667     * object and sends a {@code rowSetChanged} 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} 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}) or population. This method may also be called
714     * while performing updates to the insert row.
715     * <P>
716     * {@code undoUpdate} 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} object backed by the same data as
737     * that of this {@code CachedRowSetImpl} 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} object that is a copy of this {@code CachedRowSetImpl}
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} object containing by the same data
754     * as this {@code CachedRowSetImpl} object.  This method
755     * differs from the method {@code createCopy} in that it throws a
756     * {@code CloneNotSupportedException} object instead of an
757     * {@code SQLException} object, as the method {@code createShared}
758     * does.  This {@code clone}
759     * method is called internally by the method {@code createShared},
760     * which catches the {@code CloneNotSupportedException} object
761     * and in turn throws a new {@code SQLException} object.
762     *
763     * @return a copy of this {@code CachedRowSetImpl} object
764     * @throws CloneNotSupportedException if an error occurs when
765     * attempting to clone this {@code CachedRowSetImpl} object
766     * @see #createShared
767     */
768    protected Object clone() throws CloneNotSupportedException  {
769       throw new UnsupportedOperationException();
770    }
771
772    /**
773     * Creates a {@code RowSet} object that is a deep copy of
774     * this {@code CachedRowSetImpl} 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} object that is a deep copy
784     *           of this {@code CachedRowSet} object and is
785     *           completely independent from this {@code CachedRowSetImpl}
786     *           object.
787     * @throws SQLException if an error occurs in generating the copy of this
788     *           of the {@code CachedRowSetImpl}
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} object that is a copy of
799     * this {@code CachedRowSetImpl} 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}.
806     *
807     * @return a new {@code CachedRowSet} object that is a copy
808     * of this {@code CachedRowSetImpl} 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} 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} object that is a copy of
825     * this {@code CachedRowSetImpl} 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} object that is a deep copy
831     * of this {@code CachedRowSetImpl} object and is
832     * completely independent from this {@code CachedRowSetImpl} object
833     * @throws SQLException if an error occurs in generating the copy of the
834     * of the {@code CachedRowSet}
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} object to a collection
847     * of tables. The sample implementation utilitizes the {@code TreeMap}
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} object consisting of tables,
853     *         each of which is a copy of a row in this
854     *         {@code CachedRowSetImpl} 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} object
867     * as a {@code Collection} object.  This method makes a copy of the
868     * column's data and utilitizes the {@code Vector} to establish the
869     * collection. The {@code Vector} 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} object that contains the value(s)
874     *         stored in the specified column of this
875     *         {@code CachedRowSetImpl}
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} object
890     * as a {@code Collection} object.  This method makes a copy of the
891     * column's data and utilitizes the {@code Vector} to establish the
892     * collection. The {@code Vector} 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} object that contains the value(s)
897     *         stored in the specified column of this
898     *         {@code CachedRowSetImpl}
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} implementation being used
918     * with this {@code CachedRowSetImpl} 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} instance.
925     */
926    public SyncProvider getSyncProvider() throws SQLException {
927      throw new UnsupportedOperationException();
928    }
929
930    /**
931     * Sets the active {@code SyncProvider} and attempts to load
932     * load the new provider using the {@code SyncFactory} SPI.
933     *
934     * @throws SQLException if an error occurs while resetting the
935     *          {@code SyncProvider}.
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} 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}
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} 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} 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} if the new cursor position is a
991     * valid row.
992     * The cursor for a new {@code ResultSet} object is initially
993     * positioned before the first row. The first call to the method
994     * {@code next} 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} object's warning
1000     * chain is cleared when a new row is read.
1001     *
1002     * @return {@code true} if the new current row is valid;
1003     *         {@code false} 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} object's cursor to the next
1014     * row and returns {@code true} if the cursor is still in the rowset;
1015     * returns {@code false} 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} is called by methods such as
1025     * {@code next}, {@code absolute}, and {@code relative},
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} interface.
1030     *
1031     * @return {@code true} if the cursor is on a valid row in this
1032     *         rowset; {@code false} 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} 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} 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}.
1052     * Note that you must first call the method {@code getXXX}
1053     * on a column to try to read its value and then call the method
1054     * {@code wasNull} to determine whether the value was
1055     * SQL {@code NULL}.
1056     *
1057     * @return {@code true} if the value in the last column read
1058     *         was SQL {@code NULL}; {@code false} 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}object.
1068     *
1069     * @return the {@code Row} object on which this {@code CachedRowSetImpl}
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} 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} object as a
1093     * {@code String} object.
1094     *
1095     * @param columnIndex the first column is {@code 1}, the second
1096     *        is {@code 2}, and so on; must be {@code 1} 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}, the
1099     *         result is {@code null}
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>{@code CHAR, VARCHAR}</b>
1105     * or {@code LONGVARCHAR} 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} object as a
1115     * {@code boolean} value.
1116     *
1117     * @param columnIndex the first column is {@code 1}, the second
1118     *        is {@code 2}, and so on; must be {@code 1} 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} in the Java progamming language;
1121     *        if the value is SQL {@code NULL}, the result is {@code false}
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} 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} object as a
1135     * {@code byte} value.
1136     *
1137     * @param columnIndex the first column is {@code 1}, the second
1138     *        is {@code 2}, and so on; must be {@code 1} 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} in the Java programming
1141     * language; if the value is SQL {@code NULL}, the result is {@code 0}
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 <b>{@code TINYINT}</b>, {@code SMALLINT, INTEGER,
1146     *            BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
1147     *            VARCHAR} or {@code LONGVARCHAR} 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} object as a
1158     * {@code short} value.
1159     *
1160     * @param columnIndex the first column is {@code 1}, the second
1161     *        is {@code 2}, and so on; must be {@code 1} 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}, the
1164     *         result is {@code 0}
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>{@code SMALLINT}</b>,
1169     *         {@code INTEGER, BIGINT, REAL, FLOAT, DOUBLE,
1170     *         DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
1171     *         or {@code LONGVARCHAR} value. The bold SQL type
1172     *         designates the recommended return type.
1173     * @see #getShort(String)
1174     */
1175    public short getShort(int columnIndex) throws SQLException {
1176        throw new UnsupportedOperationException();
1177    }
1178
1179    /**
1180     * Retrieves the value of the designated column in the current row
1181     * of this {@code CachedRowSetImpl} object as an
1182     * {@code int} value.
1183     *
1184     * @param columnIndex the first column is {@code 1}, the second
1185     *        is {@code 2}, and so on; must be {@code 1} or larger
1186     *        and equal to or less than the number of columns in the rowset
1187     * @return the column value; if the value is SQL {@code NULL}, the
1188     *         result is {@code 0}
1189     * @throws SQLException if (1) the given column index is out of bounds,
1190     *         (2) the cursor is not on one of this rowset's rows or its
1191     *         insert row, or (3) the designated column does not store an
1192     *         SQL {@code TINYINT, SMALLINT,} <b>{@code INTEGER}</b>,
1193     *         {@code BIGINT, REAL, FLOAT, DOUBLE, DECIMAL,
1194     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
1195     *         The bold SQL type designates the
1196     *         recommended return type.
1197     */
1198    public int getInt(int columnIndex) throws SQLException {
1199        throw new UnsupportedOperationException();
1200    }
1201
1202    /**
1203     * Retrieves the value of the designated column in the current row
1204     * of this {@code CachedRowSetImpl} object as a
1205     * {@code long} value.
1206     *
1207     * @param columnIndex the first column is {@code 1}, the second
1208     *        is {@code 2}, and so on; must be {@code 1} or larger
1209     *        and equal to or less than the number of columns in the rowset
1210     * @return the column value; if the value is SQL {@code NULL}, the
1211     *         result is {@code 0}
1212     * @throws SQLException if (1) the given column index is out of bounds,
1213     *         (2) the cursor is not on one of this rowset's rows or its
1214     *         insert row, or (3) the designated column does not store an
1215     *         SQL {@code TINYINT, SMALLINT, INTEGER,}
1216     *         <b>{@code BIGINT}</b>, {@code REAL, FLOAT, DOUBLE,
1217     *         DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
1218     *         or {@code LONGVARCHAR} value. The bold SQL type
1219     * designates the recommended return type.
1220     * @see #getLong(String)
1221     */
1222    public long getLong(int columnIndex) throws SQLException {
1223        throw new UnsupportedOperationException();
1224    }
1225
1226    /**
1227     * Retrieves the value of the designated column in the current row
1228     * of this {@code CachedRowSetImpl} object as a
1229     * {@code float} value.
1230     *
1231     * @param columnIndex the first column is {@code 1}, the second
1232     *        is {@code 2}, and so on; must be {@code 1} or larger
1233     *        and equal to or less than the number of columns in the rowset
1234     * @return the column value; if the value is SQL {@code NULL}, the
1235     *         result is {@code 0}
1236     * @throws SQLException if (1) the given column index is out of bounds,
1237     *         (2) the cursor is not on one of this rowset's rows or its
1238     *         insert row, or (3) the designated column does not store an
1239     *         SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT,}
1240     *         <b>{@code REAL}</b>, {@code FLOAT, DOUBLE, DECIMAL, NUMERIC,
1241     *         BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
1242     *         The bold SQL type designates the recommended return type.
1243     * @see #getFloat(String)
1244     */
1245    public float getFloat(int columnIndex) throws SQLException {
1246        throw new UnsupportedOperationException();
1247    }
1248
1249    /**
1250     * Retrieves the value of the designated column in the current row
1251     * of this {@code CachedRowSetImpl} object as a
1252     * {@code double} value.
1253     *
1254     * @param columnIndex the first column is {@code 1}, the second
1255     *        is {@code 2}, and so on; must be {@code 1} or larger
1256     *        and equal to or less than the number of columns in the rowset
1257     * @return the column value; if the value is SQL {@code NULL}, the
1258     *         result is {@code 0}
1259     * @throws SQLException if (1) the given column index is out of bounds,
1260     *         (2) the cursor is not on one of this rowset's rows or its
1261     *         insert row, or (3) the designated column does not store an
1262     *         SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT, REAL,}
1263     *         <b>{@code FLOAT, DOUBLE}</b>,
1264     *         {@code DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
1265     *         or {@code LONGVARCHAR} value. The bold SQL type
1266     *         designates the recommended return type.
1267     * @see #getDouble(String)
1268     *
1269     */
1270    public double getDouble(int columnIndex) throws SQLException {
1271        throw new UnsupportedOperationException();
1272    }
1273
1274    /**
1275     * Retrieves the value of the designated column in the current row
1276     * of this {@code CachedRowSetImpl} object as a
1277     * {@code java.math.BigDecimal} object.
1278     * <P>
1279     * This method is deprecated; use the version of {@code getBigDecimal}
1280     * that does not take a scale parameter and returns a value with full
1281     * precision.
1282     *
1283     * @param columnIndex the first column is {@code 1}, the second
1284     *        is {@code 2}, and so on; must be {@code 1} or larger
1285     *        and equal to or less than the number of columns in the rowset
1286     * @param scale the number of digits to the right of the decimal point in the
1287     *        value returned
1288     * @return the column value with the specified number of digits to the right
1289     *         of the decimal point; if the value is SQL {@code NULL}, the
1290     *         result is {@code null}
1291     * @throws SQLException if the given column index is out of bounds,
1292     *            the cursor is not on a valid row, or this method fails
1293     * @deprecated
1294     */
1295    @Deprecated
1296    public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
1297       throw new UnsupportedOperationException();
1298    }
1299
1300    /**
1301     * Retrieves the value of the designated column in the current row
1302     * of this {@code CachedRowSetImpl} object as a
1303     * {@code byte} array value.
1304     *
1305     * @param columnIndex the first column is {@code 1}, the second
1306     *        is {@code 2}, and so on; must be {@code 1} or larger
1307     *        and equal to or less than the number of columns in the rowset
1308     * @return the column value as a {@code byte} array in the Java programming
1309     * language; if the value is SQL {@code NULL}, the
1310     * result is {@code null}
1311     *
1312     * @throws SQLException if (1) the given column index is out of bounds,
1313     *         (2) the cursor is not on one of this rowset's rows or its
1314     *         insert row, or (3) the designated column does not store an
1315     *         SQL <b>{@code BINARY, VARBINARY}</b> or
1316     *         {@code LONGVARBINARY} value.
1317     *         The bold SQL type designates the recommended return type.
1318     * @see #getBytes(String)
1319     */
1320    public byte[] getBytes(int columnIndex) throws SQLException {
1321        throw new UnsupportedOperationException();
1322    }
1323
1324    /**
1325     * Retrieves the value of the designated column in the current row
1326     * of this {@code CachedRowSetImpl} object as a
1327     * {@code java.sql.Date} object.
1328     *
1329     * @param columnIndex the first column is {@code 1}, the second
1330     *        is {@code 2}, and so on; must be {@code 1} or larger
1331     *        and equal to or less than the number of columns in the rowset
1332     * @return the column value as a {@code java.sql.Data} object; if
1333     *        the value is SQL {@code NULL}, the
1334     *        result is {@code null}
1335     * @throws SQLException if the given column index is out of bounds,
1336     *         the cursor is not on a valid row, or this method fails
1337     */
1338    public java.sql.Date getDate(int columnIndex) throws SQLException {
1339        throw new UnsupportedOperationException();
1340    }
1341
1342    /**
1343     * Retrieves the value of the designated column in the current row
1344     * of this {@code CachedRowSetImpl} object as a
1345     * {@code java.sql.Time} object.
1346     *
1347     * @param columnIndex the first column is {@code 1}, the second
1348     *        is {@code 2}, and so on; must be {@code 1} or larger
1349     *        and equal to or less than the number of columns in the rowset
1350     * @return the column value; if the value is SQL {@code NULL}, the
1351     *         result is {@code null}
1352     * @throws SQLException if the given column index is out of bounds,
1353     *         the cursor is not on a valid row, or this method fails
1354     */
1355    public java.sql.Time getTime(int columnIndex) throws SQLException {
1356        throw new UnsupportedOperationException();
1357    }
1358
1359    /**
1360     * Retrieves the value of the designated column in the current row
1361     * of this {@code CachedRowSetImpl} object as a
1362     * {@code java.sql.Timestamp} object.
1363     *
1364     * @param columnIndex the first column is {@code 1}, the second
1365     *        is {@code 2}, and so on; must be {@code 1} or larger
1366     *        and equal to or less than the number of columns in the rowset
1367     * @return the column value; if the value is SQL {@code NULL}, the
1368     *         result is {@code null}
1369     * @throws SQLException if the given column index is out of bounds,
1370     *            the cursor is not on a valid row, or this method fails
1371     */
1372    public java.sql.Timestamp getTimestamp(int columnIndex) throws SQLException {
1373        throw new UnsupportedOperationException();
1374    }
1375
1376    /**
1377     * Retrieves the value of the designated column in the current row of this
1378     * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
1379     * object.
1380     *
1381     * A column value can be retrieved as a stream of ASCII characters
1382     * and then read in chunks from the stream.  This method is particularly
1383     * suitable for retrieving large {@code LONGVARCHAR} values.  The JDBC
1384     * driver will do any necessary conversion from the database format into ASCII.
1385     *
1386     * <P><B>Note:</B> All the data in the returned stream must be
1387     * read prior to getting the value of any other column. The next
1388     * call to a get method implicitly closes the stream. . Also, a
1389     * stream may return {@code 0} for {@code CachedRowSetImpl.available()}
1390     * whether there is data available or not.
1391     *
1392     * @param columnIndex the first column is {@code 1}, the second
1393     *        is {@code 2}, and so on; must be {@code 1} or larger
1394     *        and equal to or less than the number of columns in this rowset
1395     * @return a Java input stream that delivers the database column value
1396     *         as a stream of one-byte ASCII characters.  If the value is SQL
1397     *         {@code NULL}, the result is {@code null}.
1398     * @throws SQLException if (1) the given column index is out of bounds,
1399     *         (2) the cursor is not on one of this rowset's rows or its
1400     *         insert row, or (3) the designated column does not store an
1401     *         SQL {@code CHAR, VARCHAR}, <b>{@code LONGVARCHAR}</b>,
1402     *         {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value. The
1403     *         bold SQL type designates the recommended return types
1404     *         that this method is used to retrieve.
1405     * @see #getAsciiStream(String)
1406     */
1407    public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException {
1408       throw new UnsupportedOperationException();
1409    }
1410
1411    /**
1412     * A column value can be retrieved as a stream of Unicode characters
1413     * and then read in chunks from the stream.  This method is particularly
1414     * suitable for retrieving large LONGVARCHAR values.  The JDBC driver will
1415     * do any necessary conversion from the database format into Unicode.
1416     *
1417     * <P><B>Note:</B> All the data in the returned stream must be
1418     * read prior to getting the value of any other column. The next
1419     * call to a get method implicitly closes the stream. . Also, a
1420     * stream may return 0 for available() whether there is data
1421     * available or not.
1422     *
1423     * @param columnIndex the first column is {@code 1}, the second
1424     *        is {@code 2}, and so on; must be {@code 1} or larger
1425     *        and equal to or less than the number of columns in this rowset
1426     * @return a Java input stream that delivers the database column value
1427     * as a stream of two byte Unicode characters.  If the value is SQL NULL
1428     * then the result is null.
1429     * @throws SQLException if an error occurs
1430     * @deprecated
1431     */
1432    @Deprecated
1433    public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException {
1434       throw new UnsupportedOperationException();
1435    }
1436
1437    /**
1438     * Retrieves the value of the designated column in the current row of this
1439     * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
1440     * object.
1441     * <P>
1442     * A column value can be retrieved as a stream of uninterpreted bytes
1443     * and then read in chunks from the stream.  This method is particularly
1444     * suitable for retrieving large {@code LONGVARBINARY} values.
1445     *
1446     * <P><B>Note:</B> All the data in the returned stream must be
1447     * read prior to getting the value of any other column. The next
1448     * call to a get method implicitly closes the stream. Also, a
1449     * stream may return {@code 0} for
1450     * {@code CachedRowSetImpl.available()} whether there is data
1451     * available or not.
1452     *
1453     * @param columnIndex the first column is {@code 1}, the second
1454     * is {@code 2}, and so on; must be {@code 1} or larger
1455     * and equal to or less than the number of columns in the rowset
1456     * @return a Java input stream that delivers the database column value
1457     * as a stream of uninterpreted bytes.  If the value is SQL {@code NULL}
1458     * then the result is {@code null}.
1459     * @throws SQLException if (1) the given column index is out of bounds,
1460     * (2) the cursor is not on one of this rowset's rows or its
1461     * insert row, or (3) the designated column does not store an
1462     * SQL {@code BINARY, VARBINARY} or <b>{@code LONGVARBINARY}</b>.
1463     * The bold type indicates the SQL type that this method is recommened
1464     * to retrieve.
1465     * @see #getBinaryStream(String)
1466     */
1467    public java.io.InputStream getBinaryStream(int columnIndex) throws SQLException {
1468       throw new UnsupportedOperationException();
1469
1470    }
1471
1472
1473    //======================================================================
1474    // Methods for accessing results by column name
1475    //======================================================================
1476
1477    /**
1478     * Retrieves the value stored in the designated column
1479     * of the current row as a {@code String} object.
1480     *
1481     * @param columnName a {@code String} object giving the SQL name of
1482     *        a column in this {@code CachedRowSetImpl} object
1483     * @return the column value; if the value is SQL {@code NULL},
1484     *         the result is {@code null}
1485     * @throws SQLException if (1) the given column name is not the name of
1486     *         a column in this rowset, (2) the cursor is not on one of
1487     *         this rowset's rows or its insert row, or (3) the designated
1488     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
1489     *         BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT,}
1490     *         <b>{@code CHAR, VARCHAR}</b> or {@code LONGVARCHAR} value.
1491     *         The bold SQL type designates the recommended return type.
1492     */
1493    public String getString(String columnName) throws SQLException {
1494        throw new UnsupportedOperationException();
1495    }
1496
1497    /**
1498     * Retrieves the value stored in the designated column
1499     * of the current row as a {@code boolean} value.
1500     *
1501     * @param columnName a {@code String} object giving the SQL name of
1502     *        a column in this {@code CachedRowSetImpl} object
1503     * @return the column value as a {@code boolean} in the Java programming
1504     *        language; if the value is SQL {@code NULL},
1505     *        the result is {@code false}
1506     * @throws SQLException if (1) the given column name is not the name of
1507     *         a column in this rowset, (2) the cursor is not on one of
1508     *         this rowset's rows or its insert row, or (3) the designated
1509     *         column does not store an SQL {@code BOOLEAN} value
1510     * @see #getBoolean(int)
1511     */
1512    public boolean getBoolean(String columnName) throws SQLException {
1513        throw new UnsupportedOperationException();
1514    }
1515
1516    /**
1517     * Retrieves the value stored in the designated column
1518     * of the current row as a {@code byte} value.
1519     *
1520     * @param columnName a {@code String} object giving the SQL name of
1521     *        a column in this {@code CachedRowSetImpl} object
1522     * @return the column value as a {@code byte} in the Java programming
1523     * language; if the value is SQL {@code NULL}, the result is {@code 0}
1524     * @throws SQLException if (1) the given column name is not the name of
1525     *         a column in this rowset, (2) the cursor is not on one of
1526     *         this rowset's rows or its insert row, or (3) the designated
1527     *         column does not store an SQL <b>{@code TINYINT}</b>,
1528     *         {@code SMALLINT, INTEGER, BIGINT, REAL, FLOAT, DOUBLE,
1529     *         DECIMAL, NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR}
1530     *         value. The bold type designates the recommended return type.
1531     */
1532    public byte getByte(String columnName) throws SQLException {
1533        throw new UnsupportedOperationException();
1534    }
1535
1536    /**
1537     * Retrieves the value stored in the designated column
1538     * of the current row as a {@code short} value.
1539     *
1540     * @param columnName a {@code String} object giving the SQL name of
1541     *        a column in this {@code CachedRowSetImpl} object
1542     * @return the column value; if the value is SQL {@code NULL},
1543     *         the result is {@code 0}
1544     * @throws SQLException if (1) the given column name is not the name of
1545     *         a column in this rowset, (2) the cursor is not on one of
1546     *         this rowset's rows or its insert row, or (3) the designated
1547     *         column does not store an SQL {@code TINYINT,}
1548     *         <b>{@code SMALLINT}</b>, {@code INTEGER,
1549     *         BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
1550     *         VARCHAR} or {@code LONGVARCHAR} value. The bold SQL type
1551     *         designates the recommended return type.
1552     * @see #getShort(int)
1553     */
1554    public short getShort(String columnName) throws SQLException {
1555       throw new UnsupportedOperationException();
1556    }
1557
1558    /**
1559     * Retrieves the value stored in the designated column
1560     * of the current row as an {@code int} value.
1561     *
1562     * @param columnName a {@code String} object giving the SQL name of
1563     *        a column in this {@code CachedRowSetImpl} object
1564     * @return the column value; if the value is SQL {@code NULL},
1565     *         the result is {@code 0}
1566     * @throws SQLException if (1) the given column name is not the name
1567     *         of a column in this rowset,
1568     *         (2) the cursor is not on one of this rowset's rows or its
1569     *         insert row, or (3) the designated column does not store an
1570     *         SQL {@code TINYINT, SMALLINT,} <b>{@code INTEGER}</b>,
1571     *         {@code BIGINT, REAL, FLOAT, DOUBLE, DECIMAL,
1572     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
1573     *         The bold SQL type designates the
1574     *         recommended return type.
1575     */
1576    public int getInt(String columnName) throws SQLException {
1577        throw new UnsupportedOperationException();
1578    }
1579
1580    /**
1581     * Retrieves the value stored in the designated column
1582     * of the current row as a {@code long} value.
1583     *
1584     * @param columnName a {@code String} object giving the SQL name of
1585     *        a column in this {@code CachedRowSetImpl} object
1586     * @return the column value; if the value is SQL {@code NULL},
1587     *         the result is {@code 0}
1588     * @throws SQLException if (1) the given column name is not the name of
1589     *         a column in this rowset, (2) the cursor is not on one of
1590     *         this rowset's rows or its insert row, or (3) the designated
1591     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,}
1592     *         <b>{@code BIGINT}</b>, {@code REAL, FLOAT, DOUBLE, DECIMAL,
1593     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
1594     *         The bold SQL type designates the recommended return type.
1595     * @see #getLong(int)
1596     */
1597    public long getLong(String columnName) throws SQLException {
1598        throw new UnsupportedOperationException();
1599    }
1600
1601    /**
1602     * Retrieves the value stored in the designated column
1603     * of the current row as a {@code float} value.
1604     *
1605     * @param columnName a {@code String} object giving the SQL name of
1606     *        a column in this {@code CachedRowSetImpl} object
1607     * @return the column value; if the value is SQL {@code NULL},
1608     *         the result is {@code 0}
1609     * @throws SQLException if (1) the given column name is not the name of
1610     *         a column in this rowset, (2) the cursor is not on one of
1611     *         this rowset's rows or its insert row, or (3) the designated
1612     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
1613     *         BIGINT,} <b>{@code REAL}</b>, {@code FLOAT, DOUBLE, DECIMAL,
1614     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
1615     *         The bold SQL type designates the recommended return type.
1616     * @see #getFloat(String)
1617     */
1618    public float getFloat(String columnName) throws SQLException {
1619       throw new UnsupportedOperationException();
1620    }
1621
1622    /**
1623     * Retrieves the value stored in the designated column
1624     * of the current row of this {@code CachedRowSetImpl} object
1625     * as a {@code double} value.
1626     *
1627     * @param columnName a {@code String} object giving the SQL name of
1628     *        a column in this {@code CachedRowSetImpl} object
1629     * @return the column value; if the value is SQL {@code NULL},
1630     *         the result is {@code 0}
1631     * @throws SQLException if (1) the given column name is not the name of
1632     *         a column in this rowset, (2) the cursor is not on one of
1633     *         this rowset's rows or its insert row, or (3) the designated
1634     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
1635     *         BIGINT, REAL,} <b>{@code FLOAT, DOUBLE}</b>, {@code DECIMAL,
1636     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
1637     *         The bold SQL type designates the recommended return types.
1638     * @see #getDouble(int)
1639     */
1640    public double getDouble(String columnName) throws SQLException {
1641        throw new UnsupportedOperationException();
1642    }
1643
1644    /**
1645     * Retrieves the value stored in the designated column
1646     * of the current row as a {@code java.math.BigDecimal} object.
1647     *
1648     * @param columnName a {@code String} object giving the SQL name of
1649     *        a column in this {@code CachedRowSetImpl} object
1650     * @param scale the number of digits to the right of the decimal point
1651     * @return a java.math.BugDecimal object with <i>{@code scale}</i>
1652     *         number of digits to the right of the decimal point.
1653     * @throws SQLException if (1) the given column name is not the name of
1654     *         a column in this rowset, (2) the cursor is not on one of
1655     *         this rowset's rows or its insert row, or (3) the designated
1656     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
1657     *         BIGINT, REAL, FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
1658     *         {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
1659     *         The bold SQL type designates the recommended return type
1660     *         that this method is used to retrieve.
1661     * @deprecated Use the {@code getBigDecimal(String columnName)}
1662     *             method instead
1663     */
1664    @Deprecated
1665    public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException {
1666        throw new UnsupportedOperationException();
1667    }
1668
1669    /**
1670     * Retrieves the value stored in the designated column
1671     * of the current row as a {@code byte} array.
1672     * The bytes represent the raw values returned by the driver.
1673     *
1674     * @param columnName a {@code String} object giving the SQL name of
1675     *        a column in this {@code CachedRowSetImpl} object
1676     * @return the column value as a {@code byte} array in the Java programming
1677     *         language; if the value is SQL {@code NULL}, the result is {@code null}
1678     * @throws SQLException if (1) the given column name is not the name of
1679     *         a column in this rowset, (2) the cursor is not on one of
1680     *         this rowset's rows or its insert row, or (3) the designated
1681     *         column does not store an SQL <b>{@code BINARY, VARBINARY}</b>
1682     *         or {@code LONGVARBINARY} values.
1683     *         The bold SQL type designates the recommended return type.
1684     * @see #getBytes(int)
1685     */
1686    public byte[] getBytes(String columnName) throws SQLException {
1687        throw new UnsupportedOperationException();
1688    }
1689
1690    /**
1691     * Retrieves the value stored in the designated column
1692     * of the current row as a {@code java.sql.Date} object.
1693     *
1694     * @param columnName a {@code String} object giving the SQL name of
1695     *        a column in this {@code CachedRowSetImpl} object
1696     * @return the column value; if the value is SQL {@code NULL},
1697     *         the result is {@code null}
1698     * @throws SQLException if (1) the given column name is not the name of
1699     *            a column in this rowset, (2) the cursor is not on one of
1700     *            this rowset's rows or its insert row, or (3) the designated
1701     *            column does not store an SQL {@code DATE} or
1702     *            {@code TIMESTAMP} value
1703     */
1704    public java.sql.Date getDate(String columnName) throws SQLException {
1705        throw new UnsupportedOperationException();
1706    }
1707
1708    /**
1709     * Retrieves the value stored in the designated column
1710     * of the current row as a {@code java.sql.Time} object.
1711     *
1712     * @param columnName a {@code String} object giving the SQL name of
1713     *        a column in this {@code CachedRowSetImpl} object
1714     * @return the column value; if the value is SQL {@code NULL},
1715     *         the result is {@code null}
1716     * @throws SQLException if the given column name does not match one of
1717     *            this rowset's column names or the cursor is not on one of
1718     *            this rowset's rows or its insert row
1719     */
1720    public java.sql.Time getTime(String columnName) throws SQLException {
1721        throw new UnsupportedOperationException();
1722    }
1723
1724    /**
1725     * Retrieves the value stored in the designated column
1726     * of the current row as a {@code java.sql.Timestamp} object.
1727     *
1728     * @param columnName a {@code String} object giving the SQL name of
1729     *        a column in this {@code CachedRowSetImpl} object
1730     * @return the column value; if the value is SQL {@code NULL},
1731     *         the result is {@code null}
1732     * @throws SQLException if the given column name does not match one of
1733     *            this rowset's column names or the cursor is not on one of
1734     *            this rowset's rows or its insert row
1735     */
1736    public java.sql.Timestamp getTimestamp(String columnName) throws SQLException {
1737        throw new UnsupportedOperationException();
1738    }
1739
1740    /**
1741     * Retrieves the value of the designated column in the current row of this
1742     * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
1743     * object.
1744     *
1745     * A column value can be retrieved as a stream of ASCII characters
1746     * and then read in chunks from the stream. This method is particularly
1747     * suitable for retrieving large {@code LONGVARCHAR} values. The
1748     * {@code SyncProvider} will rely on the JDBC driver to do any necessary
1749     * conversion from the database format into ASCII format.
1750     *
1751     * <P><B>Note:</B> All the data in the returned stream must
1752     * be read prior to getting the value of any other column. The
1753     * next call to a {@code getXXX} method implicitly closes the stream.
1754     *
1755     * @param columnName a {@code String} object giving the SQL name of
1756     *        a column in this {@code CachedRowSetImpl} object
1757     * @return a Java input stream that delivers the database column value
1758     *         as a stream of one-byte ASCII characters.  If the value is SQL
1759     *         {@code NULL}, the result is {@code null}.
1760     * @throws SQLException if (1) the given column name is not the name of
1761     *         a column in this rowset
1762     *         (2) the cursor is not on one of this rowset's rows or its
1763     *         insert row, or (3) the designated column does not store an
1764     *         SQL {@code CHAR, VARCHAR}, <b>{@code LONGVARCHAR}</b>,
1765     *         {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value. The
1766     *         bold SQL type designates the recommended return types
1767     *         that this method is used to retrieve.
1768     * @see #getAsciiStream(int)
1769     */
1770    public java.io.InputStream getAsciiStream(String columnName) throws SQLException {
1771        throw new UnsupportedOperationException();
1772
1773    }
1774
1775    /**
1776     * A column value can be retrieved as a stream of Unicode characters
1777     * and then read in chunks from the stream.  This method is particularly
1778     * suitable for retrieving large {@code LONGVARCHAR} values.
1779     * The JDBC driver will do any necessary conversion from the database
1780     * format into Unicode.
1781     *
1782     * <P><B>Note:</B> All the data in the returned stream must
1783     * be read prior to getting the value of any other column. The
1784     * next call to a {@code getXXX} method implicitly closes the stream.
1785     *
1786     * @param columnName a {@code String} object giving the SQL name of
1787     *        a column in this {@code CachedRowSetImpl} object
1788     * @return a Java input stream that delivers the database column value
1789     *         as a stream of two-byte Unicode characters.  If the value is
1790     *         SQL {@code NULL}, the result is {@code null}.
1791     * @throws SQLException if the given column name does not match one of
1792     *            this rowset's column names or the cursor is not on one of
1793     *            this rowset's rows or its insert row
1794     * @deprecated use the method {@code getCharacterStream} instead
1795     */
1796    @Deprecated
1797    public java.io.InputStream getUnicodeStream(String columnName) throws SQLException {
1798        throw new UnsupportedOperationException();
1799    }
1800
1801    /**
1802     * Retrieves the value of the designated column in the current row of this
1803     * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
1804     * object.
1805     * <P>
1806     * A column value can be retrieved as a stream of uninterpreted bytes
1807     * and then read in chunks from the stream.  This method is particularly
1808     * suitable for retrieving large {@code LONGVARBINARY} values.
1809     *
1810     * <P><B>Note:</B> All the data in the returned stream must be
1811     * read prior to getting the value of any other column. The next
1812     * call to a get method implicitly closes the stream. Also, a
1813     * stream may return {@code 0} for {@code CachedRowSetImpl.available()}
1814     * whether there is data available or not.
1815     *
1816     * @param columnName a {@code String} object giving the SQL name of
1817     *        a column in this {@code CachedRowSetImpl} object
1818     * @return a Java input stream that delivers the database column value
1819     *         as a stream of uninterpreted bytes.  If the value is SQL
1820     *         {@code NULL}, the result is {@code null}.
1821     * @throws SQLException if (1) the given column name is unknown,
1822     *         (2) the cursor is not on one of this rowset's rows or its
1823     *         insert row, or (3) the designated column does not store an
1824     *         SQL {@code BINARY, VARBINARY} or <b>{@code LONGVARBINARY}</b>
1825     *         The bold type indicates the SQL type that this method is recommened
1826     *         to retrieve.
1827     * @see #getBinaryStream(int)
1828     *
1829     */
1830    public java.io.InputStream getBinaryStream(String columnName) throws SQLException {
1831        throw new UnsupportedOperationException();
1832    }
1833
1834
1835    //=====================================================================
1836    // Advanced features:
1837    //=====================================================================
1838
1839    /**
1840     * The first warning reported by calls on this {@code CachedRowSetImpl}
1841     * object is returned. Subsequent {@code CachedRowSetImpl} warnings will
1842     * be chained to this {@code SQLWarning}.
1843     *
1844     * <P>The warning chain is automatically cleared each time a new
1845     * row is read.
1846     *
1847     * <P><B>Note:</B> This warning chain only covers warnings caused
1848     * by {@code ResultSet} methods.  Any warning caused by statement
1849     * methods (such as reading OUT parameters) will be chained on the
1850     * {@code Statement} object.
1851     *
1852     * @return the first SQLWarning or null
1853     */
1854    public SQLWarning getWarnings() {
1855        throw new UnsupportedOperationException();
1856    }
1857
1858    /**
1859     * Clears all the warnings reporeted for the {@code CachedRowSetImpl}
1860     * object. After a call to this method, the {@code getWarnings} method
1861     * returns {@code null} until a new warning is reported for this
1862     * {@code CachedRowSetImpl} object.
1863     */
1864    public void clearWarnings() {
1865       throw new UnsupportedOperationException();
1866    }
1867
1868    /**
1869     * Retrieves the name of the SQL cursor used by this
1870     * {@code CachedRowSetImpl} object.
1871     *
1872     * <P>In SQL, a result table is retrieved through a cursor that is
1873     * named. The current row of a {@code ResultSet} can be updated or deleted
1874     * using a positioned update/delete statement that references the
1875     * cursor name. To ensure that the cursor has the proper isolation
1876     * level to support an update operation, the cursor's {@code SELECT}
1877     * statement should be of the form {@code select for update}.
1878     * If the {@code for update} clause
1879     * is omitted, positioned updates may fail.
1880     *
1881     * <P>JDBC supports this SQL feature by providing the name of the
1882     * SQL cursor used by a {@code ResultSet} object. The current row
1883     * of a result set is also the current row of this SQL cursor.
1884     *
1885     * <P><B>Note:</B> If positioned updates are not supported, an
1886     * {@code SQLException} is thrown.
1887     *
1888     * @return the SQL cursor name for this {@code CachedRowSetImpl} object's
1889     *         cursor
1890     * @throws SQLException if an error occurs
1891     */
1892    public String getCursorName() throws SQLException {
1893        throw new UnsupportedOperationException();
1894    }
1895
1896    /**
1897     * Retrieves a {@code ResultSetMetaData} object instance that
1898     * contains information about the {@code CachedRowSet} object.
1899     * However, applications should cast the returned object to a
1900     * {@code RowSetMetaData} interface implementation. In the
1901     * reference implementation, this cast can be done on the
1902     * {@code RowSetMetaDataImpl} class.
1903     * <P>
1904     * For example:
1905     * <pre>
1906     * CachedRowSet crs = new CachedRowSetImpl();
1907     * RowSetMetaDataImpl metaData =
1908     *     (RowSetMetaDataImpl)crs.getMetaData();
1909     * // Set the number of columns in the RowSet object for
1910     * // which this RowSetMetaDataImpl object was created to the
1911     * // given number.
1912     * metaData.setColumnCount(3);
1913     * crs.setMetaData(metaData);
1914     * </pre>
1915     *
1916     * @return the {@code ResultSetMetaData} object that describes this
1917     *         {@code CachedRowSetImpl} object's columns
1918     * @throws SQLException if an error occurs in generating the RowSet
1919     * meta data; or if the {@code CachedRowSetImpl} is empty.
1920     * @see javax.sql.RowSetMetaData
1921     */
1922    public ResultSetMetaData getMetaData() throws SQLException {
1923        throw new UnsupportedOperationException();
1924    }
1925
1926
1927    /**
1928     * Retrieves the value of the designated column in the current row
1929     * of this {@code CachedRowSetImpl} object as an
1930     * {@code Object} value.
1931     * <P>
1932     * The type of the {@code Object} will be the default
1933     * Java object type corresponding to the column's SQL type,
1934     * following the mapping for built-in types specified in the JDBC 3.0
1935     * specification.
1936     * <P>
1937     * This method may also be used to read datatabase-specific
1938     * abstract data types.
1939     * <P>
1940     * This implementation of the method {@code getObject} extends its
1941     * behavior so that it gets the attributes of an SQL structured type
1942     * as an array of {@code Object} values.  This method also custom
1943     * maps SQL user-defined types to classes in the Java programming language.
1944     * When the specified column contains
1945     * a structured or distinct value, the behavior of this method is as
1946     * if it were a call to the method {@code getObject(columnIndex,
1947     * this.getStatement().getConnection().getTypeMap())}.
1948     *
1949     * @param columnIndex the first column is {@code 1}, the second
1950     *        is {@code 2}, and so on; must be {@code 1} or larger
1951     *        and equal to or less than the number of columns in the rowset
1952     * @return a {@code java.lang.Object} holding the column value;
1953     *         if the value is SQL {@code NULL}, the result is {@code null}
1954     * @throws SQLException if the given column index is out of bounds,
1955     *            the cursor is not on a valid row, or there is a problem getting
1956     *            the {@code Class} object for a custom mapping
1957     * @see #getObject(String)
1958     */
1959    public Object getObject(int columnIndex) throws SQLException {
1960        throw new UnsupportedOperationException();
1961    }
1962
1963    /**
1964     * Retrieves the value of the designated column in the current row
1965     * of this {@code CachedRowSetImpl} object as an
1966     * {@code Object} value.
1967     * <P>
1968     * The type of the {@code Object} will be the default
1969     * Java object type corresponding to the column's SQL type,
1970     * following the mapping for built-in types specified in the JDBC 3.0
1971     * specification.
1972     * <P>
1973     * This method may also be used to read datatabase-specific
1974     * abstract data types.
1975     * <P>
1976     * This implementation of the method {@code getObject} extends its
1977     * behavior so that it gets the attributes of an SQL structured type
1978     * as an array of {@code Object} values.  This method also custom
1979     * maps SQL user-defined types to classes
1980     * in the Java programming language. When the specified column contains
1981     * a structured or distinct value, the behavior of this method is as
1982     * if it were a call to the method {@code getObject(columnIndex,
1983     * this.getStatement().getConnection().getTypeMap())}.
1984     *
1985     * @param columnName a {@code String} object that must match the
1986     *        SQL name of a column in this rowset, ignoring case
1987     * @return a {@code java.lang.Object} holding the column value;
1988     *         if the value is SQL {@code NULL}, the result is {@code null}
1989     * @throws SQLException if (1) the given column name does not match one of
1990     *            this rowset's column names, (2) the cursor is not
1991     *            on a valid row, or (3) there is a problem getting
1992     *            the {@code Class} object for a custom mapping
1993     * @see #getObject(int)
1994     */
1995    public Object getObject(String columnName) throws SQLException {
1996       throw new UnsupportedOperationException();
1997    }
1998
1999    //----------------------------------------------------------------
2000
2001    /**
2002     * Maps the given column name for one of this {@code CachedRowSetImpl}
2003     * object's columns to its column number.
2004     *
2005     * @param columnName a {@code String} object that must match the
2006     *        SQL name of a column in this rowset, ignoring case
2007     * @return the column index of the given column name
2008     * @throws SQLException if the given column name does not match one
2009     *            of this rowset's column names
2010     */
2011    public int findColumn(String columnName) throws SQLException {
2012       throw new UnsupportedOperationException();
2013    }
2014
2015    //--------------------------JDBC 2.0-----------------------------------
2016
2017    //---------------------------------------------------------------------
2018    // Getter's and Setter's
2019    //---------------------------------------------------------------------
2020
2021    /**
2022     * Retrieves the value stored in the designated column
2023     * of the current row as a {@code java.io.Reader} object.
2024     *
2025     * <P><B>Note:</B> All the data in the returned stream must
2026     * be read prior to getting the value of any other column. The
2027     * next call to a {@code getXXX} method implicitly closes the stream.
2028     *
2029     * @param columnIndex the first column is {@code 1}, the second
2030     *        is {@code 2}, and so on; must be {@code 1} or larger
2031     *        and equal to or less than the number of columns in the rowset
2032     * @return a Java character stream that delivers the database column value
2033     * as a stream of two-byte unicode characters in a
2034     * {@code java.io.Reader} object.  If the value is
2035     * SQL {@code NULL}, the result is {@code null}.
2036     * @throws SQLException if (1) the given column index is out of bounds,
2037     *         (2) the cursor is not on one of this rowset's rows or its
2038     *         insert row, or (3) the designated column does not store an
2039     *         SQL {@code CHAR, VARCHAR,} <b>{@code LONGVARCHAR}</b>,
2040     *         {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value.
2041     *         The bold SQL type designates the recommended return type.
2042     * @see #getCharacterStream(String)
2043     */
2044    public java.io.Reader getCharacterStream(int columnIndex) throws SQLException{
2045        throw new UnsupportedOperationException();
2046    }
2047
2048    /**
2049     * Retrieves the value stored in the designated column
2050     * of the current row as a {@code java.io.Reader} object.
2051     *
2052     * <P><B>Note:</B> All the data in the returned stream must
2053     * be read prior to getting the value of any other column. The
2054     * next call to a {@code getXXX} method implicitly closes the stream.
2055     *
2056     * @param columnName a {@code String} object giving the SQL name of
2057     *        a column in this {@code CachedRowSetImpl} object
2058     * @return a Java input stream that delivers the database column value
2059     *         as a stream of two-byte Unicode characters.  If the value is
2060     *         SQL {@code NULL}, the result is {@code null}.
2061     * @throws SQLException if (1) the given column name is not the name of
2062     *         a column in this rowset, (2) the cursor is not on one of
2063     *         this rowset's rows or its insert row, or (3) the designated
2064     *         column does not store an SQL {@code CHAR, VARCHAR,}
2065     *         <b>{@code LONGVARCHAR}</b>,
2066     *         {@code BINARY, VARYBINARY} or {@code LONGVARBINARY} value.
2067     *         The bold SQL type designates the recommended return type.
2068     */
2069    public java.io.Reader getCharacterStream(String columnName) throws SQLException {
2070        throw new UnsupportedOperationException();
2071    }
2072
2073    /**
2074     * Retrieves the value of the designated column in the current row
2075     * of this {@code CachedRowSetImpl} object as a
2076     * {@code java.math.BigDecimal} object.
2077     *
2078     * @param columnIndex the first column is {@code 1}, the second
2079     *        is {@code 2}, and so on; must be {@code 1} or larger
2080     *        and equal to or less than the number of columns in the rowset
2081     * @return a {@code java.math.BigDecimal} value with full precision;
2082     *         if the value is SQL {@code NULL}, the result is {@code null}
2083     * @throws SQLException if (1) the given column index is out of bounds,
2084     *         (2) the cursor is not on one of this rowset's rows or its
2085     *         insert row, or (3) the designated column does not store an
2086     *         SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
2087     *         FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
2088     *         {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
2089     *         The bold SQL type designates the
2090     *         recommended return types that this method is used to retrieve.
2091     * @see #getBigDecimal(String)
2092     */
2093    public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
2094        throw new UnsupportedOperationException();
2095    }
2096
2097    /**
2098     * Retrieves the value of the designated column in the current row
2099     * of this {@code CachedRowSetImpl} object as a
2100     * {@code java.math.BigDecimal} object.
2101     *
2102     * @param columnName a {@code String} object that must match the
2103     *        SQL name of a column in this rowset, ignoring case
2104     * @return a {@code java.math.BigDecimal} value with full precision;
2105     *         if the value is SQL {@code NULL}, the result is {@code null}
2106     * @throws SQLException if (1) the given column name is not the name of
2107     *         a column in this rowset, (2) the cursor is not on one of
2108     *         this rowset's rows or its insert row, or (3) the designated
2109     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
2110     *         BIGINT, REAL, FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
2111     *         {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
2112     *         The bold SQL type designates the recommended return type
2113     *         that this method is used to retrieve.
2114     * @see #getBigDecimal(int)
2115     */
2116    public BigDecimal getBigDecimal(String columnName) throws SQLException {
2117        throw new UnsupportedOperationException();
2118    }
2119
2120    //---------------------------------------------------------------------
2121    // Traversal/Positioning
2122    //---------------------------------------------------------------------
2123
2124    /**
2125     * Returns the number of rows in this {@code CachedRowSetImpl} object.
2126     *
2127     * @return number of rows in the rowset
2128     */
2129    public int size() {
2130        throw new UnsupportedOperationException();
2131    }
2132
2133    /**
2134     * Indicates whether the cursor is before the first row in this
2135     * {@code CachedRowSetImpl} object.
2136     *
2137     * @return {@code true} if the cursor is before the first row;
2138     *         {@code false} otherwise or if the rowset contains no rows
2139     * @throws SQLException if an error occurs
2140     */
2141    public boolean isBeforeFirst() throws SQLException {
2142        throw new UnsupportedOperationException();
2143    }
2144
2145    /**
2146     * Indicates whether the cursor is after the last row in this
2147     * {@code CachedRowSetImpl} object.
2148     *
2149     * @return {@code true} if the cursor is after the last row;
2150     *         {@code false} otherwise or if the rowset contains no rows
2151     * @throws SQLException if an error occurs
2152     */
2153    public boolean isAfterLast() throws SQLException {
2154        throw new UnsupportedOperationException();
2155    }
2156
2157    /**
2158     * Indicates whether the cursor is on the first row in this
2159     * {@code CachedRowSetImpl} object.
2160     *
2161     * @return {@code true} if the cursor is on the first row;
2162     *         {@code false} otherwise or if the rowset contains no rows
2163     * @throws SQLException if an error occurs
2164     */
2165    public boolean isFirst() throws SQLException {
2166        throw new UnsupportedOperationException();
2167    }
2168
2169    /**
2170     * Indicates whether the cursor is on the last row in this
2171     * {@code CachedRowSetImpl} object.
2172     * <P>
2173     * Note: Calling the method {@code isLast} may be expensive
2174     * because the JDBC driver might need to fetch ahead one row in order
2175     * to determine whether the current row is the last row in this rowset.
2176     *
2177     * @return {@code true} if the cursor is on the last row;
2178     *         {@code false} otherwise or if this rowset contains no rows
2179     * @throws SQLException if an error occurs
2180     */
2181    public boolean isLast() throws SQLException {
2182        throw new UnsupportedOperationException();
2183    }
2184
2185    /**
2186     * Moves this {@code CachedRowSetImpl} object's cursor to the front of
2187     * the rowset, just before the first row. This method has no effect if
2188     * this rowset contains no rows.
2189     *
2190     * @throws SQLException if an error occurs or the type of this rowset
2191     *            is {@code ResultSet.TYPE_FORWARD_ONLY}
2192     */
2193    public void beforeFirst() throws SQLException {
2194        throw new UnsupportedOperationException();
2195    }
2196
2197    /**
2198     * Moves this {@code CachedRowSetImpl} object's cursor to the end of
2199     * the rowset, just after the last row. This method has no effect if
2200     * this rowset contains no rows.
2201     *
2202     * @throws SQLException if an error occurs
2203     */
2204    public void afterLast() throws SQLException {
2205        throw new UnsupportedOperationException();
2206    }
2207
2208    /**
2209     * Moves this {@code CachedRowSetImpl} object's cursor to the first row
2210     * and returns {@code true} if the operation was successful.  This
2211     * method also notifies registered listeners that the cursor has moved.
2212     *
2213     * @return {@code true} if the cursor is on a valid row;
2214     *         {@code false} otherwise or if there are no rows in this
2215     *         {@code CachedRowSetImpl} object
2216     * @throws SQLException if the type of this rowset
2217     *            is {@code ResultSet.TYPE_FORWARD_ONLY}
2218     */
2219    public boolean first() throws SQLException {
2220        throw new UnsupportedOperationException();
2221    }
2222
2223    /**
2224     * Moves this {@code CachedRowSetImpl} object's cursor to the first
2225     * row and returns {@code true} if the operation is successful.
2226     * <P>
2227     * This method is called internally by the methods {@code first},
2228     * {@code isFirst}, and {@code absolute}.
2229     * It in turn calls the method {@code internalNext} in order to
2230     * handle the case where the first row is a deleted row that is not visible.
2231     * <p>
2232     * This is a implementation only method and is not required as a standard
2233     * implementation of the {@code CachedRowSet} interface.
2234     *
2235     * @return {@code true} if the cursor moved to the first row;
2236     *         {@code false} otherwise
2237     * @throws SQLException if an error occurs
2238     */
2239    protected boolean internalFirst() throws SQLException {
2240        throw new UnsupportedOperationException();
2241    }
2242
2243    /**
2244     * Moves this {@code CachedRowSetImpl} object's cursor to the last row
2245     * and returns {@code true} if the operation was successful.  This
2246     * method also notifies registered listeners that the cursor has moved.
2247     *
2248     * @return {@code true} if the cursor is on a valid row;
2249     *         {@code false} otherwise or if there are no rows in this
2250     *         {@code CachedRowSetImpl} object
2251     * @throws SQLException if the type of this rowset
2252     *            is {@code ResultSet.TYPE_FORWARD_ONLY}
2253     */
2254    public boolean last() throws SQLException {
2255        throw new UnsupportedOperationException();
2256    }
2257
2258    /**
2259     * Moves this {@code CachedRowSetImpl} object's cursor to the last
2260     * row and returns {@code true} if the operation is successful.
2261     * <P>
2262     * This method is called internally by the method {@code last}
2263     * when rows have been deleted and the deletions are not visible.
2264     * The method {@code internalLast} handles the case where the
2265     * last row is a deleted row that is not visible by in turn calling
2266     * the method {@code internalPrevious}.
2267     * <p>
2268     * This is a implementation only method and is not required as a standard
2269     * implementation of the {@code CachedRowSet} interface.
2270     *
2271     * @return {@code true} if the cursor moved to the last row;
2272     *         {@code false} otherwise
2273     * @throws SQLException if an error occurs
2274     */
2275    protected boolean internalLast() throws SQLException {
2276        throw new UnsupportedOperationException();
2277    }
2278
2279    /**
2280     * Returns the number of the current row in this {@code CachedRowSetImpl}
2281     * object. The first row is number 1, the second number 2, and so on.
2282     *
2283     * @return the number of the current row;  {@code 0} if there is no
2284     *         current row
2285     * @throws SQLException if an error occurs; or if the {@code CacheRowSetImpl}
2286     *         is empty
2287     */
2288    public int getRow() throws SQLException {
2289        return crsSync.getRow();
2290    }
2291
2292    /**
2293     * Moves this {@code CachedRowSetImpl} object's cursor to the row number
2294     * specified.
2295     *
2296     * <p>If the number is positive, the cursor moves to an absolute row with
2297     * respect to the beginning of the rowset.  The first row is row 1, the second
2298     * is row 2, and so on.  For example, the following command, in which
2299     * {@code crs} is a {@code CachedRowSetImpl} object, moves the cursor
2300     * to the fourth row, starting from the beginning of the rowset.
2301     * <PRE>{@code
2302     *
2303     *    crs.absolute(4);
2304     *
2305     * }</PRE>
2306     * <P>
2307     * If the number is negative, the cursor moves to an absolute row position
2308     * with respect to the end of the rowset.  For example, calling
2309     * {@code absolute(-1)} positions the cursor on the last row,
2310     * {@code absolute(-2)} moves it on the next-to-last row, and so on.
2311     * If the {@code CachedRowSetImpl} object {@code crs} has five rows,
2312     * the following command moves the cursor to the fourth-to-last row, which
2313     * in the case of a  rowset with five rows, is also the second row, counting
2314     * from the beginning.
2315     * <PRE>{@code
2316     *
2317     *    crs.absolute(-4);
2318     *
2319     * }</PRE>
2320     *
2321     * If the number specified is larger than the number of rows, the cursor
2322     * will move to the position after the last row. If the number specified
2323     * would move the cursor one or more rows before the first row, the cursor
2324     * moves to the position before the first row.
2325     * <P>
2326     * Note: Calling {@code absolute(1)} is the same as calling the
2327     * method {@code first()}.  Calling {@code absolute(-1)} is the
2328     * same as calling {@code last()}.
2329     *
2330     * @param row a positive number to indicate the row, starting row numbering from
2331     *        the first row, which is {@code 1}; a negative number to indicate
2332     *        the row, starting row numbering from the last row, which is
2333     *        {@code -1}; it must not be {@code 0}
2334     * @return {@code true} if the cursor is on the rowset; {@code false}
2335     *         otherwise
2336     * @throws SQLException if the given cursor position is {@code 0} or the
2337     *            type of this rowset is {@code ResultSet.TYPE_FORWARD_ONLY}
2338     */
2339    public boolean absolute( int row ) throws SQLException {
2340        throw new UnsupportedOperationException();
2341    }
2342
2343    /**
2344     * Moves the cursor the specified number of rows from the current
2345     * position, with a positive number moving it forward and a
2346     * negative number moving it backward.
2347     * <P>
2348     * If the number is positive, the cursor moves the specified number of
2349     * rows toward the end of the rowset, starting at the current row.
2350     * For example, the following command, in which
2351     * {@code crs} is a {@code CachedRowSetImpl} object with 100 rows,
2352     * moves the cursor forward four rows from the current row.  If the
2353     * current row is 50, the cursor would move to row 54.
2354     * <PRE>{@code
2355     *
2356     *    crs.relative(4);
2357     *
2358     * }</PRE>
2359     * <P>
2360     * If the number is negative, the cursor moves back toward the beginning
2361     * the specified number of rows, starting at the current row.
2362     * For example, calling the method
2363     * {@code absolute(-1)} positions the cursor on the last row,
2364     * {@code absolute(-2)} moves it on the next-to-last row, and so on.
2365     * If the {@code CachedRowSetImpl} object {@code crs} has five rows,
2366     * the following command moves the cursor to the fourth-to-last row, which
2367     * in the case of a  rowset with five rows, is also the second row
2368     * from the beginning.
2369     * <PRE>{@code
2370     *
2371     *    crs.absolute(-4);
2372     *
2373     * }</PRE>
2374     *
2375     * If the number specified is larger than the number of rows, the cursor
2376     * will move to the position after the last row. If the number specified
2377     * would move the cursor one or more rows before the first row, the cursor
2378     * moves to the position before the first row. In both cases, this method
2379     * throws an {@code SQLException}.
2380     * <P>
2381     * Note: Calling {@code absolute(1)} is the same as calling the
2382     * method {@code first()}.  Calling {@code absolute(-1)} is the
2383     * same as calling {@code last()}.  Calling {@code relative(0)}
2384     * is valid, but it does not change the cursor position.
2385     *
2386     * @param rows an {@code int} indicating the number of rows to move
2387     *             the cursor, starting at the current row; a positive number
2388     *             moves the cursor forward; a negative number moves the cursor
2389     *             backward; must not move the cursor past the valid
2390     *             rows
2391     * @return {@code true} if the cursor is on a row in this
2392     *         {@code CachedRowSetImpl} object; {@code false}
2393     *         otherwise
2394     * @throws SQLException if there are no rows in this rowset, the cursor is
2395     *         positioned either before the first row or after the last row, or
2396     *         the rowset is type {@code ResultSet.TYPE_FORWARD_ONLY}
2397     */
2398    public boolean relative(int rows) throws SQLException {
2399        throw new UnsupportedOperationException();
2400    }
2401
2402    /**
2403     * Moves this {@code CachedRowSetImpl} object's cursor to the
2404     * previous row and returns {@code true} if the cursor is on
2405     * a valid row or {@code false} if it is not.
2406     * This method also notifies all listeners registered with this
2407     * {@code CachedRowSetImpl} object that its cursor has moved.
2408     * <P>
2409     * Note: calling the method {@code previous()} is not the same
2410     * as calling the method {@code relative(-1)}.  This is true
2411     * because it is possible to call {@code previous()} from the insert
2412     * row, from after the last row, or from the current row, whereas
2413     * {@code relative} may only be called from the current row.
2414     * <P>
2415     * The method {@code previous} may used in a {@code while}
2416     * loop to iterate through a rowset starting after the last row
2417     * and moving toward the beginning. The loop ends when {@code previous}
2418     * returns {@code false}, meaning that there are no more rows.
2419     * For example, the following code fragment retrieves all the data in
2420     * the {@code CachedRowSetImpl} object {@code crs}, which has
2421     * three columns.  Note that the cursor must initially be positioned
2422     * after the last row so that the first call to the method
2423     * {@code previous} places the cursor on the last line.
2424     * <PRE>{@code
2425     *
2426     *     crs.afterLast();
2427     *     while (previous()) {
2428     *         String name = crs.getString(1);
2429     *         int age = crs.getInt(2);
2430     *         short ssn = crs.getShort(3);
2431     *         System.out.println(name + "   " + age + "   " + ssn);
2432     *     }
2433     *
2434     * }</PRE>
2435     * This method throws an {@code SQLException} if the cursor is not
2436     * on a row in the rowset, before the first row, or after the last row.
2437     *
2438     * @return {@code true} if the cursor is on a valid row;
2439     *         {@code false} if it is before the first row or after the
2440     *         last row
2441     * @throws SQLException if the cursor is not on a valid position or the
2442     *           type of this rowset is {@code ResultSet.TYPE_FORWARD_ONLY}
2443     */
2444    public boolean previous() throws SQLException {
2445        throw new UnsupportedOperationException();
2446    }
2447
2448    /**
2449     * Moves the cursor to the previous row in this {@code CachedRowSetImpl}
2450     * object, skipping past deleted rows that are not visible; returns
2451     * {@code true} if the cursor is on a row in this rowset and
2452     * {@code false} when the cursor goes before the first row.
2453     * <P>
2454     * This method is called internally by the method {@code previous}.
2455     * <P>
2456     * This is a implementation only method and is not required as a standard
2457     * implementation of the {@code CachedRowSet} interface.
2458     *
2459     * @return {@code true} if the cursor is on a row in this rowset;
2460     *         {@code false} when the cursor reaches the position before
2461     *         the first row
2462     * @throws SQLException if an error occurs
2463     */
2464    protected boolean internalPrevious() throws SQLException {
2465        throw new UnsupportedOperationException();
2466    }
2467
2468
2469    //---------------------------------------------------------------------
2470    // Updates
2471    //---------------------------------------------------------------------
2472
2473    /**
2474     * Indicates whether the current row of this {@code CachedRowSetImpl}
2475     * object has been updated.  The value returned
2476     * depends on whether this rowset can detect updates: {@code false}
2477     * will always be returned if it does not detect updates.
2478     *
2479     * @return {@code true} if the row has been visibly updated
2480     *         by the owner or another and updates are detected;
2481     *         {@code false} otherwise
2482     * @throws SQLException if the cursor is on the insert row or not
2483     *            not on a valid row
2484     *
2485     * @see DatabaseMetaData#updatesAreDetected
2486     */
2487    public boolean rowUpdated() throws SQLException {
2488        throw new UnsupportedOperationException();
2489    }
2490
2491    /**
2492     * Indicates whether the designated column of the current row of
2493     * this {@code CachedRowSetImpl} object has been updated. The
2494     * value returned depends on whether this rowset can detcted updates:
2495     * {@code false} will always be returned if it does not detect updates.
2496     *
2497     * @param idx the index identifier of the column that may be have been updated.
2498     * @return {@code true} is the designated column has been updated
2499     * and the rowset detects updates; {@code false} if the rowset has not
2500     * been updated or the rowset does not detect updates
2501     * @throws SQLException if the cursor is on the insert row or not
2502     *          on a valid row
2503     * @see DatabaseMetaData#updatesAreDetected
2504     */
2505    public boolean columnUpdated(int idx) throws SQLException {
2506        throw new UnsupportedOperationException();
2507    }
2508
2509    /**
2510     * Indicates whether the designated column of the current row of
2511     * this {@code CachedRowSetImpl} object has been updated. The
2512     * value returned depends on whether this rowset can detcted updates:
2513     * {@code false} will always be returned if it does not detect updates.
2514     *
2515     * @param columnName the {@code String} column name column that may be have
2516     * been updated.
2517     * @return {@code true} is the designated column has been updated
2518     * and the rowset detects updates; {@code false} if the rowset has not
2519     * been updated or the rowset does not detect updates
2520     * @throws SQLException if the cursor is on the insert row or not
2521     *          on a valid row
2522     * @see DatabaseMetaData#updatesAreDetected
2523     */
2524    public boolean columnUpdated(String columnName) throws SQLException {
2525        throw new UnsupportedOperationException();
2526    }
2527
2528    /**
2529     * Indicates whether the current row has been inserted.  The value returned
2530     * depends on whether or not the rowset can detect visible inserts.
2531     *
2532     * @return {@code true} if a row has been inserted and inserts are detected;
2533     *         {@code false} otherwise
2534     * @throws SQLException if the cursor is on the insert row or not
2535     *            not on a valid row
2536     *
2537     * @see DatabaseMetaData#insertsAreDetected
2538     */
2539    public boolean rowInserted() throws SQLException {
2540        throw new UnsupportedOperationException();
2541    }
2542
2543    /**
2544     * Indicates whether the current row has been deleted.  A deleted row
2545     * may leave a visible "hole" in a rowset.  This method can be used to
2546     * detect such holes if the rowset can detect deletions. This method
2547     * will always return {@code false} if this rowset cannot detect
2548     * deletions.
2549     *
2550     * @return {@code true} if (1)the current row is blank, indicating that
2551     *         the row has been deleted, and (2)deletions are detected;
2552     *         {@code false} otherwise
2553     * @throws SQLException if the cursor is on a valid row in this rowset
2554     * @see DatabaseMetaData#deletesAreDetected
2555     */
2556    public boolean rowDeleted() throws SQLException {
2557        throw new UnsupportedOperationException();
2558    }
2559
2560    /**
2561     * Sets the designated nullable column in the current row or the
2562     * insert row of this {@code CachedRowSetImpl} object with
2563     * {@code null} value.
2564     * <P>
2565     * This method updates a column value in the current row or the insert
2566     * row of this rowset; however, another method must be called to complete
2567     * the update process. If the cursor is on a row in the rowset, the
2568     * method {@link #updateRow} must be called to mark the row as updated
2569     * and to notify listeners that the row has changed.
2570     * If the cursor is on the insert row, the method {@link #insertRow}
2571     * must be called to insert the new row into this rowset and to notify
2572     * listeners that a row has changed.
2573     * <P>
2574     * In order to propagate updates in this rowset to the underlying
2575     * data source, an application must call the method {@link #acceptChanges}
2576     * after it calls either {@code updateRow} or {@code insertRow}.
2577     *
2578     * @param columnIndex the first column is {@code 1}, the second
2579     *        is {@code 2}, and so on; must be {@code 1} or larger
2580     *        and equal to or less than the number of columns in this rowset
2581     * @throws SQLException if (1) the given column index is out of bounds,
2582     *            (2) the cursor is not on one of this rowset's rows or its
2583     *            insert row, or (3) this rowset is
2584     *            {@code ResultSet.CONCUR_READ_ONLY}
2585     */
2586    public void updateNull(int columnIndex) throws SQLException {
2587        throw new UnsupportedOperationException();
2588    }
2589
2590    /**
2591     * Sets the designated column in either the current row or the insert
2592     * row of this {@code CachedRowSetImpl} object with the given
2593     * {@code boolean} value.
2594     * <P>
2595     * This method updates a column value in the current row or the insert
2596     * row of this rowset, but it does not update the database.
2597     * If the cursor is on a row in the rowset, the
2598     * method {@link #updateRow} must be called to update the database.
2599     * If the cursor is on the insert row, the method {@link #insertRow}
2600     * must be called, which will insert the new row into both this rowset
2601     * and the database. Both of these methods must be called before the
2602     * cursor moves to another row.
2603     *
2604     * @param columnIndex the first column is {@code 1}, the second
2605     *        is {@code 2}, and so on; must be {@code 1} or larger
2606     *        and equal to or less than the number of columns in this rowset
2607     * @param x the new column value
2608     * @throws SQLException if (1) the given column index is out of bounds,
2609     *            (2) the cursor is not on one of this rowset's rows or its
2610     *            insert row, or (3) this rowset is
2611     *            {@code ResultSet.CONCUR_READ_ONLY}
2612     */
2613    public void updateBoolean(int columnIndex, boolean x) throws SQLException {
2614        throw new UnsupportedOperationException();
2615    }
2616
2617    /**
2618     * Sets the designated column in either the current row or the insert
2619     * row of this {@code CachedRowSetImpl} object with the given
2620     * {@code byte} value.
2621     * <P>
2622     * This method updates a column value in the current row or the insert
2623     * row of this rowset, but it does not update the database.
2624     * If the cursor is on a row in the rowset, the
2625     * method {@link #updateRow} must be called to update the database.
2626     * If the cursor is on the insert row, the method {@link #insertRow}
2627     * must be called, which will insert the new row into both this rowset
2628     * and the database. Both of these methods must be called before the
2629     * cursor moves to another row.
2630     *
2631     * @param columnIndex the first column is {@code 1}, the second
2632     *        is {@code 2}, and so on; must be {@code 1} or larger
2633     *        and equal to or less than the number of columns in this rowset
2634     * @param x the new column value
2635     * @throws SQLException if (1) the given column index is out of bounds,
2636     *            (2) the cursor is not on one of this rowset's rows or its
2637     *            insert row, or (3) this rowset is
2638     *            {@code ResultSet.CONCUR_READ_ONLY}
2639     */
2640    public void updateByte(int columnIndex, byte x) throws SQLException {
2641        throw new UnsupportedOperationException();
2642    }
2643
2644    /**
2645     * Sets the designated column in either the current row or the insert
2646     * row of this {@code CachedRowSetImpl} object with the given
2647     * {@code short} value.
2648     * <P>
2649     * This method updates a column value in the current row or the insert
2650     * row of this rowset, but it does not update the database.
2651     * If the cursor is on a row in the rowset, the
2652     * method {@link #updateRow} must be called to update the database.
2653     * If the cursor is on the insert row, the method {@link #insertRow}
2654     * must be called, which will insert the new row into both this rowset
2655     * and the database. Both of these methods must be called before the
2656     * cursor moves to another row.
2657     *
2658     * @param columnIndex the first column is {@code 1}, the second
2659     *        is {@code 2}, and so on; must be {@code 1} or larger
2660     *        and equal to or less than the number of columns in this rowset
2661     * @param x the new column value
2662     * @throws SQLException if (1) the given column index is out of bounds,
2663     *            (2) the cursor is not on one of this rowset's rows or its
2664     *            insert row, or (3) this rowset is
2665     *            {@code ResultSet.CONCUR_READ_ONLY}
2666     */
2667    public void updateShort(int columnIndex, short x) throws SQLException {
2668        throw new UnsupportedOperationException();
2669    }
2670
2671    /**
2672     * Sets the designated column in either the current row or the insert
2673     * row of this {@code CachedRowSetImpl} object with the given
2674     * {@code int} value.
2675     * <P>
2676     * This method updates a column value in the current row or the insert
2677     * row of this rowset, but it does not update the database.
2678     * If the cursor is on a row in the rowset, the
2679     * method {@link #updateRow} must be called to update the database.
2680     * If the cursor is on the insert row, the method {@link #insertRow}
2681     * must be called, which will insert the new row into both this rowset
2682     * and the database. Both of these methods must be called before the
2683     * cursor moves to another row.
2684     *
2685     * @param columnIndex the first column is {@code 1}, the second
2686     *        is {@code 2}, and so on; must be {@code 1} or larger
2687     *        and equal to or less than the number of columns in this rowset
2688     * @param x the new column value
2689     * @throws SQLException if (1) the given column index is out of bounds,
2690     *            (2) the cursor is not on one of this rowset's rows or its
2691     *            insert row, or (3) this rowset is
2692     *            {@code ResultSet.CONCUR_READ_ONLY}
2693     */
2694    public void updateInt(int columnIndex, int x) throws SQLException {
2695        throw new UnsupportedOperationException();
2696    }
2697
2698    /**
2699     * Sets the designated column in either the current row or the insert
2700     * row of this {@code CachedRowSetImpl} object with the given
2701     * {@code long} value.
2702     * <P>
2703     * This method updates a column value in the current row or the insert
2704     * row of this rowset, but it does not update the database.
2705     * If the cursor is on a row in the rowset, the
2706     * method {@link #updateRow} must be called to update the database.
2707     * If the cursor is on the insert row, the method {@link #insertRow}
2708     * must be called, which will insert the new row into both this rowset
2709     * and the database. Both of these methods must be called before the
2710     * cursor moves to another row.
2711     *
2712     * @param columnIndex the first column is {@code 1}, the second
2713     *        is {@code 2}, and so on; must be {@code 1} or larger
2714     *        and equal to or less than the number of columns in this rowset
2715     * @param x the new column value
2716     * @throws SQLException if (1) the given column index is out of bounds,
2717     *            (2) the cursor is not on one of this rowset's rows or its
2718     *            insert row, or (3) this rowset is
2719     *            {@code ResultSet.CONCUR_READ_ONLY}
2720     */
2721    public void updateLong(int columnIndex, long x) throws SQLException {
2722       throw new UnsupportedOperationException();
2723
2724    }
2725
2726    /**
2727     * Sets the designated column in either the current row or the insert
2728     * row of this {@code CachedRowSetImpl} object with the given
2729     * {@code float} value.
2730     * <P>
2731     * This method updates a column value in the current row or the insert
2732     * row of this rowset, but it does not update the database.
2733     * If the cursor is on a row in the rowset, the
2734     * method {@link #updateRow} must be called to update the database.
2735     * If the cursor is on the insert row, the method {@link #insertRow}
2736     * must be called, which will insert the new row into both this rowset
2737     * and the database. Both of these methods must be called before the
2738     * cursor moves to another row.
2739     *
2740     * @param columnIndex the first column is {@code 1}, the second
2741     *        is {@code 2}, and so on; must be {@code 1} or larger
2742     *        and equal to or less than the number of columns in this rowset
2743     * @param x the new column value
2744     * @throws SQLException if (1) the given column index is out of bounds,
2745     *            (2) the cursor is not on one of this rowset's rows or its
2746     *            insert row, or (3) this rowset is
2747     *            {@code ResultSet.CONCUR_READ_ONLY}
2748     */
2749    public void updateFloat(int columnIndex, float x) throws SQLException {
2750        throw new UnsupportedOperationException();
2751    }
2752
2753    /**
2754     * Sets the designated column in either the current row or the insert
2755     * row of this {@code CachedRowSetImpl} object with the given
2756     * {@code double} value.
2757     *
2758     * This method updates a column value in either the current row or
2759     * the insert row of this rowset, but it does not update the
2760     * database.  If the cursor is on a row in the rowset, the
2761     * method {@link #updateRow} must be called to update the database.
2762     * If the cursor is on the insert row, the method {@link #insertRow}
2763     * must be called, which will insert the new row into both this rowset
2764     * and the database. Both of these methods must be called before the
2765     * cursor moves to another row.
2766     *
2767     * @param columnIndex the first column is {@code 1}, the second
2768     *        is {@code 2}, and so on; must be {@code 1} or larger
2769     *        and equal to or less than the number of columns in this rowset
2770     * @param x the new column value
2771     * @throws SQLException if (1) the given column index is out of bounds,
2772     *            (2) the cursor is not on one of this rowset's rows or its
2773     *            insert row, or (3) this rowset is
2774     *            {@code ResultSet.CONCUR_READ_ONLY}
2775     */
2776    public void updateDouble(int columnIndex, double x) throws SQLException {
2777        throw new UnsupportedOperationException();
2778    }
2779
2780    /**
2781     * Sets the designated column in either the current row or the insert
2782     * row of this {@code CachedRowSetImpl} object with the given
2783     * {@code java.math.BigDecimal} object.
2784     * <P>
2785     * This method updates a column value in the current row or the insert
2786     * row of this rowset, but it does not update the database.
2787     * If the cursor is on a row in the rowset, the
2788     * method {@link #updateRow} must be called to update the database.
2789     * If the cursor is on the insert row, the method {@link #insertRow}
2790     * must be called, which will insert the new row into both this rowset
2791     * and the database. Both of these methods must be called before the
2792     * cursor moves to another row.
2793     *
2794     * @param columnIndex the first column is {@code 1}, the second
2795     *        is {@code 2}, and so on; must be {@code 1} or larger
2796     *        and equal to or less than the number of columns in this rowset
2797     * @param x the new column value
2798     * @throws SQLException if (1) the given column index is out of bounds,
2799     *            (2) the cursor is not on one of this rowset's rows or its
2800     *            insert row, or (3) this rowset is
2801     *            {@code ResultSet.CONCUR_READ_ONLY}
2802     */
2803    public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
2804        throw new UnsupportedOperationException();
2805    }
2806
2807    /**
2808     * Sets the designated column in either the current row or the insert
2809     * row of this {@code CachedRowSetImpl} object with the given
2810     * {@code String} object.
2811     * <P>
2812     * This method updates a column value in either the current row or
2813     * the insert row of this rowset, but it does not update the
2814     * database.  If the cursor is on a row in the rowset, the
2815     * method {@link #updateRow} must be called to mark the row as updated.
2816     * If the cursor is on the insert row, the method {@link #insertRow}
2817     * must be called to insert the new row into this rowset and mark it
2818     * as inserted. Both of these methods must be called before the
2819     * cursor moves to another row.
2820     * <P>
2821     * The method {@code acceptChanges} must be called if the
2822     * updated values are to be written back to the underlying database.
2823     *
2824     * @param columnIndex the first column is {@code 1}, the second
2825     *        is {@code 2}, and so on; must be {@code 1} or larger
2826     *        and equal to or less than the number of columns in this rowset
2827     * @param x the new column value
2828     * @throws SQLException if (1) the given column index is out of bounds,
2829     *            (2) the cursor is not on one of this rowset's rows or its
2830     *            insert row, or (3) this rowset is
2831     *            {@code ResultSet.CONCUR_READ_ONLY}
2832     */
2833    public void updateString(int columnIndex, String x) throws SQLException {
2834        throw new UnsupportedOperationException();
2835    }
2836
2837    /**
2838     * Sets the designated column in either the current row or the insert
2839     * row of this {@code CachedRowSetImpl} object with the given
2840     * {@code byte} array.
2841     *
2842     * This method updates a column value in either the current row or
2843     * the insert row of this rowset, but it does not update the
2844     * database.  If the cursor is on a row in the rowset, the
2845     * method {@link #updateRow} must be called to update the database.
2846     * If the cursor is on the insert row, the method {@link #insertRow}
2847     * must be called, which will insert the new row into both this rowset
2848     * and the database. Both of these methods must be called before the
2849     * cursor moves to another row.
2850     *
2851     * @param columnIndex the first column is {@code 1}, the second
2852     *        is {@code 2}, and so on; must be {@code 1} or larger
2853     *        and equal to or less than the number of columns in this rowset
2854     * @param x the new column value
2855     * @throws SQLException if (1) the given column index is out of bounds,
2856     *            (2) the cursor is not on one of this rowset's rows or its
2857     *            insert row, or (3) this rowset is
2858     *            {@code ResultSet.CONCUR_READ_ONLY}
2859     */
2860    public void updateBytes(int columnIndex, byte x[]) throws SQLException {
2861        throw new UnsupportedOperationException();
2862    }
2863
2864    /**
2865     * Sets the designated column in either the current row or the insert
2866     * row of this {@code CachedRowSetImpl} object with the given
2867     * {@code Date} object.
2868     *
2869     * This method updates a column value in either the current row or
2870     * the insert row of this rowset, but it does not update the
2871     * database.  If the cursor is on a row in the rowset, the
2872     * method {@link #updateRow} must be called to update the database.
2873     * If the cursor is on the insert row, the method {@link #insertRow}
2874     * must be called, which will insert the new row into both this rowset
2875     * and the database. Both of these methods must be called before the
2876     * cursor moves to another row.
2877     *
2878     * @param columnIndex the first column is {@code 1}, the second
2879     *        is {@code 2}, and so on; must be {@code 1} or larger
2880     *        and equal to or less than the number of columns in this rowset
2881     * @param x the new column value
2882     * @throws SQLException if (1) the given column index is out of bounds,
2883     *            (2) the cursor is not on one of this rowset's rows or its
2884     *            insert row, (3) the type of the designated column is not
2885     *            an SQL {@code DATE} or {@code TIMESTAMP}, or
2886     *            (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
2887     */
2888    public void updateDate(int columnIndex, java.sql.Date x) throws SQLException {
2889        throw new UnsupportedOperationException();
2890    }
2891
2892    /**
2893     * Sets the designated column in either the current row or the insert
2894     * row of this {@code CachedRowSetImpl} object with the given
2895     * {@code Time} object.
2896     *
2897     * This method updates a column value in either the current row or
2898     * the insert row of this rowset, but it does not update the
2899     * database.  If the cursor is on a row in the rowset, the
2900     * method {@link #updateRow} must be called to update the database.
2901     * If the cursor is on the insert row, the method {@link #insertRow}
2902     * must be called, which will insert the new row into both this rowset
2903     * and the database. Both of these methods must be called before the
2904     * cursor moves to another row.
2905     *
2906     * @param columnIndex the first column is {@code 1}, the second
2907     *        is {@code 2}, and so on; must be {@code 1} or larger
2908     *        and equal to or less than the number of columns in this rowset
2909     * @param x the new column value
2910     * @throws SQLException if (1) the given column index is out of bounds,
2911     *            (2) the cursor is not on one of this rowset's rows or its
2912     *            insert row, (3) the type of the designated column is not
2913     *            an SQL {@code TIME} or {@code TIMESTAMP}, or
2914     *            (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
2915     */
2916    public void updateTime(int columnIndex, java.sql.Time x) throws SQLException {
2917       throw new UnsupportedOperationException();
2918    }
2919
2920    /**
2921     * Sets the designated column in either the current row or the insert
2922     * row of this {@code CachedRowSetImpl} object with the given
2923     * {@code Timestamp} object.
2924     *
2925     * This method updates a column value in either the current row or
2926     * the insert row of this rowset, but it does not update the
2927     * database.  If the cursor is on a row in the rowset, the
2928     * method {@link #updateRow} must be called to update the database.
2929     * If the cursor is on the insert row, the method {@link #insertRow}
2930     * must be called, which will insert the new row into both this rowset
2931     * and the database. Both of these methods must be called before the
2932     * cursor moves to another row.
2933     *
2934     * @param columnIndex the first column is {@code 1}, the second
2935     *        is {@code 2}, and so on; must be {@code 1} or larger
2936     *        and equal to or less than the number of columns in this rowset
2937     * @param x the new column value
2938     * @throws SQLException if (1) the given column index is out of bounds,
2939     *            (2) the cursor is not on one of this rowset's rows or its
2940     *            insert row, (3) the type of the designated column is not
2941     *            an SQL {@code DATE}, {@code TIME}, or
2942     *            {@code TIMESTAMP}, or (4) this rowset is
2943     *            {@code ResultSet.CONCUR_READ_ONLY}
2944     */
2945    public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException {
2946        throw new UnsupportedOperationException();
2947    }
2948
2949    /**
2950     * Sets the designated column in either the current row or the insert
2951     * row of this {@code CachedRowSetImpl} object with the given
2952     * ASCII stream value.
2953     * <P>
2954     * This method updates a column value in either the current row or
2955     * the insert row of this rowset, but it does not update the
2956     * database.  If the cursor is on a row in the rowset, the
2957     * method {@link #updateRow} must be called to update the database.
2958     * If the cursor is on the insert row, the method {@link #insertRow}
2959     * must be called, which will insert the new row into both this rowset
2960     * and the database. Both of these methods must be called before the
2961     * cursor moves to another row.
2962     *
2963     * @param columnIndex the first column is {@code 1}, the second
2964     *        is {@code 2}, and so on; must be {@code 1} or larger
2965     *        and equal to or less than the number of columns in this rowset
2966     * @param x the new column value
2967     * @param length the number of one-byte ASCII characters in the stream
2968     * @throws SQLException if this method is invoked
2969     */
2970    public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException {
2971        throw new UnsupportedOperationException();
2972    }
2973
2974    /**
2975     * Sets the designated column in either the current row or the insert
2976     * row of this {@code CachedRowSetImpl} object with the given
2977     * {@code java.io.InputStream} object.
2978     * <P>
2979     * This method updates a column value in either the current row or
2980     * the insert row of this rowset, but it does not update the
2981     * database.  If the cursor is on a row in the rowset, the
2982     * method {@link #updateRow} must be called to update the database.
2983     * If the cursor is on the insert row, the method {@link #insertRow}
2984     * must be called, which will insert the new row into both this rowset
2985     * and the database. Both of these methods must be called before the
2986     * cursor moves to another row.
2987     *
2988     * @param columnIndex the first column is {@code 1}, the second
2989     *        is {@code 2}, and so on; must be {@code 1} or larger
2990     *        and equal to or less than the number of columns in this rowset
2991     * @param x the new column value; must be a {@code java.io.InputStream}
2992     *          containing {@code BINARY}, {@code VARBINARY}, or
2993     *          {@code LONGVARBINARY} data
2994     * @param length the length of the stream in bytes
2995     * @throws SQLException if (1) the given column index is out of bounds,
2996     *            (2) the cursor is not on one of this rowset's rows or its
2997     *            insert row, (3) the data in the stream is not binary, or
2998     *            (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
2999     */
3000    public void updateBinaryStream(int columnIndex, java.io.InputStream x,int length) throws SQLException {
3001        throw new UnsupportedOperationException();
3002    }
3003
3004    /**
3005     * Sets the designated column in either the current row or the insert
3006     * row of this {@code CachedRowSetImpl} object with the given
3007     * {@code java.io.Reader} object.
3008     * <P>
3009     * This method updates a column value in either the current row or
3010     * the insert row of this rowset, but it does not update the
3011     * database.  If the cursor is on a row in the rowset, the
3012     * method {@link #updateRow} must be called to update the database.
3013     * If the cursor is on the insert row, the method {@link #insertRow}
3014     * must be called, which will insert the new row into both this rowset
3015     * and the database. Both of these methods must be called before the
3016     * cursor moves to another row.
3017     *
3018     * @param columnIndex the first column is {@code 1}, the second
3019     *        is {@code 2}, and so on; must be {@code 1} or larger
3020     *        and equal to or less than the number of columns in this rowset
3021     * @param x the new column value; must be a {@code java.io.Reader}
3022     *          containing {@code BINARY}, {@code VARBINARY},
3023     *          {@code LONGVARBINARY}, {@code CHAR}, {@code VARCHAR},
3024     *          or {@code LONGVARCHAR} data
3025     * @param length the length of the stream in characters
3026     * @throws SQLException if (1) the given column index is out of bounds,
3027     *            (2) the cursor is not on one of this rowset's rows or its
3028     *            insert row, (3) the data in the stream is not a binary or
3029     *            character type, or (4) this rowset is
3030     *            {@code ResultSet.CONCUR_READ_ONLY}
3031     */
3032    public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException {
3033        throw new UnsupportedOperationException();
3034    }
3035
3036    /**
3037     * Sets the designated column in either the current row or the insert
3038     * row of this {@code CachedRowSetImpl} object with the given
3039     * {@code Object} value.  The {@code scale} parameter indicates
3040     * the number of digits to the right of the decimal point and is ignored
3041     * if the new column value is not a type that will be mapped to an SQL
3042     * {@code DECIMAL} or {@code NUMERIC} value.
3043     * <P>
3044     * This method updates a column value in either the current row or
3045     * the insert row of this rowset, but it does not update the
3046     * database.  If the cursor is on a row in the rowset, the
3047     * method {@link #updateRow} must be called to update the database.
3048     * If the cursor is on the insert row, the method {@link #insertRow}
3049     * must be called, which will insert the new row into both this rowset
3050     * and the database. Both of these methods must be called before the
3051     * cursor moves to another row.
3052     *
3053     * @param columnIndex the first column is {@code 1}, the second
3054     *        is {@code 2}, and so on; must be {@code 1} or larger
3055     *        and equal to or less than the number of columns in this rowset
3056     * @param x the new column value
3057     * @param scale the number of digits to the right of the decimal point (for
3058     *              {@code DECIMAL} and {@code NUMERIC} types only)
3059     * @throws SQLException if (1) the given column index is out of bounds,
3060     *            (2) the cursor is not on one of this rowset's rows or its
3061     *            insert row, or (3) this rowset is
3062     *            {@code ResultSet.CONCUR_READ_ONLY}
3063     */
3064    public void updateObject(int columnIndex, Object x, int scale) throws SQLException {
3065       throw new UnsupportedOperationException();
3066    }
3067
3068    /**
3069     * Sets the designated column in either the current row or the insert
3070     * row of this {@code CachedRowSetImpl} object with the given
3071     * {@code Object} value.
3072     * <P>
3073     * This method updates a column value in either the current row or
3074     * the insert row of this rowset, but it does not update the
3075     * database.  If the cursor is on a row in the rowset, the
3076     * method {@link #updateRow} must be called to update the database.
3077     * If the cursor is on the insert row, the method {@link #insertRow}
3078     * must be called, which will insert the new row into both this rowset
3079     * and the database. Both of these methods must be called before the
3080     * cursor moves to another row.
3081     *
3082     * @param columnIndex the first column is {@code 1}, the second
3083     *        is {@code 2}, and so on; must be {@code 1} or larger
3084     *        and equal to or less than the number of columns in this rowset
3085     * @param x the new column value
3086     * @throws SQLException if (1) the given column index is out of bounds,
3087     *            (2) the cursor is not on one of this rowset's rows or its
3088     *            insert row, or (3) this rowset is
3089     *            {@code ResultSet.CONCUR_READ_ONLY}
3090     */
3091    public void updateObject(int columnIndex, Object x) throws SQLException {
3092        throw new UnsupportedOperationException();
3093    }
3094
3095
3096    /**
3097     * Sets the designated nullable column in the current row or the
3098     * insert row of this {@code CachedRowSetImpl} object with
3099     * {@code null} value.
3100     * <P>
3101     * This method updates a column value in the current row or the insert
3102     * row of this rowset, but it does not update the database.
3103     * If the cursor is on a row in the rowset, the
3104     * method {@link #updateRow} must be called to update the database.
3105     * If the cursor is on the insert row, the method {@link #insertRow}
3106     * must be called, which will insert the new row into both this rowset
3107     * and the database.
3108     *
3109     * @param columnName a {@code String} object that must match the
3110     *        SQL name of a column in this rowset, ignoring case
3111     * @throws SQLException if (1) the given column name does not match the
3112     *            name of a column in this rowset, (2) the cursor is not on
3113     *            one of this rowset's rows or its insert row, or (3) this
3114     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3115     */
3116    public void updateNull(String columnName) throws SQLException {
3117        throw new UnsupportedOperationException();
3118    }
3119
3120    /**
3121     * Sets the designated column in either the current row or the insert
3122     * row of this {@code CachedRowSetImpl} object with the given
3123     * {@code boolean} value.
3124     * <P>
3125     * This method updates a column value in the current row or the insert
3126     * row of this rowset, but it does not update the database.
3127     * If the cursor is on a row in the rowset, the
3128     * method {@link #updateRow} must be called to update the database.
3129     * If the cursor is on the insert row, the method {@link #insertRow}
3130     * must be called, which will insert the new row into both this rowset
3131     * and the database. Both of these methods must be called before the
3132     * cursor moves to another row.
3133     *
3134     * @param columnName a {@code String} object that must match the
3135     *        SQL name of a column in this rowset, ignoring case
3136     * @param x the new column value
3137     * @throws SQLException if (1) the given column name does not match the
3138     *            name of a column in this rowset, (2) the cursor is not on
3139     *            one of this rowset's rows or its insert row, or (3) this
3140     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3141     */
3142    public void updateBoolean(String columnName, boolean x) throws SQLException {
3143       throw new UnsupportedOperationException();
3144    }
3145
3146    /**
3147     * Sets the designated column in either the current row or the insert
3148     * row of this {@code CachedRowSetImpl} object with the given
3149     * {@code byte} value.
3150     * <P>
3151     * This method updates a column value in the current row or the insert
3152     * row of this rowset, but it does not update the database.
3153     * If the cursor is on a row in the rowset, the
3154     * method {@link #updateRow} must be called to update the database.
3155     * If the cursor is on the insert row, the method {@link #insertRow}
3156     * must be called, which will insert the new row into both this rowset
3157     * and the database. Both of these methods must be called before the
3158     * cursor moves to another row.
3159     *
3160     * @param columnName a {@code String} object that must match the
3161     *        SQL name of a column in this rowset, ignoring case
3162     * @param x the new column value
3163     * @throws SQLException if (1) the given column name does not match the
3164     *            name of a column in this rowset, (2) the cursor is not on
3165     *            one of this rowset's rows or its insert row, or (3) this
3166     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3167     */
3168    public void updateByte(String columnName, byte x) throws SQLException {
3169        throw new UnsupportedOperationException();
3170    }
3171
3172    /**
3173     * Sets the designated column in either the current row or the insert
3174     * row of this {@code CachedRowSetImpl} object with the given
3175     * {@code short} value.
3176     * <P>
3177     * This method updates a column value in the current row or the insert
3178     * row of this rowset, but it does not update the database.
3179     * If the cursor is on a row in the rowset, the
3180     * method {@link #updateRow} must be called to update the database.
3181     * If the cursor is on the insert row, the method {@link #insertRow}
3182     * must be called, which will insert the new row into both this rowset
3183     * and the database. Both of these methods must be called before the
3184     * cursor moves to another row.
3185     *
3186     * @param columnName a {@code String} object that must match the
3187     *        SQL name of a column in this rowset, ignoring case
3188     * @param x the new column value
3189     * @throws SQLException if (1) the given column name does not match the
3190     *            name of a column in this rowset, (2) the cursor is not on
3191     *            one of this rowset's rows or its insert row, or (3) this
3192     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3193     */
3194    public void updateShort(String columnName, short x) throws SQLException {
3195        throw new UnsupportedOperationException();
3196    }
3197
3198    /**
3199     * Sets the designated column in either the current row or the insert
3200     * row of this {@code CachedRowSetImpl} object with the given
3201     * {@code int} value.
3202     * <P>
3203     * This method updates a column value in the current row or the insert
3204     * row of this rowset, but it does not update the database.
3205     * If the cursor is on a row in the rowset, the
3206     * method {@link #updateRow} must be called to update the database.
3207     * If the cursor is on the insert row, the method {@link #insertRow}
3208     * must be called, which will insert the new row into both this rowset
3209     * and the database. Both of these methods must be called before the
3210     * cursor moves to another row.
3211     *
3212     * @param columnName a {@code String} object that must match the
3213     *        SQL name of a column in this rowset, ignoring case
3214     * @param x the new column value
3215     * @throws SQLException if (1) the given column name does not match the
3216     *            name of a column in this rowset, (2) the cursor is not on
3217     *            one of this rowset's rows or its insert row, or (3) this
3218     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3219     */
3220    public void updateInt(String columnName, int x) throws SQLException {
3221        throw new UnsupportedOperationException();
3222    }
3223
3224    /**
3225     * Sets the designated column in either the current row or the insert
3226     * row of this {@code CachedRowSetImpl} object with the given
3227     * {@code long} value.
3228     * <P>
3229     * This method updates a column value in the current row or the insert
3230     * row of this rowset, but it does not update the database.
3231     * If the cursor is on a row in the rowset, the
3232     * method {@link #updateRow} must be called to update the database.
3233     * If the cursor is on the insert row, the method {@link #insertRow}
3234     * must be called, which will insert the new row into both this rowset
3235     * and the database. Both of these methods must be called before the
3236     * cursor moves to another row.
3237     *
3238     * @param columnName a {@code String} object that must match the
3239     *        SQL name of a column in this rowset, ignoring case
3240     * @param x the new column value
3241     * @throws SQLException if (1) the given column name does not match the
3242     *            name of a column in this rowset, (2) the cursor is not on
3243     *            one of this rowset's rows or its insert row, or (3) this
3244     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3245     */
3246    public void updateLong(String columnName, long x) throws SQLException {
3247        throw new UnsupportedOperationException();
3248    }
3249
3250    /**
3251     * Sets the designated column in either the current row or the insert
3252     * row of this {@code CachedRowSetImpl} object with the given
3253     * {@code float} value.
3254     * <P>
3255     * This method updates a column value in the current row or the insert
3256     * row of this rowset, but it does not update the database.
3257     * If the cursor is on a row in the rowset, the
3258     * method {@link #updateRow} must be called to update the database.
3259     * If the cursor is on the insert row, the method {@link #insertRow}
3260     * must be called, which will insert the new row into both this rowset
3261     * and the database. Both of these methods must be called before the
3262     * cursor moves to another row.
3263     *
3264     * @param columnName a {@code String} object that must match the
3265     *        SQL name of a column in this rowset, ignoring case
3266     * @param x the new column value
3267     * @throws SQLException if (1) the given column name does not match the
3268     *            name of a column in this rowset, (2) the cursor is not on
3269     *            one of this rowset's rows or its insert row, or (3) this
3270     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3271     */
3272    public void updateFloat(String columnName, float x) throws SQLException {
3273        throw new UnsupportedOperationException();
3274    }
3275
3276    /**
3277     * Sets the designated column in either the current row or the insert
3278     * row of this {@code CachedRowSetImpl} object with the given
3279     * {@code double} value.
3280     *
3281     * This method updates a column value in either the current row or
3282     * the insert row of this rowset, but it does not update the
3283     * database.  If the cursor is on a row in the rowset, the
3284     * method {@link #updateRow} must be called to update the database.
3285     * If the cursor is on the insert row, the method {@link #insertRow}
3286     * must be called, which will insert the new row into both this rowset
3287     * and the database. Both of these methods must be called before the
3288     * cursor moves to another row.
3289     *
3290     * @param columnName a {@code String} object that must match the
3291     *        SQL name of a column in this rowset, ignoring case
3292     * @param x the new column value
3293     * @throws SQLException if (1) the given column name does not match the
3294     *            name of a column in this rowset, (2) the cursor is not on
3295     *            one of this rowset's rows or its insert row, or (3) this
3296     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3297     */
3298    public void updateDouble(String columnName, double x) throws SQLException {
3299        throw new UnsupportedOperationException();
3300    }
3301
3302    /**
3303     * Sets the designated column in either the current row or the insert
3304     * row of this {@code CachedRowSetImpl} object with the given
3305     * {@code java.math.BigDecimal} object.
3306     * <P>
3307     * This method updates a column value in the current row or the insert
3308     * row of this rowset, but it does not update the database.
3309     * If the cursor is on a row in the rowset, the
3310     * method {@link #updateRow} must be called to update the database.
3311     * If the cursor is on the insert row, the method {@link #insertRow}
3312     * must be called, which will insert the new row into both this rowset
3313     * and the database. Both of these methods must be called before the
3314     * cursor moves to another row.
3315     *
3316     * @param columnName a {@code String} object that must match the
3317     *        SQL name of a column in this rowset, ignoring case
3318     * @param x the new column value
3319     * @throws SQLException if (1) the given column name does not match the
3320     *            name of a column in this rowset, (2) the cursor is not on
3321     *            one of this rowset's rows or its insert row, or (3) this
3322     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3323     */
3324    public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException {
3325        throw new UnsupportedOperationException();
3326    }
3327
3328    /**
3329     * Sets the designated column in either the current row or the insert
3330     * row of this {@code CachedRowSetImpl} object with the given
3331     * {@code String} object.
3332     *
3333     * This method updates a column value in either the current row or
3334     * the insert row of this rowset, but it does not update the
3335     * database.  If the cursor is on a row in the rowset, the
3336     * method {@link #updateRow} must be called to update the database.
3337     * If the cursor is on the insert row, the method {@link #insertRow}
3338     * must be called, which will insert the new row into both this rowset
3339     * and the database. Both of these methods must be called before the
3340     * cursor moves to another row.
3341     *
3342     * @param columnName a {@code String} object that must match the
3343     *        SQL name of a column in this rowset, ignoring case
3344     * @param x the new column value
3345     * @throws SQLException if (1) the given column name does not match the
3346     *            name of a column in this rowset, (2) the cursor is not on
3347     *            one of this rowset's rows or its insert row, or (3) this
3348     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3349     */
3350    public void updateString(String columnName, String x) throws SQLException {
3351        throw new UnsupportedOperationException();
3352    }
3353
3354    /**
3355     * Sets the designated column in either the current row or the insert
3356     * row of this {@code CachedRowSetImpl} object with the given
3357     * {@code byte} array.
3358     *
3359     * This method updates a column value in either the current row or
3360     * the insert row of this rowset, but it does not update the
3361     * database.  If the cursor is on a row in the rowset, the
3362     * method {@link #updateRow} must be called to update the database.
3363     * If the cursor is on the insert row, the method {@link #insertRow}
3364     * must be called, which will insert the new row into both this rowset
3365     * and the database. Both of these methods must be called before the
3366     * cursor moves to another row.
3367     *
3368     * @param columnName a {@code String} object that must match the
3369     *        SQL name of a column in this rowset, ignoring case
3370     * @param x the new column value
3371     * @throws SQLException if (1) the given column name does not match the
3372     *            name of a column in this rowset, (2) the cursor is not on
3373     *            one of this rowset's rows or its insert row, or (3) this
3374     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3375     */
3376    public void updateBytes(String columnName, byte x[]) throws SQLException {
3377        throw new UnsupportedOperationException();
3378    }
3379
3380    /**
3381     * Sets the designated column in either the current row or the insert
3382     * row of this {@code CachedRowSetImpl} object with the given
3383     * {@code Date} object.
3384     *
3385     * This method updates a column value in either the current row or
3386     * the insert row of this rowset, but it does not update the
3387     * database.  If the cursor is on a row in the rowset, the
3388     * method {@link #updateRow} must be called to update the database.
3389     * If the cursor is on the insert row, the method {@link #insertRow}
3390     * must be called, which will insert the new row into both this rowset
3391     * and the database. Both of these methods must be called before the
3392     * cursor moves to another row.
3393     *
3394     * @param columnName a {@code String} object that must match the
3395     *        SQL name of a column in this rowset, ignoring case
3396     * @param x the new column value
3397     * @throws SQLException if (1) the given column name does not match the
3398     *            name of a column in this rowset, (2) the cursor is not on
3399     *            one of this rowset's rows or its insert row, (3) the type
3400     *            of the designated column is not an SQL {@code DATE} or
3401     *            {@code TIMESTAMP}, or (4) this rowset is
3402     *            {@code ResultSet.CONCUR_READ_ONLY}
3403     */
3404    public void updateDate(String columnName, java.sql.Date x) throws SQLException {
3405        throw new UnsupportedOperationException();
3406    }
3407
3408    /**
3409     * Sets the designated column in either the current row or the insert
3410     * row of this {@code CachedRowSetImpl} object with the given
3411     * {@code Time} object.
3412     *
3413     * This method updates a column value in either the current row or
3414     * the insert row of this rowset, but it does not update the
3415     * database.  If the cursor is on a row in the rowset, the
3416     * method {@link #updateRow} must be called to update the database.
3417     * If the cursor is on the insert row, the method {@link #insertRow}
3418     * must be called, which will insert the new row into both this rowset
3419     * and the database. Both of these methods must be called before the
3420     * cursor moves to another row.
3421     *
3422     * @param columnName a {@code String} object that must match the
3423     *        SQL name of a column in this rowset, ignoring case
3424     * @param x the new column value
3425     * @throws SQLException if (1) the given column name does not match the
3426     *            name of a column in this rowset, (2) the cursor is not on
3427     *            one of this rowset's rows or its insert row, (3) the type
3428     *            of the designated column is not an SQL {@code TIME} or
3429     *            {@code TIMESTAMP}, or (4) this rowset is
3430     *            {@code ResultSet.CONCUR_READ_ONLY}
3431     */
3432    public void updateTime(String columnName, java.sql.Time x) throws SQLException {
3433        throw new UnsupportedOperationException();
3434    }
3435
3436    /**
3437     * Sets the designated column in either the current row or the insert
3438     * row of this {@code CachedRowSetImpl} object with the given
3439     * {@code Timestamp} object.
3440     *
3441     * This method updates a column value in either the current row or
3442     * the insert row of this rowset, but it does not update the
3443     * database.  If the cursor is on a row in the rowset, the
3444     * method {@link #updateRow} must be called to update the database.
3445     * If the cursor is on the insert row, the method {@link #insertRow}
3446     * must be called, which will insert the new row into both this rowset
3447     * and the database. Both of these methods must be called before the
3448     * cursor moves to another row.
3449     *
3450     * @param columnName a {@code String} object that must match the
3451     *        SQL name of a column in this rowset, ignoring case
3452     * @param x the new column value
3453     * @throws SQLException if the given column index is out of bounds or
3454     *            the cursor is not on one of this rowset's rows or its
3455     *            insert row
3456     * @throws SQLException if (1) the given column name does not match the
3457     *            name of a column in this rowset, (2) the cursor is not on
3458     *            one of this rowset's rows or its insert row, (3) the type
3459     *            of the designated column is not an SQL {@code DATE},
3460     *            {@code TIME}, or {@code TIMESTAMP}, or (4) this
3461     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3462     */
3463    public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException {
3464        throw new UnsupportedOperationException();
3465    }
3466
3467    /**
3468     * Sets the designated column in either the current row or the insert
3469     * row of this {@code CachedRowSetImpl} object with the given
3470     * ASCII stream value.
3471     * <P>
3472     * This method updates a column value in either the current row or
3473     * the insert row of this rowset, but it does not update the
3474     * database.  If the cursor is on a row in the rowset, the
3475     * method {@link #updateRow} must be called to update the database.
3476     * If the cursor is on the insert row, the method {@link #insertRow}
3477     * must be called, which will insert the new row into both this rowset
3478     * and the database. Both of these methods must be called before the
3479     * cursor moves to another row.
3480     *
3481     * @param columnName a {@code String} object that must match the
3482     *        SQL name of a column in this rowset, ignoring case
3483     * @param x the new column value
3484     * @param length the number of one-byte ASCII characters in the stream
3485     */
3486    public void updateAsciiStream(String columnName,
3487    java.io.InputStream x,
3488    int length) throws SQLException {
3489       throw new UnsupportedOperationException();
3490    }
3491
3492    /**
3493     * Sets the designated column in either the current row or the insert
3494     * row of this {@code CachedRowSetImpl} object with the given
3495     * {@code java.io.InputStream} object.
3496     * <P>
3497     * This method updates a column value in either the current row or
3498     * the insert row of this rowset, but it does not update the
3499     * database.  If the cursor is on a row in the rowset, the
3500     * method {@link #updateRow} must be called to update the database.
3501     * If the cursor is on the insert row, the method {@link #insertRow}
3502     * must be called, which will insert the new row into both this rowset
3503     * and the database. Both of these methods must be called before the
3504     * cursor moves to another row.
3505     *
3506     * @param columnName a {@code String} object that must match the
3507     *        SQL name of a column in this rowset, ignoring case
3508     * @param x the new column value; must be a {@code java.io.InputStream}
3509     *          containing {@code BINARY}, {@code VARBINARY}, or
3510     *          {@code LONGVARBINARY} data
3511     * @param length the length of the stream in bytes
3512     * @throws SQLException if (1) the given column name does not match the
3513     *            name of a column in this rowset, (2) the cursor is not on
3514     *            one of this rowset's rows or its insert row, (3) the data
3515     *            in the stream is not binary, or (4) this rowset is
3516     *            {@code ResultSet.CONCUR_READ_ONLY}
3517     */
3518    public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException {
3519        throw new UnsupportedOperationException();
3520    }
3521
3522    /**
3523     * Sets the designated column in either the current row or the insert
3524     * row of this {@code CachedRowSetImpl} object with the given
3525     * {@code java.io.Reader} object.
3526     * <P>
3527     * This method updates a column value in either the current row or
3528     * the insert row of this rowset, but it does not update the
3529     * database.  If the cursor is on a row in the rowset, the
3530     * method {@link #updateRow} must be called to update the database.
3531     * If the cursor is on the insert row, the method {@link #insertRow}
3532     * must be called, which will insert the new row into both this rowset
3533     * and the database. Both of these methods must be called before the
3534     * cursor moves to another row.
3535     *
3536     * @param columnName a {@code String} object that must match the
3537     *        SQL name of a column in this rowset, ignoring case
3538     * @param reader the new column value; must be a
3539     * {@code java.io.Reader} containing {@code BINARY},
3540     * {@code VARBINARY}, {@code LONGVARBINARY}, {@code CHAR},
3541     * {@code VARCHAR}, or {@code LONGVARCHAR} data
3542     * @param length the length of the stream in characters
3543     * @throws SQLException if (1) the given column name does not match the
3544     *            name of a column in this rowset, (2) the cursor is not on
3545     *            one of this rowset's rows or its insert row, (3) the data
3546     *            in the stream is not a binary or character type, or (4) this
3547     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3548     */
3549    public void updateCharacterStream(String columnName,
3550    java.io.Reader reader,
3551    int length) throws SQLException {
3552        throw new UnsupportedOperationException();
3553    }
3554
3555    /**
3556     * Sets the designated column in either the current row or the insert
3557     * row of this {@code CachedRowSetImpl} object with the given
3558     * {@code Object} value.  The {@code scale} parameter
3559     * indicates the number of digits to the right of the decimal point
3560     * and is ignored if the new column value is not a type that will be
3561     *  mapped to an SQL {@code DECIMAL} or {@code NUMERIC} value.
3562     * <P>
3563     * This method updates a column value in either the current row or
3564     * the insert row of this rowset, but it does not update the
3565     * database.  If the cursor is on a row in the rowset, the
3566     * method {@link #updateRow} must be called to update the database.
3567     * If the cursor is on the insert row, the method {@link #insertRow}
3568     * must be called, which will insert the new row into both this rowset
3569     * and the database. Both of these methods must be called before the
3570     * cursor moves to another row.
3571     *
3572     * @param columnName a {@code String} object that must match the
3573     *        SQL name of a column in this rowset, ignoring case
3574     * @param x the new column value
3575     * @param scale the number of digits to the right of the decimal point (for
3576     *              {@code DECIMAL} and {@code NUMERIC} types only)
3577     * @throws SQLException if (1) the given column name does not match the
3578     *            name of a column in this rowset, (2) the cursor is not on
3579     *            one of this rowset's rows or its insert row, or (3) this
3580     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3581     */
3582    public void updateObject(String columnName, Object x, int scale) throws SQLException {
3583        throw new UnsupportedOperationException();
3584    }
3585
3586    /**
3587     * Sets the designated column in either the current row or the insert
3588     * row of this {@code CachedRowSetImpl} object with the given
3589     * {@code Object} value.
3590     * <P>
3591     * This method updates a column value in either the current row or
3592     * the insert row of this rowset, but it does not update the
3593     * database.  If the cursor is on a row in the rowset, the
3594     * method {@link #updateRow} must be called to update the database.
3595     * If the cursor is on the insert row, the method {@link #insertRow}
3596     * must be called, which will insert the new row into both this rowset
3597     * and the database. Both of these methods must be called before the
3598     * cursor moves to another row.
3599     *
3600     * @param columnName a {@code String} object that must match the
3601     *        SQL name of a column in this rowset, ignoring case
3602     * @param x the new column value
3603     * @throws SQLException if (1) the given column name does not match the
3604     *            name of a column in this rowset, (2) the cursor is not on
3605     *            one of this rowset's rows or its insert row, or (3) this
3606     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3607     */
3608    public void updateObject(String columnName, Object x) throws SQLException {
3609        throw new UnsupportedOperationException();
3610    }
3611
3612    /**
3613     * Inserts the contents of this {@code CachedRowSetImpl} object's insert
3614     * row into this rowset immediately following the current row.
3615     * If the current row is the
3616     * position after the last row or before the first row, the new row will
3617     * be inserted at the end of the rowset.  This method also notifies
3618     * listeners registered with this rowset that the row has changed.
3619     * <P>
3620     * The cursor must be on the insert row when this method is called.
3621     *
3622     * @throws SQLException if (1) the cursor is not on the insert row,
3623     *            (2) one or more of the non-nullable columns in the insert
3624     *            row has not been given a value, or (3) this rowset is
3625     *            {@code ResultSet.CONCUR_READ_ONLY}
3626     */
3627    public void insertRow() throws SQLException {
3628        throw new UnsupportedOperationException();
3629    }
3630
3631    /**
3632     * Marks the current row of this {@code CachedRowSetImpl} object as
3633     * updated and notifies listeners registered with this rowset that the
3634     * row has changed.
3635     * <P>
3636     * This method  cannot be called when the cursor is on the insert row, and
3637     * it should be called before the cursor moves to another row.  If it is
3638     * called after the cursor moves to another row, this method has no effect,
3639     * and the updates made before the cursor moved will be lost.
3640     *
3641     * @throws SQLException if the cursor is on the insert row or this
3642     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
3643     */
3644    public void updateRow() throws SQLException {
3645        throw new UnsupportedOperationException();
3646    }
3647
3648    /**
3649     * Deletes the current row from this {@code CachedRowSetImpl} object and
3650     * notifies listeners registered with this rowset that a row has changed.
3651     * This method cannot be called when the cursor is on the insert row.
3652     * <P>
3653     * This method marks the current row as deleted, but it does not delete
3654     * the row from the underlying data source.  The method
3655     * {@code acceptChanges} must be called to delete the row in
3656     * the data source.
3657     *
3658     * @throws SQLException if (1) this method is called when the cursor
3659     *            is on the insert row, before the first row, or after the
3660     *            last row or (2) this rowset is
3661     *            {@code ResultSet.CONCUR_READ_ONLY}
3662     */
3663    public void deleteRow() throws SQLException {
3664        throw new UnsupportedOperationException();
3665    }
3666
3667    /**
3668     * Sets the current row with its original value and marks the row as
3669     * not updated, thus undoing any changes made to the row since the
3670     * last call to the methods {@code updateRow} or {@code deleteRow}.
3671     * This method should be called only when the cursor is on a row in
3672     * this rowset.
3673     *
3674     * @throws SQLException if the cursor is on the insert row, before the
3675     *            first row, or after the last row
3676     */
3677    public void refreshRow() throws SQLException {
3678        throw new UnsupportedOperationException();
3679    }
3680
3681    /**
3682     * Rolls back any updates made to the current row of this
3683     * {@code CachedRowSetImpl} object and notifies listeners that
3684     * a row has changed.  To have an effect, this method
3685     * must be called after an {@code updateXXX} method has been
3686     * called and before the method {@code updateRow} has been called.
3687     * If no updates have been made or the method {@code updateRow}
3688     * has already been called, this method has no effect.
3689     *
3690     * @throws SQLException if the cursor is on the insert row, before the
3691     *            first row, or after the last row
3692     */
3693    public void cancelRowUpdates() throws SQLException {
3694        throw new UnsupportedOperationException();
3695    }
3696
3697    /**
3698     * Moves the cursor for this {@code CachedRowSetImpl} object
3699     * to the insert row.  The current row in the rowset is remembered
3700     * while the cursor is on the insert row.
3701     * <P>
3702     * The insert row is a special row associated with an updatable
3703     * rowset.  It is essentially a buffer where a new row may
3704     * be constructed by calling the appropriate {@code updateXXX}
3705     * methods to assign a value to each column in the row.  A complete
3706     * row must be constructed; that is, every column that is not nullable
3707     * must be assigned a value.  In order for the new row to become part
3708     * of this rowset, the method {@code insertRow} must be called
3709     * before the cursor is moved back to the rowset.
3710     * <P>
3711     * Only certain methods may be invoked while the cursor is on the insert
3712     * row; many methods throw an exception if they are called while the
3713     * cursor is there.  In addition to the {@code updateXXX}
3714     * and {@code insertRow} methods, only the {@code getXXX} methods
3715     * may be called when the cursor is on the insert row.  A {@code getXXX}
3716     * method should be called on a column only after an {@code updateXXX}
3717     * method has been called on that column; otherwise, the value returned is
3718     * undetermined.
3719     *
3720     * @throws SQLException if this {@code CachedRowSetImpl} object is
3721     *            {@code ResultSet.CONCUR_READ_ONLY}
3722     */
3723    public void moveToInsertRow() throws SQLException {
3724        throw new UnsupportedOperationException();
3725    }
3726
3727    /**
3728     * Moves the cursor for this {@code CachedRowSetImpl} object to
3729     * the current row.  The current row is the row the cursor was on
3730     * when the method {@code moveToInsertRow} was called.
3731     * <P>
3732     * Calling this method has no effect unless it is called while the
3733     * cursor is on the insert row.
3734     *
3735     * @throws SQLException if an error occurs
3736     */
3737    public void moveToCurrentRow() throws SQLException {
3738        throw new UnsupportedOperationException();
3739    }
3740
3741    /**
3742     * Returns {@code null}.
3743     *
3744     * @return {@code null}
3745     * @throws SQLException if an error occurs
3746     */
3747    public Statement getStatement() throws SQLException {
3748        throw new UnsupportedOperationException();
3749    }
3750
3751    /**
3752     * Retrieves the value of the designated column in this
3753     * {@code CachedRowSetImpl} object as an {@code Object} in
3754     * the Java programming language, using the given
3755     * {@code java.util.Map} object to custom map the value if
3756     * appropriate.
3757     *
3758     * @param columnIndex the first column is {@code 1}, the second
3759     *        is {@code 2}, and so on; must be {@code 1} or larger
3760     *        and equal to or less than the number of columns in this rowset
3761     * @param map a {@code java.util.Map} object showing the mapping
3762     *            from SQL type names to classes in the Java programming
3763     *            language
3764     * @return an {@code Object} representing the SQL value
3765     * @throws SQLException if the given column index is out of bounds or
3766     *            the cursor is not on one of this rowset's rows or its
3767     *            insert row
3768     */
3769    public Object getObject(int columnIndex,
3770                            java.util.Map<String,Class<?>> map)
3771          throws SQLException
3772    {
3773       throw new UnsupportedOperationException();
3774    }
3775
3776    /**
3777     * Retrieves the value of the designated column in this
3778     * {@code CachedRowSetImpl} object as a {@code Ref} object
3779     * in the Java programming language.
3780     *
3781     * @param columnIndex the first column is {@code 1}, the second
3782     *        is {@code 2}, and so on; must be {@code 1} or larger
3783     *        and equal to or less than the number of columns in this rowset
3784     * @return a {@code Ref} object representing an SQL{@code  REF} value
3785     * @throws SQLException if (1) the given column index is out of bounds,
3786     *            (2) the cursor is not on one of this rowset's rows or its
3787     *            insert row, or (3) the designated column does not store an
3788     *            SQL {@code REF} value
3789     * @see #getRef(String)
3790     */
3791    public Ref getRef(int columnIndex) throws SQLException {
3792        throw new UnsupportedOperationException();
3793    }
3794
3795    /**
3796     * Retrieves the value of the designated column in this
3797     * {@code CachedRowSetImpl} object as a {@code Blob} object
3798     * in the Java programming language.
3799     *
3800     * @param columnIndex the first column is {@code 1}, the second
3801     *        is {@code 2}, and so on; must be {@code 1} or larger
3802     *        and equal to or less than the number of columns in this rowset
3803     * @return a {@code Blob} object representing an SQL {@code BLOB} value
3804     * @throws SQLException if (1) the given column index is out of bounds,
3805     *            (2) the cursor is not on one of this rowset's rows or its
3806     *            insert row, or (3) the designated column does not store an
3807     *            SQL {@code BLOB} value
3808     * @see #getBlob(String)
3809     */
3810    public Blob getBlob(int columnIndex) throws SQLException {
3811       throw new UnsupportedOperationException();
3812    }
3813
3814    /**
3815     * Retrieves the value of the designated column in this
3816     * {@code CachedRowSetImpl} object as a {@code Clob} object
3817     * in the Java programming language.
3818     *
3819     * @param columnIndex the first column is {@code 1}, the second
3820     *        is {@code 2}, and so on; must be {@code 1} or larger
3821     *        and equal to or less than the number of columns in this rowset
3822     * @return a {@code Clob} object representing an SQL {@code CLOB} value
3823     * @throws SQLException if (1) the given column index is out of bounds,
3824     *            (2) the cursor is not on one of this rowset's rows or its
3825     *            insert row, or (3) the designated column does not store an
3826     *            SQL {@code CLOB} value
3827     * @see #getClob(String)
3828     */
3829    public Clob getClob(int columnIndex) throws SQLException {
3830        throw new UnsupportedOperationException();
3831    }
3832
3833    /**
3834     * Retrieves the value of the designated column in this
3835     * {@code CachedRowSetImpl} object as an {@code Array} object
3836     * in the Java programming language.
3837     *
3838     * @param columnIndex the first column is {@code 1}, the second
3839     *        is {@code 2}, and so on; must be {@code 1} or larger
3840     *        and equal to or less than the number of columns in this rowset
3841     * @return an {@code Array} object representing an SQL
3842     *         {@code ARRAY} value
3843     * @throws SQLException if (1) the given column index is out of bounds,
3844     *            (2) the cursor is not on one of this rowset's rows or its
3845     *            insert row, or (3) the designated column does not store an
3846     *            SQL {@code ARRAY} value
3847     * @see #getArray(String)
3848     */
3849    public Array getArray(int columnIndex) throws SQLException {
3850        throw new UnsupportedOperationException();
3851    }
3852
3853    /**
3854     * Retrieves the value of the designated column in this
3855     * {@code CachedRowSetImpl} object as an {@code Object} in
3856     * the Java programming language, using the given
3857     * {@code java.util.Map} object to custom map the value if
3858     * appropriate.
3859     *
3860     * @param columnName a {@code String} object that must match the
3861     *        SQL name of a column in this rowset, ignoring case
3862     * @param map a {@code java.util.Map} object showing the mapping
3863     *        from SQL type names to classes in the Java programming
3864     *        language
3865     * @return an {@code Object} representing the SQL value
3866     * @throws SQLException if the given column name is not the name of
3867     *         a column in this rowset or the cursor is not on one of
3868     *         this rowset's rows or its insert row
3869     */
3870    public Object getObject(String columnName,
3871                            java.util.Map<String,Class<?>> map)
3872    throws SQLException {
3873        throw new UnsupportedOperationException();
3874    }
3875
3876    /**
3877     * Retrieves the value of the designated column in this
3878     * {@code CachedRowSetImpl} object as a {@code Ref} object
3879     * in the Java programming language.
3880     *
3881     * @param colName a {@code String} object that must match the
3882     *        SQL name of a column in this rowset, ignoring case
3883     * @return a {@code Ref} object representing an SQL{@code  REF} value
3884     * @throws SQLException  if (1) the given column name is not the name of
3885     *            a column in this rowset, (2) the cursor is not on one of
3886     *            this rowset's rows or its insert row, or (3) the column value
3887     *            is not an SQL {@code REF} value
3888     * @see #getRef(int)
3889     */
3890    public Ref getRef(String colName) throws SQLException {
3891        throw new UnsupportedOperationException();
3892    }
3893
3894    /**
3895     * Retrieves the value of the designated column in this
3896     * {@code CachedRowSetImpl} object as a {@code Blob} object
3897     * in the Java programming language.
3898     *
3899     * @param colName a {@code String} object that must match the
3900     *        SQL name of a column in this rowset, ignoring case
3901     * @return a {@code Blob} object representing an SQL {@code BLOB} value
3902     * @throws SQLException if (1) the given column name is not the name of
3903     *            a column in this rowset, (2) the cursor is not on one of
3904     *            this rowset's rows or its insert row, or (3) the designated
3905     *            column does not store an SQL {@code BLOB} value
3906     * @see #getBlob(int)
3907     */
3908    public Blob getBlob(String colName) throws SQLException {
3909       throw new UnsupportedOperationException();
3910    }
3911
3912    /**
3913     * Retrieves the value of the designated column in this
3914     * {@code CachedRowSetImpl} object as a {@code Clob} object
3915     * in the Java programming language.
3916     *
3917     * @param colName a {@code String} object that must match the
3918     *        SQL name of a column in this rowset, ignoring case
3919     * @return a {@code Clob} object representing an SQL
3920     *         {@code CLOB} value
3921     * @throws SQLException if (1) the given column name is not the name of
3922     *            a column in this rowset, (2) the cursor is not on one of
3923     *            this rowset's rows or its insert row, or (3) the designated
3924     *            column does not store an SQL {@code CLOB} value
3925     * @see #getClob(int)
3926     */
3927    public Clob getClob(String colName) throws SQLException {
3928        throw new UnsupportedOperationException();
3929    }
3930
3931    /**
3932     * Retrieves the value of the designated column in this
3933     * {@code CachedRowSetImpl} object as an {@code Array} object
3934     * in the Java programming langugage.
3935     *
3936     * @param colName a {@code String} object that must match the
3937     *        SQL name of a column in this rowset, ignoring case
3938     * @return an {@code Array} object representing an SQL
3939     *         {@code ARRAY} value
3940     * @throws SQLException if (1) the given column name is not the name of
3941     *            a column in this rowset, (2) the cursor is not on one of
3942     *            this rowset's rows or its insert row, or (3) the designated
3943     *            column does not store an SQL {@code ARRAY} value
3944     * @see #getArray(int)
3945     */
3946    public Array getArray(String colName) throws SQLException {
3947        throw new UnsupportedOperationException();
3948    }
3949
3950    /**
3951     * Retrieves the value of the designated column in the current row
3952     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Date}
3953     * object, using the given {@code Calendar} object to construct an
3954     * appropriate millisecond value for the date.
3955     *
3956     * @param columnIndex the first column is {@code 1}, the second
3957     *        is {@code 2}, and so on; must be {@code 1} or larger
3958     *        and equal to or less than the number of columns in the rowset
3959     * @param cal the {@code java.util.Calendar} object to use in
3960     *            constructing the date
3961     * @return the column value; if the value is SQL {@code NULL},
3962     *         the result is {@code null}
3963     * @throws SQLException if (1) the given column name is not the name of
3964     *            a column in this rowset, (2) the cursor is not on one of
3965     *            this rowset's rows or its insert row, or (3) the designated
3966     *            column does not store an SQL {@code DATE} or
3967     *            {@code TIMESTAMP} value
3968     */
3969    public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException {
3970        throw new UnsupportedOperationException();
3971    }
3972
3973    /**
3974     * Retrieves the value of the designated column in the current row
3975     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Date}
3976     * object, using the given {@code Calendar} object to construct an
3977     * appropriate millisecond value for the date.
3978     *
3979     * @param columnName a {@code String} object that must match the
3980     *        SQL name of a column in this rowset, ignoring case
3981     * @param cal the {@code java.util.Calendar} object to use in
3982     *            constructing the date
3983     * @return the column value; if the value is SQL {@code NULL},
3984     *         the result is {@code null}
3985     * @throws SQLException if (1) the given column name is not the name of
3986     *            a column in this rowset, (2) the cursor is not on one of
3987     *            this rowset's rows or its insert row, or (3) the designated
3988     *            column does not store an SQL {@code DATE} or
3989     *            {@code TIMESTAMP} value
3990     */
3991    public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException {
3992        throw new UnsupportedOperationException();
3993    }
3994
3995    /**
3996     * Retrieves the value of the designated column in the current row
3997     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Time}
3998     * object, using the given {@code Calendar} object to construct an
3999     * appropriate millisecond value for the date.
4000     *
4001     * @param columnIndex the first column is {@code 1}, the second
4002     *        is {@code 2}, and so on; must be {@code 1} or larger
4003     *        and equal to or less than the number of columns in the rowset
4004     * @param cal the {@code java.util.Calendar} object to use in
4005     *            constructing the date
4006     * @return the column value; if the value is SQL {@code NULL},
4007     *         the result is {@code null}
4008     * @throws SQLException if (1) the given column name is not the name of
4009     *            a column in this rowset, (2) the cursor is not on one of
4010     *            this rowset's rows or its insert row, or (3) the designated
4011     *            column does not store an SQL {@code TIME} or
4012     *            {@code TIMESTAMP} value
4013     */
4014    public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException {
4015        throw new UnsupportedOperationException();
4016    }
4017
4018    /**
4019     * Retrieves the value of the designated column in the current row
4020     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Time}
4021     * object, using the given {@code Calendar} object to construct an
4022     * appropriate millisecond value for the date.
4023     *
4024     * @param columnName a {@code String} object that must match the
4025     *        SQL name of a column in this rowset, ignoring case
4026     * @param cal the {@code java.util.Calendar} object to use in
4027     *            constructing the date
4028     * @return the column value; if the value is SQL {@code NULL},
4029     *         the result is {@code null}
4030     * @throws SQLException if (1) the given column name is not the name of
4031     *            a column in this rowset, (2) the cursor is not on one of
4032     *            this rowset's rows or its insert row, or (3) the designated
4033     *            column does not store an SQL {@code TIME} or
4034     *            {@code TIMESTAMP} value
4035     */
4036    public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException {
4037        throw new UnsupportedOperationException();
4038    }
4039
4040    /**
4041     * Retrieves the value of the designated column in the current row
4042     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Timestamp}
4043     * object, using the given {@code Calendar} object to construct an
4044     * appropriate millisecond value for the date.
4045     *
4046     * @param columnIndex the first column is {@code 1}, the second
4047     *        is {@code 2}, and so on; must be {@code 1} or larger
4048     *        and equal to or less than the number of columns in the rowset
4049     * @param cal the {@code java.util.Calendar} object to use in
4050     *            constructing the date
4051     * @return the column value; if the value is SQL {@code NULL},
4052     *         the result is {@code null}
4053     * @throws SQLException if (1) the given column name is not the name of
4054     *            a column in this rowset, (2) the cursor is not on one of
4055     *            this rowset's rows or its insert row, or (3) the designated
4056     *            column does not store an SQL {@code TIME} or
4057     *            {@code TIMESTAMP} value
4058     */
4059    public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
4060        throw new UnsupportedOperationException();
4061    }
4062
4063    /**
4064     * Retrieves the value of the designated column in the current row
4065     * of this {@code CachedRowSetImpl} object as a
4066     * {@code java.sql.Timestamp} object, using the given
4067     * {@code Calendar} object to construct an appropriate
4068     * millisecond value for the date.
4069     *
4070     * @param columnName a {@code String} object that must match the
4071     *        SQL name of a column in this rowset, ignoring case
4072     * @param cal the {@code java.util.Calendar} object to use in
4073     *            constructing the date
4074     * @return the column value; if the value is SQL {@code NULL},
4075     *         the result is {@code null}
4076     * @throws SQLException if (1) the given column name is not the name of
4077     *            a column in this rowset, (2) the cursor is not on one of
4078     *            this rowset's rows or its insert row, or (3) the designated
4079     *            column does not store an SQL {@code DATE},
4080     *            {@code TIME}, or {@code TIMESTAMP} value
4081     */
4082    public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException {
4083        throw new UnsupportedOperationException();
4084    }
4085
4086    /*
4087     * RowSetInternal Interface
4088     */
4089
4090    /**
4091     * Retrieves the {@code Connection} object passed to this
4092     * {@code CachedRowSetImpl} object.  This connection may be
4093     * used to populate this rowset with data or to write data back
4094     * to its underlying data source.
4095     *
4096     * @return the {@code Connection} object passed to this rowset;
4097     *         may be {@code null} if there is no connection
4098     * @throws SQLException if an error occurs
4099     */
4100    public Connection getConnection() throws SQLException{
4101        throw new UnsupportedOperationException();
4102    }
4103
4104    /**
4105     * Sets the metadata for this {@code CachedRowSetImpl} object
4106     * with the given {@code RowSetMetaData} object.
4107     *
4108     * @param md a {@code RowSetMetaData} object instance containing
4109     *            metadata about the columsn in the rowset
4110     * @throws SQLException if invalid meta data is supplied to the
4111     *            rowset
4112     */
4113    public void setMetaData(RowSetMetaData md) throws SQLException {
4114        throw new UnsupportedOperationException();
4115    }
4116
4117    /**
4118     * Returns a result set containing the original value of the rowset. The
4119     * original value is the state of the {@code CachedRowSetImpl} after the
4120     * last population or synchronization (whichever occurred most recently) with
4121     * the data source.
4122     * <p>
4123     * The cursor is positioned before the first row in the result set.
4124     * Only rows contained in the result set returned by {@code getOriginal()}
4125     * are said to have an original value.
4126     *
4127     * @return the original result set of the rowset
4128     * @throws SQLException if an error occurs produce the
4129     *           {@code ResultSet} object
4130     */
4131    public ResultSet getOriginal() throws SQLException {
4132       throw new UnsupportedOperationException();
4133    }
4134
4135    /**
4136     * Returns a result set containing the original value of the current
4137     * row only.
4138     * The original value is the state of the {@code CachedRowSetImpl} after
4139     * the last population or synchronization (whichever occurred most recently)
4140     * with the data source.
4141     *
4142     * @return the original result set of the row
4143     * @throws SQLException if there is no current row
4144     * @see #setOriginalRow
4145     */
4146    public ResultSet getOriginalRow() throws SQLException {
4147        throw new UnsupportedOperationException();
4148
4149    }
4150
4151    /**
4152     * Marks the current row in this rowset as being an original row.
4153     *
4154     * @throws SQLException if there is no current row
4155     * @see #getOriginalRow
4156     */
4157    public void setOriginalRow() throws SQLException {
4158        throw new UnsupportedOperationException();
4159    }
4160
4161    /**
4162     * Marks all rows in this rowset as being original rows. Any updates
4163     * made to the rows become the original values for the rowset.
4164     * Calls to the method {@code setOriginal} connot be reversed.
4165     *
4166     * @throws SQLException if an error occurs
4167     */
4168    public void setOriginal() throws SQLException {
4169        throw new UnsupportedOperationException();
4170    }
4171
4172    /**
4173     * Returns an identifier for the object (table) that was used to create this
4174     * rowset.
4175     *
4176     * @return a {@code String} object that identifies the table from
4177     *         which this {@code CachedRowSetImpl} object was derived
4178     * @throws SQLException if an error occurs
4179     */
4180    public String getTableName() throws SQLException {
4181        throw new UnsupportedOperationException();
4182    }
4183
4184    /**
4185     * Sets the identifier for the table from which this rowset was derived
4186     * to the given table name.
4187     *
4188     * @param tabName a {@code String} object that identifies the
4189     *          table from which this {@code CachedRowSetImpl} object
4190     *          was derived
4191     * @throws SQLException if an error occurs
4192     */
4193    public void setTableName(String tabName) throws SQLException {
4194        throw new UnsupportedOperationException();
4195    }
4196
4197    /**
4198     * Returns the columns that make a key to uniquely identify a
4199     * row in this {@code CachedRowSetImpl} object.
4200     *
4201     * @return an array of column numbers that constitutes a primary
4202     *           key for this rowset. This array should be empty
4203     *           if no column is representitive of a primary key
4204     * @throws SQLException if the rowset is empty or no columns
4205     *           are designated as primary keys
4206     * @see #setKeyColumns
4207     */
4208    public int[] getKeyColumns() throws SQLException {
4209        throw new UnsupportedOperationException();
4210    }
4211
4212
4213    /**
4214     * Sets this {@code CachedRowSetImpl} object's
4215     * {@code keyCols} field with the given array of column
4216     * numbers, which forms a key for uniquely identifying a row
4217     * in this rowset.
4218     *
4219     * @param keys an array of {@code int} indicating the
4220     *        columns that form a primary key for this
4221     *        {@code CachedRowSetImpl} object; every
4222     *        element in the array must be greater than
4223     *        {@code 0} and less than or equal to the number
4224     *        of columns in this rowset
4225     * @throws SQLException if any of the numbers in the
4226     *            given array is not valid for this rowset
4227     * @see #getKeyColumns
4228     */
4229    public void setKeyColumns(int [] keys) throws SQLException {
4230        throw new UnsupportedOperationException();
4231    }
4232
4233    /**
4234     * Sets the designated column in either the current row or the insert
4235     * row of this {@code CachedRowSetImpl} object with the given
4236     * {@code double} value.
4237     *
4238     * This method updates a column value in either the current row or
4239     * the insert row of this rowset, but it does not update the
4240     * database.  If the cursor is on a row in the rowset, the
4241     * method {@link #updateRow} must be called to update the database.
4242     * If the cursor is on the insert row, the method {@link #insertRow}
4243     * must be called, which will insert the new row into both this rowset
4244     * and the database. Both of these methods must be called before the
4245     * cursor moves to another row.
4246     *
4247     * @param columnIndex the first column is {@code 1}, the second
4248     *        is {@code 2}, and so on; must be {@code 1} or larger
4249     *        and equal to or less than the number of columns in this rowset
4250     * @param ref the new column {@code java.sql.Ref} value
4251     * @throws SQLException if (1) the given column index is out of bounds,
4252     *        (2) the cursor is not on one of this rowset's rows or its
4253     *        insert row, or (3) this rowset is
4254     *        {@code ResultSet.CONCUR_READ_ONLY}
4255     */
4256    public void updateRef(int columnIndex, java.sql.Ref ref) throws SQLException {
4257        throw new UnsupportedOperationException();
4258    }
4259
4260    /**
4261     * Sets the designated column in either the current row or the insert
4262     * row of this {@code CachedRowSetImpl} object with the given
4263     * {@code double} value.
4264     *
4265     * This method updates a column value in either the current row or
4266     * the insert row of this rowset, but it does not update the
4267     * database.  If the cursor is on a row in the rowset, the
4268     * method {@link #updateRow} must be called to update the database.
4269     * If the cursor is on the insert row, the method {@link #insertRow}
4270     * must be called, which will insert the new row into both this rowset
4271     * and the database. Both of these methods must be called before the
4272     * cursor moves to another row.
4273     *
4274     * @param columnName a {@code String} object that must match the
4275     *        SQL name of a column in this rowset, ignoring case
4276     * @param ref the new column {@code java.sql.Ref} value
4277     * @throws SQLException if (1) the given column name does not match the
4278     *        name of a column in this rowset, (2) the cursor is not on
4279     *        one of this rowset's rows or its insert row, or (3) this
4280     *        rowset is {@code ResultSet.CONCUR_READ_ONLY}
4281     */
4282    public void updateRef(String columnName, java.sql.Ref ref) throws SQLException {
4283        throw new UnsupportedOperationException();
4284    }
4285
4286    /**
4287     * Sets the designated column in either the current row or the insert
4288     * row of this {@code CachedRowSetImpl} object with the given
4289     * {@code double} value.
4290     *
4291     * This method updates a column value in either the current row or
4292     * the insert row of this rowset, but it does not update the
4293     * database.  If the cursor is on a row in the rowset, the
4294     * method {@link #updateRow} must be called to update the database.
4295     * If the cursor is on the insert row, the method {@link #insertRow}
4296     * must be called, which will insert the new row into both this rowset
4297     * and the database. Both of these methods must be called before the
4298     * cursor moves to another row.
4299     *
4300     * @param columnIndex the first column is {@code 1}, the second
4301     *        is {@code 2}, and so on; must be {@code 1} or larger
4302     *        and equal to or less than the number of columns in this rowset
4303     * @param c the new column {@code Clob} value
4304     * @throws SQLException if (1) the given column index is out of bounds,
4305     *        (2) the cursor is not on one of this rowset's rows or its
4306     *        insert row, or (3) this rowset is
4307     *        {@code ResultSet.CONCUR_READ_ONLY}
4308     */
4309    public void updateClob(int columnIndex, Clob c) throws SQLException {
4310       throw new UnsupportedOperationException();
4311    }
4312
4313    /**
4314     * Sets the designated column in either the current row or the insert
4315     * row of this {@code CachedRowSetImpl} object with the given
4316     * {@code double} value.
4317     *
4318     * This method updates a column value in either the current row or
4319     * the insert row of this rowset, but it does not update the
4320     * database.  If the cursor is on a row in the rowset, the
4321     * method {@link #updateRow} must be called to update the database.
4322     * If the cursor is on the insert row, the method {@link #insertRow}
4323     * must be called, which will insert the new row into both this rowset
4324     * and the database. Both of these methods must be called before the
4325     * cursor moves to another row.
4326     *
4327     * @param columnName a {@code String} object that must match the
4328     *        SQL name of a column in this rowset, ignoring case
4329     * @param c the new column {@code Clob}value
4330     * @throws SQLException if (1) the given column name does not match the
4331     *            name of a column in this rowset, (2) the cursor is not on
4332     *            one of this rowset's rows or its insert row, or (3) this
4333     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
4334     */
4335    public void updateClob(String columnName, Clob c) throws SQLException {
4336        throw new UnsupportedOperationException();
4337    }
4338
4339    /**
4340     * Sets the designated column in either the current row or the insert
4341     * row of this {@code CachedRowSetImpl} object with the given
4342     * {@code java.sql.Blob} value.
4343     *
4344     * This method updates a column value in either the current row or
4345     * the insert row of this rowset, but it does not update the
4346     * database.  If the cursor is on a row in the rowset, the
4347     * method {@link #updateRow} must be called to update the database.
4348     * If the cursor is on the insert row, the method {@link #insertRow}
4349     * must be called, which will insert the new row into both this rowset
4350     * and the database. Both of these methods must be called before the
4351     * cursor moves to another row.
4352     *
4353     * @param columnIndex the first column is {@code 1}, the second
4354     *        is {@code 2}, and so on; must be {@code 1} or larger
4355     *        and equal to or less than the number of columns in this rowset
4356     * @param b the new column {@code Blob} value
4357     * @throws SQLException if (1) the given column index is out of bounds,
4358     *            (2) the cursor is not on one of this rowset's rows or its
4359     *            insert row, or (3) this rowset is
4360     *            {@code ResultSet.CONCUR_READ_ONLY}
4361     */
4362    public void updateBlob(int columnIndex, Blob b) throws SQLException {
4363       throw new UnsupportedOperationException();
4364    }
4365
4366    /**
4367     * Sets the designated column in either the current row or the insert
4368     * row of this {@code CachedRowSetImpl} object with the given
4369     * {@code java.sql.Blob } value.
4370     *
4371     * This method updates a column value in either the current row or
4372     * the insert row of this rowset, but it does not update the
4373     * database.  If the cursor is on a row in the rowset, the
4374     * method {@link #updateRow} must be called to update the database.
4375     * If the cursor is on the insert row, the method {@link #insertRow}
4376     * must be called, which will insert the new row into both this rowset
4377     * and the database. Both of these methods must be called before the
4378     * cursor moves to another row.
4379     *
4380     * @param columnName a {@code String} object that must match the
4381     *        SQL name of a column in this rowset, ignoring case
4382     * @param b the new column {@code Blob} value
4383     * @throws SQLException if (1) the given column name does not match the
4384     *            name of a column in this rowset, (2) the cursor is not on
4385     *            one of this rowset's rows or its insert row, or (3) this
4386     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
4387     */
4388    public void updateBlob(String columnName, Blob b) throws SQLException {
4389        throw new UnsupportedOperationException();
4390    }
4391
4392    /**
4393     * Sets the designated column in either the current row or the insert
4394     * row of this {@code CachedRowSetImpl} object with the given
4395     * {@code java.sql.Array} values.
4396     *
4397     * This method updates a column value in either the current row or
4398     * the insert row of this rowset, but it does not update the
4399     * database.  If the cursor is on a row in the rowset, the
4400     * method {@link #updateRow} must be called to update the database.
4401     * If the cursor is on the insert row, the method {@link #insertRow}
4402     * must be called, which will insert the new row into both this rowset
4403     * and the database. Both of these methods must be called before the
4404     * cursor moves to another row.
4405     *
4406     * @param columnIndex the first column is {@code 1}, the second
4407     *        is {@code 2}, and so on; must be {@code 1} or larger
4408     *        and equal to or less than the number of columns in this rowset
4409     * @param a the new column {@code Array} value
4410     * @throws SQLException if (1) the given column index is out of bounds,
4411     *            (2) the cursor is not on one of this rowset's rows or its
4412     *            insert row, or (3) this rowset is
4413     *            {@code ResultSet.CONCUR_READ_ONLY}
4414     */
4415    public void updateArray(int columnIndex, Array a) throws SQLException {
4416        throw new UnsupportedOperationException();
4417    }
4418
4419    /**
4420     * Sets the designated column in either the current row or the insert
4421     * row of this {@code CachedRowSetImpl} object with the given
4422     * {@code java.sql.Array} value.
4423     *
4424     * This method updates a column value in either the current row or
4425     * the insert row of this rowset, but it does not update the
4426     * database.  If the cursor is on a row in the rowset, the
4427     * method {@link #updateRow} must be called to update the database.
4428     * If the cursor is on the insert row, the method {@link #insertRow}
4429     * must be called, which will insert the new row into both this rowset
4430     * and the database. Both of these methods must be called before the
4431     * cursor moves to another row.
4432     *
4433     * @param columnName a {@code String} object that must match the
4434     *        SQL name of a column in this rowset, ignoring case
4435     * @param a the new column {@code Array} value
4436     * @throws SQLException if (1) the given column name does not match the
4437     *            name of a column in this rowset, (2) the cursor is not on
4438     *            one of this rowset's rows or its insert row, or (3) this
4439     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
4440     */
4441    public void updateArray(String columnName, Array a) throws SQLException {
4442        throw new UnsupportedOperationException();
4443    }
4444
4445
4446    /**
4447     * Retrieves the value of the designated column in this
4448     * {@code CachedRowSetImpl} object as a {@code java.net.URL} object
4449     * in the Java programming language.
4450     *
4451     * @return a java.net.URL object containing the resource reference described by
4452     * the URL
4453     * @throws SQLException if (1) the given column index is out of bounds,
4454     * (2) the cursor is not on one of this rowset's rows or its
4455     * insert row, or (3) the designated column does not store an
4456     * SQL {@code DATALINK} value.
4457     * @see #getURL(String)
4458     */
4459    public java.net.URL getURL(int columnIndex) throws SQLException {
4460        throw new UnsupportedOperationException();
4461    }
4462
4463    /**
4464     * Retrieves the value of the designated column in this
4465     * {@code CachedRowSetImpl} object as a {@code java.net.URL} object
4466     * in the Java programming language.
4467     *
4468     * @return a java.net.URL object containing the resource reference described by
4469     * the URL
4470     * @throws SQLException if (1) the given column name not the name of a column
4471     * in this rowset, or
4472     * (2) the cursor is not on one of this rowset's rows or its
4473     * insert row, or (3) the designated column does not store an
4474     * SQL {@code DATALINK} value.
4475     * @see #getURL(int)
4476     */
4477    public java.net.URL getURL(String columnName) throws SQLException {
4478        throw new UnsupportedOperationException();
4479
4480    }
4481
4482    /**
4483     * The first warning reported by calls on this {@code CachedRowSetImpl}
4484     * object is returned. Subsequent {@code CachedRowSetImpl} warnings will
4485     * be chained to this {@code SQLWarning}. All {@code RowSetWarnings}
4486     * warnings are generated in the disconnected environment and remain a
4487     * seperate warning chain to that provided by the {@code getWarnings}
4488     * method.
4489     *
4490     * <P>The warning chain is automatically cleared each time a new
4491     * row is read.
4492     *
4493     * <P><B>Note:</B> This warning chain only covers warnings caused
4494     * by {@code CachedRowSet} (and their child interface)
4495     * methods. All {@code SQLWarnings} can be obtained using the
4496     * {@code getWarnings} method which tracks warnings generated
4497     * by the underlying JDBC driver.
4498     * @return the first SQLWarning or null
4499     *
4500     */
4501    public RowSetWarning getRowSetWarnings() {
4502        throw new UnsupportedOperationException();
4503    }
4504
4505     /**
4506     * Commits all changes performed by the {@code acceptChanges()}
4507     * methods
4508     *
4509     * @see java.sql.Connection#commit
4510     */
4511    public void commit() throws SQLException {
4512        throw new UnsupportedOperationException();
4513    }
4514
4515    /**
4516     * Rolls back all changes performed by the {@code acceptChanges()}
4517     * methods
4518     *
4519     * @see java.sql.Connection#rollback
4520     */
4521    public void rollback() throws SQLException {
4522        throw new UnsupportedOperationException();
4523    }
4524
4525    /**
4526     * Rolls back all changes performed by the {@code acceptChanges()}
4527     * to the last {@code Savepoint} transaction marker.
4528     *
4529     * @see java.sql.Connection#rollback(Savepoint)
4530     */
4531    public void rollback(Savepoint s) throws SQLException {
4532        throw new UnsupportedOperationException();
4533    }
4534
4535    /**
4536     * Unsets the designated parameter to the given int array.
4537     * This was set using {@code setMatchColumn}
4538     * as the column which will form the basis of the join.
4539     * <P>
4540     * The parameter value unset by this method should be same
4541     * as was set.
4542     *
4543     * @param columnIdxes the index into this rowset
4544     *        object's internal representation of parameter values
4545     * @throws SQLException if an error occurs or the
4546     *  parameter index is out of bounds or if the columnIdx is
4547     *  not the same as set using {@code setMatchColumn(int [])}
4548     */
4549    public void unsetMatchColumn(int[] columnIdxes) throws SQLException {
4550         throw new UnsupportedOperationException();
4551    }
4552
4553   /**
4554     * Unsets the designated parameter to the given String array.
4555     * This was set using {@code setMatchColumn}
4556     * as the column which will form the basis of the join.
4557     * <P>
4558     * The parameter value unset by this method should be same
4559     * as was set.
4560     *
4561     * @param columnIdxes the index into this rowset
4562     *        object's internal representation of parameter values
4563     * @throws SQLException if an error occurs or the
4564     *  parameter index is out of bounds or if the columnName is
4565     *  not the same as set using {@code setMatchColumn(String [])}
4566     */
4567    public void unsetMatchColumn(String[] columnIdxes) throws SQLException {
4568       throw new UnsupportedOperationException();
4569    }
4570
4571    /**
4572     * Retrieves the column name as {@code String} array
4573     * that was set using {@code setMatchColumn(String [])}
4574     * for this rowset.
4575     *
4576     * @return a {@code String} array object that contains the column names
4577     *         for the rowset which has this the match columns
4578     *
4579     * @throws SQLException if an error occurs or column name is not set
4580     */
4581    public String[] getMatchColumnNames() throws SQLException {
4582        throw new UnsupportedOperationException();
4583    }
4584
4585    /**
4586     * Retrieves the column id as {@code int} array that was set using
4587     * {@code setMatchColumn(int [])} for this rowset.
4588     *
4589     * @return an {@code int} array object that contains the column ids
4590     *         for the rowset which has this as the match columns.
4591     *
4592     * @throws SQLException if an error occurs or column index is not set
4593     */
4594    public int[] getMatchColumnIndexes() throws SQLException {
4595        throw new UnsupportedOperationException();
4596    }
4597
4598    /**
4599     * Sets the designated parameter to the given int array.
4600     * This forms the basis of the join for the
4601     * {@code JoinRowSet} as the column which will form the basis of the
4602     * join.
4603     * <P>
4604     * The parameter value set by this method is stored internally and
4605     * will be supplied as the appropriate parameter in this rowset's
4606     * command when the method {@code getMatchColumnIndexes} is called.
4607     *
4608     * @param columnIdxes the indexes into this rowset
4609     *        object's internal representation of parameter values; the
4610     *        first parameter is 0, the second is 1, and so on; must be
4611     *        {@code 0} or greater
4612     * @throws SQLException if an error occurs or the
4613     *                         parameter index is out of bounds
4614     */
4615    public void setMatchColumn(int[] columnIdxes) throws SQLException {
4616        throw new UnsupportedOperationException();
4617    }
4618
4619    /**
4620     * Sets the designated parameter to the given String array.
4621     *  This forms the basis of the join for the
4622     * {@code JoinRowSet} as the column which will form the basis of the
4623     * join.
4624     * <P>
4625     * The parameter value set by this method is stored internally and
4626     * will be supplied as the appropriate parameter in this rowset's
4627     * command when the method {@code getMatchColumn} is called.
4628     *
4629     * @param columnNames the name of the column into this rowset
4630     *        object's internal representation of parameter values
4631     * @throws SQLException if an error occurs or the
4632     *  parameter index is out of bounds
4633     */
4634    public void setMatchColumn(String[] columnNames) throws SQLException {
4635        throw new UnsupportedOperationException();
4636    }
4637
4638
4639    /**
4640     * Sets the designated parameter to the given {@code int}
4641     * object.  This forms the basis of the join for the
4642     * {@code JoinRowSet} as the column which will form the basis of the
4643     * join.
4644     * <P>
4645     * The parameter value set by this method is stored internally and
4646     * will be supplied as the appropriate parameter in this rowset's
4647     * command when the method {@code getMatchColumn} is called.
4648     *
4649     * @param columnIdx the index into this rowset
4650     *        object's internal representation of parameter values; the
4651     *        first parameter is 0, the second is 1, and so on; must be
4652     *        {@code 0} or greater
4653     * @throws SQLException if an error occurs or the
4654     *                         parameter index is out of bounds
4655     */
4656    public void setMatchColumn(int columnIdx) throws SQLException {
4657        throw new UnsupportedOperationException();
4658    }
4659
4660    /**
4661     * Sets the designated parameter to the given {@code String}
4662     * object.  This forms the basis of the join for the
4663     * {@code JoinRowSet} as the column which will form the basis of the
4664     * join.
4665     * <P>
4666     * The parameter value set by this method is stored internally and
4667     * will be supplied as the appropriate parameter in this rowset's
4668     * command when the method {@code getMatchColumn} is called.
4669     *
4670     * @param columnName the name of the column into this rowset
4671     *        object's internal representation of parameter values
4672     * @throws SQLException if an error occurs or the
4673     *  parameter index is out of bounds
4674     */
4675    public void setMatchColumn(String columnName) throws SQLException {
4676        throw new UnsupportedOperationException();
4677    }
4678
4679    /**
4680     * Unsets the designated parameter to the given {@code int}
4681     * object.  This was set using {@code setMatchColumn}
4682     * as the column which will form the basis of the join.
4683     * <P>
4684     * The parameter value unset by this method should be same
4685     * as was set.
4686     *
4687     * @param columnIdx the index into this rowset
4688     *        object's internal representation of parameter values
4689     * @throws SQLException if an error occurs or the
4690     *  parameter index is out of bounds or if the columnIdx is
4691     *  not the same as set using {@code setMatchColumn(int)}
4692     */
4693    public void unsetMatchColumn(int columnIdx) throws SQLException {
4694        throw new UnsupportedOperationException();
4695    }
4696
4697    /**
4698     * Unsets the designated parameter to the given {@code String}
4699     * object.  This was set using {@code setMatchColumn}
4700     * as the column which will form the basis of the join.
4701     * <P>
4702     * The parameter value unset by this method should be same
4703     * as was set.
4704     *
4705     * @param columnName the index into this rowset
4706     *        object's internal representation of parameter values
4707     * @throws SQLException if an error occurs or the
4708     *  parameter index is out of bounds or if the columnName is
4709     *  not the same as set using {@code setMatchColumn(String)}
4710     */
4711    public void unsetMatchColumn(String columnName) throws SQLException {
4712        throw new UnsupportedOperationException();
4713    }
4714
4715    /**
4716     * Notifies registered listeners that a RowSet object in the given RowSetEvent
4717     * object has populated a number of additional rows. The {@code numRows} parameter
4718     * ensures that this event will only be fired every {@code numRow}.
4719     * <p>
4720     * The source of the event can be retrieved with the method event.getSource.
4721     *
4722     * @param event a {@code RowSetEvent} object that contains the
4723     *     {@code RowSet} object that is the source of the events
4724     * @param numRows when populating, the number of rows interval on which the
4725     *     {@code CachedRowSet} populated should fire; the default value
4726     *     is zero; cannot be less than {@code fetchSize} or zero
4727     */
4728    public void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException {
4729        throw new UnsupportedOperationException();
4730    }
4731
4732    /**
4733     * Populates this {@code CachedRowSet} object with data from
4734     * the given {@code ResultSet} object. While related to the {@code populate(ResultSet)}
4735     * method, an additional parameter is provided to allow starting position within
4736     * the {@code ResultSet} from where to populate the CachedRowSet
4737     * instance.
4738     *
4739     * This method is an alternative to the method {@code execute}
4740     * for filling the rowset with data.  The method {@code populate}
4741     * does not require that the properties needed by the method
4742     * {@code execute}, such as the {@code command} property,
4743     * be set. This is true because the method {@code populate}
4744     * is given the {@code ResultSet} object from
4745     * which to get data and thus does not need to use the properties
4746     * required for setting up a connection and executing this
4747     * {@code CachedRowSetImpl} object's command.
4748     * <P>
4749     * After populating this rowset with data, the method
4750     * {@code populate} sets the rowset's metadata and
4751     * then sends a {@code RowSetChangedEvent} object
4752     * to all registered listeners prior to returning.
4753     *
4754     * @param data the {@code ResultSet} object containing the data
4755     *             to be read into this {@code CachedRowSetImpl} object
4756     * @param start the integer specifing the position in the
4757     *        {@code ResultSet} object to popultate the
4758     *        {@code CachedRowSetImpl} object.
4759     * @throws SQLException if an error occurs; or the max row setting is
4760     *          violated while populating the RowSet.Also id the start position
4761     *          is negative.
4762     * @see #execute
4763     */
4764     public void populate(ResultSet data, int start) throws SQLException{
4765        throw new UnsupportedOperationException();
4766
4767     }
4768
4769    /**
4770     * The nextPage gets the next page, that is a {@code CachedRowSetImpl} object
4771     * containing the number of rows specified by page size.
4772     * @return boolean value true indicating whether there are more pages to come and
4773     *         false indicating that this is the last page.
4774     * @throws SQLException if an error occurs or this called before calling populate.
4775     */
4776     public boolean nextPage() throws SQLException {
4777         throw new UnsupportedOperationException();
4778     }
4779
4780    /**
4781     * This is the setter function for setting the size of the page, which specifies
4782     * how many rows have to be retrived at a time.
4783     *
4784     * @param size which is the page size
4785     * @throws SQLException if size is less than zero or greater than max rows.
4786     */
4787     public void setPageSize (int size) throws SQLException {
4788        throw new UnsupportedOperationException();
4789     }
4790
4791    /**
4792     * This is the getter function for the size of the page.
4793     *
4794     * @return an integer that is the page size.
4795     */
4796    public int getPageSize() {
4797        throw new UnsupportedOperationException();
4798    }
4799
4800
4801    /**
4802     * Retrieves the data present in the page prior to the page from where it is
4803     * called.
4804     * @return boolean value true if it retrieves the previous page, flase if it
4805     *         is on the first page.
4806     * @throws SQLException if it is called before populate is called or ResultSet
4807     *         is of type {@code ResultSet.TYPE_FORWARD_ONLY} or if an error
4808     *         occurs.
4809     */
4810    public boolean previousPage() throws SQLException {
4811       throw new UnsupportedOperationException();
4812    }
4813
4814    /**
4815       * Updates the designated column with a character stream value, which will
4816       * have the specified number of bytes. The driver does the necessary conversion
4817       * from Java character format to the national character set in the database.
4818       * It is intended for use when updating NCHAR, NVARCHAR and LONGNVARCHAR columns.
4819       * The updater methods are used to update column values in the current row or
4820       * the insert row. The updater methods do not update the underlying database;
4821       * instead the updateRow or insertRow methods are called to update the database.
4822       *
4823       * @param columnIndex - the first column is 1, the second is 2, ...
4824       * @param x - the new column value
4825       * @param length - the length of the stream
4826       * @exception SQLException if a database access error occurs
4827       * @since 1.6
4828       */
4829       public void updateNCharacterStream(int columnIndex,
4830                            java.io.Reader x,
4831                            int length)
4832                            throws SQLException {
4833          throw new UnsupportedOperationException("Operation not yet supported");
4834       }
4835
4836     /**
4837       * Updates the designated column with a character stream value, which will
4838       * have the specified number of bytes. The driver does the necessary conversion
4839       * from Java character format to the national character set in the database.
4840       * It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
4841       * The updater methods are used to update column values in the current row or
4842       * the insert row. The updater methods do not update the underlying database;
4843       * instead the updateRow or insertRow methods are called to update the database.
4844       *
4845       * @param columnName - name of the Column
4846       * @param x - the new column value
4847       * @param length - the length of the stream
4848       * @exception SQLException if a database access error occurs
4849       * @since 1.6
4850       */
4851       public void updateNCharacterStream(String columnName,
4852                            java.io.Reader x,
4853                            int length)
4854                            throws SQLException {
4855          throw new UnsupportedOperationException("Operation not yet supported");
4856       }
4857
4858      /**
4859       * This method re populates the resBundle
4860       * during the deserialization process
4861       *
4862       */
4863       private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
4864         // Default state initialization happens here
4865         ois.defaultReadObject();
4866         // Initialization of transient Res Bundle happens here .
4867         try {
4868            resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
4869         } catch(IOException ioe) {
4870             throw new RuntimeException(ioe);
4871         }
4872
4873       }
4874
4875       static final long serialVersionUID = -3345004441725080251L;
4876} //end class
4877