1/*
2 * Copyright (c) 2003, 2012, 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;
27
28import java.sql.*;
29import javax.sql.*;
30import javax.naming.*;
31import java.io.*;
32import java.math.*;
33import java.util.*;
34
35import javax.sql.rowset.*;
36import javax.sql.rowset.spi.SyncProvider;
37import javax.sql.rowset.spi.SyncProviderException;
38
39/**
40 * The standard implementation of the <code>JoinRowSet</code>
41 * interface providing an SQL <code>JOIN</code> between <code>RowSet</code>
42 * objects.
43 * <P>
44 * The implementation provides an ANSI-style <code>JOIN</code> providing an
45 * inner join between two tables. Any unmatched rows in either table of the
46 * join are discarded.
47 * <p>
48 * Typically, a <code>JoinRowSet</code> implementation is leveraged by
49 * <code>RowSet</code> instances that are in a disconnected environment and
50 * thus do not have the luxury of an open connection to the data source to
51 * establish logical relationships between themselves. In other words, it is
52 * largely <code>CachedRowSet</code> objects and implementations derived from
53 * the <code>CachedRowSet</code> interface that will use the <code>JoinRowSetImpl</code>
54 * implementation.
55 *
56 * @author Amit Handa, Jonathan Bruce
57 */
58public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
59 /**
60 * A <code>Vector</code> object that contains the <code>RowSet</code> objects
61 * that have been added to this <code>JoinRowSet</code> object.
62 */
63 private Vector<CachedRowSetImpl> vecRowSetsInJOIN;
64
65 /**
66 * The <code>CachedRowSet</code> object that encapsulates this
67 * <code>JoinRowSet</code> object.
68 * When <code>RowSet</code> objects are added to this <code>JoinRowSet</code>
69 * object, they are also added to <i>crsInternal</i> to form the same kind of
70 * SQL <code>JOIN</code>. As a result, methods for making updates to this
71 * <code>JoinRowSet</code> object can use <i>crsInternal</i> methods in their
72 * implementations.
73 */
74 private CachedRowSetImpl crsInternal;
75
76 /**
77 * A <code>Vector</code> object containing the types of join that have been set
78 * for this <code>JoinRowSet</code> object.
79 * The last join type set forms the basis of succeeding joins.
80 */
81 private Vector<Integer> vecJoinType;
82
83 /**
84 * A <code>Vector</code> object containing the names of all the tables entering
85 * the join.
86 */
87 private Vector<String> vecTableNames;
88
89 /**
90 * An <code>int</code> that indicates the column index of the match column.
91 */
92 private int iMatchKey;
93
94 /**
95 * A <code>String</code> object that stores the name of the match column.
96 */
97 private String strMatchKey ;
98
99 /**
100 * An array of <code>boolean</code> values indicating the types of joins supported
101 * by this <code>JoinRowSet</code> implementation.
102 */
103 boolean[] supportedJOINs;
104
105 /**
106 * The <code>WebRowSet</code> object that encapsulates this <code>JoinRowSet</code>
107 * object. This <code>WebRowSet</code> object allows this <code>JoinRowSet</code>
108 * object to leverage the properties and methods of a <code>WebRowSet</code>
109 * object.
110 */
111 private WebRowSet wrs;
112
113
114 /**
115 * Constructor for <code>JoinRowSetImpl</code> class. Configures various internal data
116 * structures to provide mechanisms required for <code>JoinRowSet</code> interface
117 * implementation.
118 *
119 * @throws SQLException if an error occurs in instantiating an instance of
120 * <code>JoinRowSetImpl</code>
121 */
122 public JoinRowSetImpl() throws SQLException {
123
124 vecRowSetsInJOIN = new Vector<CachedRowSetImpl>();
125 crsInternal = new CachedRowSetImpl();
126 vecJoinType = new Vector<Integer>();
127 vecTableNames = new Vector<String>();
128 iMatchKey = -1;
129 strMatchKey = null;
130 supportedJOINs =
131 new boolean[] {false, true, false, false, false};
132 try {
133 resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
134 } catch(IOException ioe) {
135 throw new RuntimeException(ioe);
136 }
137
138 }
139
140 /**
141 * Adds the given <code>RowSet</code> object to this
142 * <code>JoinRowSet</code> object. If this
143 * rowset is the first to be added to the <code>JoinRowSet</code>
144 * object, it forms the basis for the <code>JOIN</code>
145 * relationships to be formed.
146 * <p>
147 * This method should be used when the given <code>RowSet</code> object
148 * already has a match column set.
149 *
150 * @param rowset the <code>RowSet</code> object that implements the
151 * <code>Joinable</code> interface and is to be added
152 * to this <code>JoinRowSet</code> object
153 * @throws SQLException if an empty <code>RowSet</code> is added to the to the
154 * <code>JoinRowSet</code>; if a match column is not set; or if an
155 * additional <code>RowSet</code> violates the active <code>JOIN</code>
156 * @see CachedRowSet#setMatchColumn
157 */
158 public void addRowSet(Joinable rowset) throws SQLException {
159 boolean boolColId, boolColName;
160
161 boolColId = false;
162 boolColName = false;
163 CachedRowSetImpl cRowset;
164
165 if(!(rowset instanceof RowSet)) {
166 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notinstance").toString());
167 }
168
169 if(rowset instanceof JdbcRowSetImpl ) {
170 cRowset = new CachedRowSetImpl();
171 cRowset.populate((RowSet)rowset);
172 if(cRowset.size() == 0){
173 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.emptyrowset").toString());
174 }
175
176
177 try {
178 int matchColumnCount = 0;
179 for(int i=0; i< rowset.getMatchColumnIndexes().length; i++) {
180 if(rowset.getMatchColumnIndexes()[i] != -1)
181 ++ matchColumnCount;
182 else
183 break;
184 }
185 int[] pCol = new int[matchColumnCount];
186 for(int i=0; i<matchColumnCount; i++)
187 pCol[i] = rowset.getMatchColumnIndexes()[i];
188 cRowset.setMatchColumn(pCol);
189 } catch(SQLException sqle) {
190
191 }
192
193 } else {
194 cRowset = (CachedRowSetImpl)rowset;
195 if(cRowset.size() == 0){
196 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.emptyrowset").toString());
197 }
198 }
199
200 // Either column id or column name will be set
201 // If both not set throw exception.
202
203 try {
204 iMatchKey = (cRowset.getMatchColumnIndexes())[0];
205 } catch(SQLException sqle) {
206 //if not set catch the exception but do nothing now.
207 boolColId = true;
208 }
209
210 try {
211 strMatchKey = (cRowset.getMatchColumnNames())[0];
212 } catch(SQLException sqle) {
213 //if not set catch the exception but do nothing now.
214 boolColName = true;
215 }
216
217 if(boolColId && boolColName) {
218 // neither setter methods have been used to set
219 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.matchnotset").toString());
220 } else {
221 //if(boolColId || boolColName)
222 // either of the setter methods have been set.
223 if(boolColId){
224 //
225 ArrayList<Integer> indices = new ArrayList<>();
226 for(int i=0;i<cRowset.getMatchColumnNames().length;i++) {
227 if( (strMatchKey = (cRowset.getMatchColumnNames())[i]) != null) {
228 iMatchKey = cRowset.findColumn(strMatchKey);
229 indices.add(iMatchKey);
230 }
231 else
232 break;
233 }
234 int[] indexes = new int[indices.size()];
235 for(int i=0; i<indices.size();i++)
236 indexes[i] = indices.get(i);
237 cRowset.setMatchColumn(indexes);
238 // Set the match column here because join will be
239 // based on columnId,
240 // (nested for loop in initJOIN() checks for equality
241 // based on columnIndex)
242 } else {
243 //do nothing, iMatchKey is set.
244 }
245 // Now both iMatchKey and strMatchKey have been set pointing
246 // to the same column
247 }
248
249 // Till first rowset setJoinType may not be set because
250 // default type is JoinRowSet.INNER_JOIN which should
251 // be set and for subsequent additions of rowset, if not set
252 // keep on adding join type as JoinRowSet.INNER_JOIN
253 // to vecJoinType.
254
255 initJOIN(cRowset);
256 }
257
258 /**
259 * Adds the given <code>RowSet</code> object to the <code>JOIN</code> relation
260 * and sets the designated column as the match column.
261 * If the given <code>RowSet</code>
262 * object is the first to be added to this <code>JoinRowSet</code>
263 * object, it forms the basis of the <code>JOIN</code> relationship to be formed
264 * when other <code>RowSet</code> objects are added .
265 * <P>
266 * This method should be used when the given <code>RowSet</code> object
267 * does not already have a match column set.
268 *
269 * @param rowset a <code>RowSet</code> object to be added to
270 * the <code>JOIN</code> relation; must implement the <code>Joinable</code>
271 * interface
272 * @param columnIdx an <code>int</code> giving the index of the column to be set as
273 * the match column
274 * @throws SQLException if (1) an empty <code>RowSet</code> object is added to this
275 * <code>JoinRowSet</code> object, (2) a match column has not been set,
276 * or (3) the <code>RowSet</code> object being added violates the active
277 * <code>JOIN</code>
278 * @see CachedRowSet#unsetMatchColumn
279 */
280 public void addRowSet(RowSet rowset, int columnIdx) throws SQLException {
281 //passing the rowset as well as the columnIdx to form the joinrowset.
282
283 ((CachedRowSetImpl)rowset).setMatchColumn(columnIdx);
284
285 addRowSet((Joinable)rowset);
286 }
287
288 /**
289 * Adds the given <code>RowSet</code> object to the <code>JOIN</code> relationship
290 * and sets the designated column as the match column. If the given
291 * <code>RowSet</code>
292 * object is the first to be added to this <code>JoinRowSet</code>
293 * object, it forms the basis of the <code>JOIN</code> relationship to be formed
294 * when other <code>RowSet</code> objects are added .
295 * <P>
296 * This method should be used when the given <code>RowSet</code> object
297 * does not already have a match column set.
298 *
299 * @param rowset a <code>RowSet</code> object to be added to
300 * the <code>JOIN</code> relation
301 * @param columnName a <code>String</code> object giving the name of the column
302 * to be set as the match column; must implement the <code>Joinable</code>
303 * interface
304 * @throws SQLException if (1) an empty <code>RowSet</code> object is added to this
305 * <code>JoinRowSet</code> object, (2) a match column has not been set,
306 * or (3) the <code>RowSet</code> object being added violates the active
307 * <code>JOIN</code>
308 */
309 public void addRowSet(RowSet rowset, String columnName) throws SQLException {
310 //passing the rowset as well as the columnIdx to form the joinrowset.
311 ((CachedRowSetImpl)rowset).setMatchColumn(columnName);
312 addRowSet((Joinable)rowset);
313 }
314
315 /**
316 * Adds the given <code>RowSet</code> objects to the <code>JOIN</code> relationship
317 * and sets the designated columns as the match columns. If the first
318 * <code>RowSet</code> object in the array of <code>RowSet</code> objects
319 * is the first to be added to this <code>JoinRowSet</code>
320 * object, it forms the basis of the <code>JOIN</code> relationship to be formed
321 * when other <code>RowSet</code> objects are added.
322 * <P>
323 * The first <code>int</code>
324 * in <i>columnIdx</i> is used to set the match column for the first
325 * <code>RowSet</code> object in <i>rowset</i>, the second <code>int</code>
326 * in <i>columnIdx</i> is used to set the match column for the second
327 * <code>RowSet</code> object in <i>rowset</i>, and so on.
328 * <P>
329 * This method should be used when the given <code>RowSet</code> objects
330 * do not already have match columns set.
331 *
332 * @param rowset an array of <code>RowSet</code> objects to be added to
333 * the <code>JOIN</code> relation; each <code>RowSet</code> object must
334 * implement the <code>Joinable</code> interface
335 * @param columnIdx an array of <code>int</code> values designating the columns
336 * to be set as the
337 * match columns for the <code>RowSet</code> objects in <i>rowset</i>
338 * @throws SQLException if the number of <code>RowSet</code> objects in
339 * <i>rowset</i> is not equal to the number of <code>int</code> values
340 * in <i>columnIdx</i>
341 */
342 public void addRowSet(RowSet[] rowset,
343 int[] columnIdx) throws SQLException {
344 //validate if length of rowset array is same as length of int array.
345 if(rowset.length != columnIdx.length) {
346 throw new SQLException
347 (resBundle.handleGetObject("joinrowsetimpl.numnotequal").toString());
348 } else {
349 for(int i=0; i< rowset.length; i++) {
350 ((CachedRowSetImpl)rowset[i]).setMatchColumn(columnIdx[i]);
351 addRowSet((Joinable)rowset[i]);
352 } //end for
353 } //end if
354
355 }
356
357
358 /**
359 * Adds the given <code>RowSet</code> objects to the <code>JOIN</code> relationship
360 * and sets the designated columns as the match columns. If the first
361 * <code>RowSet</code> object in the array of <code>RowSet</code> objects
362 * is the first to be added to this <code>JoinRowSet</code>
363 * object, it forms the basis of the <code>JOIN</code> relationship to be formed
364 * when other <code>RowSet</code> objects are added.
365 * <P>
366 * The first <code>String</code> object
367 * in <i>columnName</i> is used to set the match column for the first
368 * <code>RowSet</code> object in <i>rowset</i>, the second <code>String</code>
369 * object in <i>columnName</i> is used to set the match column for the second
370 * <code>RowSet</code> object in <i>rowset</i>, and so on.
371 * <P>
372 * This method should be used when the given <code>RowSet</code> objects
373 * do not already have match columns set.
374 *
375 * @param rowset an array of <code>RowSet</code> objects to be added to
376 * the <code>JOIN</code> relation; each <code>RowSet</code> object must
377 * implement the <code>Joinable</code> interface
378 * @param columnName an array of <code>String</code> objects designating the columns
379 * to be set as the
380 * match columns for the <code>RowSet</code> objects in <i>rowset</i>
381 * @throws SQLException if the number of <code>RowSet</code> objects in
382 * <i>rowset</i> is not equal to the number of <code>String</code> objects
383 * in <i>columnName</i>, an empty <code>JdbcRowSet</code> is added to the
384 * <code>JoinRowSet</code>, if a match column is not set,
385 * or one or the <code>RowSet</code> objects in <i>rowset</i> violates the
386 * active <code>JOIN</code>
387 */
388 public void addRowSet(RowSet[] rowset,
389 String[] columnName) throws SQLException {
390 //validate if length of rowset array is same as length of int array.
391
392 if(rowset.length != columnName.length) {
393 throw new SQLException
394 (resBundle.handleGetObject("joinrowsetimpl.numnotequal").toString());
395 } else {
396 for(int i=0; i< rowset.length; i++) {
397 ((CachedRowSetImpl)rowset[i]).setMatchColumn(columnName[i]);
398 addRowSet((Joinable)rowset[i]);
399 } //end for
400 } //end if
401
402 }
403
404 /**
405 * Returns a Collection of the <code>RowSet</code> object instances
406 * currently residing with the instance of the <code>JoinRowSet</code>
407 * object instance. This should return the 'n' number of RowSet contained
408 * within the JOIN and maintain any updates that have occoured while in
409 * this union.
410 *
411 * @return A <code>Collection</code> of the added <code>RowSet</code>
412 * object instances
413 * @throws SQLException if an error occours generating a collection
414 * of the originating RowSets contained within the JOIN.
415 */
416 @SuppressWarnings("rawtypes")
417 public Collection getRowSets() throws SQLException {
418 return vecRowSetsInJOIN;
419 }
420
421 /**
422 * Returns a string array of the RowSet names currently residing
423 * with the <code>JoinRowSet</code> object instance.
424 *
425 * @return a string array of the RowSet names
426 * @throws SQLException if an error occours retrieving the RowSet names
427 * @see CachedRowSet#setTableName
428 */
429 public String[] getRowSetNames() throws SQLException {
430 Object [] arr = vecTableNames.toArray();
431 String []strArr = new String[arr.length];
432
433 for( int i = 0;i < arr.length; i++) {
434 strArr[i] = arr[i].toString();
435 }
436
437 return strArr;
438 }
439
440 /**
441 * Creates a separate <code>CachedRowSet</code> object that contains the data
442 * in this <code>JoinRowSet</code> object.
443 * <P>
444 * If any updates or modifications have been applied to this <code>JoinRowSet</code>
445 * object, the <code>CachedRowSet</code> object returned by this method will
446 * not be able to persist
447 * the changes back to the originating rows and tables in the
448 * data source because the data may be from different tables. The
449 * <code>CachedRowSet</code> instance returned should not
450 * contain modification data, such as whether a row has been updated or what the
451 * original values are. Also, the <code>CachedRowSet</code> object should clear
452 * its properties pertaining to
453 * its originating SQL statement. An application should reset the
454 * SQL statement using the <code>RowSet.setCommand</code> method.
455 * <p>
456 * To persist changes back to the data source, the <code>JoinRowSet</code> object
457 * calls the method <code>acceptChanges</code>. Implementations
458 * can leverage the internal data and update tracking in their
459 * implementations to interact with the <code>SyncProvider</code> to persist any
460 * changes.
461 *
462 * @return a <code>CachedRowSet</code> object containing the contents of this
463 * <code>JoinRowSet</code> object
464 * @throws SQLException if an error occurs assembling the <code>CachedRowSet</code>
465 * object
466 * @see javax.sql.RowSet
467 * @see javax.sql.rowset.CachedRowSet
468 * @see javax.sql.rowset.spi.SyncProvider
469 */
470 public CachedRowSet toCachedRowSet() throws SQLException {
471 return crsInternal;
472 }
473
474 /**
475 * Returns <code>true</code> if this <code>JoinRowSet</code> object supports
476 * an SQL <code>CROSS_JOIN</code> and <code>false</code> if it does not.
477 *
478 * @return <code>true</code> if the CROSS_JOIN is supported; <code>false</code>
479 * otherwise
480 */
481 public boolean supportsCrossJoin() {
482 return supportedJOINs[JoinRowSet.CROSS_JOIN];
483 }
484
485 /**
486 * Returns <code>true</code> if this <code>JoinRowSet</code> object supports
487 * an SQL <code>INNER_JOIN</code> and <code>false</code> if it does not.
488 *
489 * @return true is the INNER_JOIN is supported; false otherwise
490 */
491 public boolean supportsInnerJoin() {
492 return supportedJOINs[JoinRowSet.INNER_JOIN];
493 }
494
495 /**
496 * Returns <code>true</code> if this <code>JoinRowSet</code> object supports
497 * an SQL <code>LEFT_OUTER_JOIN</code> and <code>false</code> if it does not.
498 *
499 * @return true is the LEFT_OUTER_JOIN is supported; false otherwise
500 */
501 public boolean supportsLeftOuterJoin() {
502 return supportedJOINs[JoinRowSet.LEFT_OUTER_JOIN];
503 }
504
505 /**
506 * Returns <code>true</code> if this <code>JoinRowSet</code> object supports
507 * an SQL <code>RIGHT_OUTER_JOIN</code> and <code>false</code> if it does not.
508 *
509 * @return true is the RIGHT_OUTER_JOIN is supported; false otherwise
510 */
511 public boolean supportsRightOuterJoin() {
512 return supportedJOINs[JoinRowSet.RIGHT_OUTER_JOIN];
513 }
514
515 /**
516 * Returns <code>true</code> if this <code>JoinRowSet</code> object supports
517 * an SQL <code>FULL_JOIN</code> and <code>false</code> if it does not.
518 *
519 * @return true is the FULL_JOIN is supported; false otherwise
520 */
521 public boolean supportsFullJoin() {
522 return supportedJOINs[JoinRowSet.FULL_JOIN];
523
524 }
525
526 /**
527 * Sets the type of SQL <code>JOIN</code> that this <code>JoinRowSet</code>
528 * object will use. This method
529 * allows an application to adjust the type of <code>JOIN</code> imposed
530 * on tables contained within this <code>JoinRowSet</code> object and to do it
531 * on the fly. The last <code>JOIN</code> type set determines the type of
532 * <code>JOIN</code> to be performed.
533 * <P>
534 * Implementations should throw an <code>SQLException</code> if they do
535 * not support the given <code>JOIN</code> type.
536 *
537 * @param type one of the standard <code>JoinRowSet</code> constants
538 * indicating the type of <code>JOIN</code>. Must be one of the
539 * following:
540 * <code>JoinRowSet.CROSS_JOIN</code>
541 * <code>JoinRowSet.INNER_JOIN</code>
542 * <code>JoinRowSet.LEFT_OUTER_JOIN</code>
543 * <code>JoinRowSet.RIGHT_OUTER_JOIN</code>, or
544 * <code>JoinRowSet.FULL_JOIN</code>
545 * @throws SQLException if an unsupported <code>JOIN</code> type is set
546 */
547 public void setJoinType(int type) throws SQLException {
548 // The join which governs the join of two rowsets is the last
549 // join set, using setJoinType
550
551 if (type >= JoinRowSet.CROSS_JOIN && type <= JoinRowSet.FULL_JOIN) {
552 if (type != JoinRowSet.INNER_JOIN) {
553 // This 'if' will be removed after all joins are implemented.
554 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notsupported").toString());
555 } else {
556 Integer Intgr = Integer.valueOf(JoinRowSet.INNER_JOIN);
557 vecJoinType.add(Intgr);
558 }
559 } else {
560 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notdefined").toString());
561 } //end if
562 }
563
564
565 /**
566 * This checks for a match column for
567 * whether it exists or not.
568 *
569 * @param
CachedRowSet</code> object whose match column needs to be checked.
570 * @throws SQLException if MatchColumn is not set.
571 */
572 private boolean checkforMatchColumn(Joinable rs) throws SQLException {
573 int[] i = rs.getMatchColumnIndexes();
574 if (i.length <= 0) {
575 return false;
576 }
577 return true;
578 }
579
580 /**
581 * Internal initialization of <code>JoinRowSet</code>.
582 */
583 private void initJOIN(CachedRowSet rowset) throws SQLException {
584 try {
585
586 CachedRowSetImpl cRowset = (CachedRowSetImpl)rowset;
587 // Create a new CachedRowSet object local to this function.
588 CachedRowSetImpl crsTemp = new CachedRowSetImpl();
589 RowSetMetaDataImpl rsmd = new RowSetMetaDataImpl();
590
591 /* The following 'if block' seems to be always going true.
592 commenting this out for present
593
594 if (!supportedJOINs[1]) {
595 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notsupported").toString());
596 }
597
598 */
599
600 if (vecRowSetsInJOIN.isEmpty() ) {
601
602 // implies first cRowset to be added to the Join
603 // simply add this as a CachedRowSet.
604 // Also add it to the class variable of type vector
605 // do not need to check "type" of Join but it should be set.
606 crsInternal = (CachedRowSetImpl)rowset.createCopy();
607 crsInternal.setMetaData((RowSetMetaDataImpl)cRowset.getMetaData());
608 // metadata will also set the MatchColumn.
609
610 vecRowSetsInJOIN.add(cRowset);
611
612 } else {
613 // At this point we are ready to add another rowset to 'this' object
614 // Check the size of vecJoinType and vecRowSetsInJoin
615
616 // If nothing is being set, internally call setJoinType()
617 // to set to JoinRowSet.INNER_JOIN.
618
619 // For two rowsets one (valid) entry should be there in vecJoinType
620 // For three rowsets two (valid) entries should be there in vecJoinType
621
622 // Maintain vecRowSetsInJoin = vecJoinType + 1
623
624
625 if( (vecRowSetsInJOIN.size() - vecJoinType.size() ) == 2 ) {
626 // we are going to add next rowset and setJoinType has not been set
627 // recently, so set it to setJoinType() to JoinRowSet.INNER_JOIN.
628 // the default join type
629
630 setJoinType(JoinRowSet.INNER_JOIN);
631 } else if( (vecRowSetsInJOIN.size() - vecJoinType.size() ) == 1 ) {
632 // do nothing setjoinType() has been set by programmer
633 }
634
635 // Add the table names to the class variable of type vector.
636 vecTableNames.add(crsInternal.getTableName());
637 vecTableNames.add(cRowset.getTableName());
638 // Now we have two rowsets crsInternal and cRowset which need
639 // to be INNER JOIN'ED to form a new rowset
640 // Compare table1.MatchColumn1.value1 == { table2.MatchColumn2.value1
641 // ... upto table2.MatchColumn2.valueN }
642 // ...
643 // Compare table1.MatchColumn1.valueM == { table2.MatchColumn2.value1
644 // ... upto table2.MatchColumn2.valueN }
645 //
646 // Assuming first rowset has M rows and second N rows.
647
648 int rowCount2 = cRowset.size();
649 int rowCount1 = crsInternal.size();
650
651 // total columns in the new CachedRowSet will be sum of both -1
652 // (common column)
653 int matchColumnCount = 0;
654 for(int i=0; i< crsInternal.getMatchColumnIndexes().length; i++) {
655 if(crsInternal.getMatchColumnIndexes()[i] != -1)
656 ++ matchColumnCount;
657 else
658 break;
659 }
660
661 rsmd.setColumnCount
662 (crsInternal.getMetaData().getColumnCount() +
663 cRowset.getMetaData().getColumnCount() - matchColumnCount);
664
665 crsTemp.setMetaData(rsmd);
666 crsInternal.beforeFirst();
667 cRowset.beforeFirst();
668 for (int i = 1 ; i <= rowCount1 ; i++) {
669 if(crsInternal.isAfterLast() ) {
670 break;
671 }
672 if(crsInternal.next()) {
673 cRowset.beforeFirst();
674 for(int j = 1 ; j <= rowCount2 ; j++) {
675 if( cRowset.isAfterLast()) {
676 break;
677 }
678 if(cRowset.next()) {
679 boolean match = true;
680 for(int k=0; k<matchColumnCount; k++) {
681 if (!crsInternal.getObject( crsInternal.getMatchColumnIndexes()[k]).equals
682 (cRowset.getObject(cRowset.getMatchColumnIndexes()[k]))) {
683 match = false;
684 break;
685 }
686 }
687 if (match) {
688
689 int p;
690 int colc = 0; // reset this variable everytime you loop
691 // re create a JoinRowSet in crsTemp object
692 crsTemp.moveToInsertRow();
693
694 // create a new rowset crsTemp with data from first rowset
695 for( p=1;
696 p<=crsInternal.getMetaData().getColumnCount();p++) {
697
698 match = false;
699 for(int k=0; k<matchColumnCount; k++) {
700 if (p == crsInternal.getMatchColumnIndexes()[k] ) {
701 match = true;
702 break;
703 }
704 }
705 if ( !match ) {
706
707 crsTemp.updateObject(++colc, crsInternal.getObject(p));
708 // column type also needs to be passed.
709
710 rsmd.setColumnName
711 (colc, crsInternal.getMetaData().getColumnName(p));
712 rsmd.setTableName(colc, crsInternal.getTableName());
713
714 rsmd.setColumnType(p, crsInternal.getMetaData().getColumnType(p));
715 rsmd.setAutoIncrement(p, crsInternal.getMetaData().isAutoIncrement(p));
716 rsmd.setCaseSensitive(p, crsInternal.getMetaData().isCaseSensitive(p));
717 rsmd.setCatalogName(p, crsInternal.getMetaData().getCatalogName(p));
718 rsmd.setColumnDisplaySize(p, crsInternal.getMetaData().getColumnDisplaySize(p));
719 rsmd.setColumnLabel(p, crsInternal.getMetaData().getColumnLabel(p));
720 rsmd.setColumnType(p, crsInternal.getMetaData().getColumnType(p));
721 rsmd.setColumnTypeName(p, crsInternal.getMetaData().getColumnTypeName(p));
722 rsmd.setCurrency(p,crsInternal.getMetaData().isCurrency(p) );
723 rsmd.setNullable(p, crsInternal.getMetaData().isNullable(p));
724 rsmd.setPrecision(p, crsInternal.getMetaData().getPrecision(p));
725 rsmd.setScale(p, crsInternal.getMetaData().getScale(p));
726 rsmd.setSchemaName(p, crsInternal.getMetaData().getSchemaName(p));
727 rsmd.setSearchable(p, crsInternal.getMetaData().isSearchable(p));
728 rsmd.setSigned(p, crsInternal.getMetaData().isSigned(p));
729
730 } else {
731 // will happen only once, for that merged column pass
732 // the types as OBJECT, if types not equal
733
734 crsTemp.updateObject(++colc, crsInternal.getObject(p));
735
736 rsmd.setColumnName(colc, crsInternal.getMetaData().getColumnName(p));
737 rsmd.setTableName
738 (colc, crsInternal.getTableName()+
739 "#"+
740 cRowset.getTableName());
741
742
743 rsmd.setColumnType(p, crsInternal.getMetaData().getColumnType(p));
744 rsmd.setAutoIncrement(p, crsInternal.getMetaData().isAutoIncrement(p));
745 rsmd.setCaseSensitive(p, crsInternal.getMetaData().isCaseSensitive(p));
746 rsmd.setCatalogName(p, crsInternal.getMetaData().getCatalogName(p));
747 rsmd.setColumnDisplaySize(p, crsInternal.getMetaData().getColumnDisplaySize(p));
748 rsmd.setColumnLabel(p, crsInternal.getMetaData().getColumnLabel(p));
749 rsmd.setColumnType(p, crsInternal.getMetaData().getColumnType(p));
750 rsmd.setColumnTypeName(p, crsInternal.getMetaData().getColumnTypeName(p));
751 rsmd.setCurrency(p,crsInternal.getMetaData().isCurrency(p) );
752 rsmd.setNullable(p, crsInternal.getMetaData().isNullable(p));
753 rsmd.setPrecision(p, crsInternal.getMetaData().getPrecision(p));
754 rsmd.setScale(p, crsInternal.getMetaData().getScale(p));
755 rsmd.setSchemaName(p, crsInternal.getMetaData().getSchemaName(p));
756 rsmd.setSearchable(p, crsInternal.getMetaData().isSearchable(p));
757 rsmd.setSigned(p, crsInternal.getMetaData().isSigned(p));
758
759 //don't do ++colc in the above statement
760 } //end if
761 } //end for
762
763
764 // append the rowset crsTemp, with data from second rowset
765 for(int q=1;
766 q<= cRowset.getMetaData().getColumnCount();q++) {
767
768 match = false;
769 for(int k=0; k<matchColumnCount; k++) {
770 if (q == cRowset.getMatchColumnIndexes()[k] ) {
771 match = true;
772 break;
773 }
774 }
775 if ( !match ) {
776
777 crsTemp.updateObject(++colc, cRowset.getObject(q));
778
779 rsmd.setColumnName
780 (colc, cRowset.getMetaData().getColumnName(q));
781 rsmd.setTableName(colc, cRowset.getTableName());
782
783 /**
784 * This will happen for a special case scenario. The value of 'p'
785 * will always be one more than the number of columns in the first
786 * rowset in the join. So, for a value of 'q' which is the number of
787 * columns in the second rowset that participates in the join.
788 * So decrement value of 'p' by 1 else `p+q-1` will be out of range.
789 **/
790
791 //if((p+q-1) > ((crsInternal.getMetaData().getColumnCount()) +
792 // (cRowset.getMetaData().getColumnCount()) - 1)) {
793 // --p;
794 //}
795 rsmd.setColumnType(p+q-1, cRowset.getMetaData().getColumnType(q));
796 rsmd.setAutoIncrement(p+q-1, cRowset.getMetaData().isAutoIncrement(q));
797 rsmd.setCaseSensitive(p+q-1, cRowset.getMetaData().isCaseSensitive(q));
798 rsmd.setCatalogName(p+q-1, cRowset.getMetaData().getCatalogName(q));
799 rsmd.setColumnDisplaySize(p+q-1, cRowset.getMetaData().getColumnDisplaySize(q));
800 rsmd.setColumnLabel(p+q-1, cRowset.getMetaData().getColumnLabel(q));
801 rsmd.setColumnType(p+q-1, cRowset.getMetaData().getColumnType(q));
802 rsmd.setColumnTypeName(p+q-1, cRowset.getMetaData().getColumnTypeName(q));
803 rsmd.setCurrency(p+q-1,cRowset.getMetaData().isCurrency(q) );
804 rsmd.setNullable(p+q-1, cRowset.getMetaData().isNullable(q));
805 rsmd.setPrecision(p+q-1, cRowset.getMetaData().getPrecision(q));
806 rsmd.setScale(p+q-1, cRowset.getMetaData().getScale(q));
807 rsmd.setSchemaName(p+q-1, cRowset.getMetaData().getSchemaName(q));
808 rsmd.setSearchable(p+q-1, cRowset.getMetaData().isSearchable(q));
809 rsmd.setSigned(p+q-1, cRowset.getMetaData().isSigned(q));
810 }
811 else {
812 --p;
813 }
814 }
815 crsTemp.insertRow();
816 crsTemp.moveToCurrentRow();
817
818 } else {
819 // since not equa12
820 // so do nothing
821 } //end if
822 // bool1 = cRowset.next();
823 }
824
825 } // end inner for
826 //bool2 = crsInternal.next();
827 }
828
829 } //end outer for
830 crsTemp.setMetaData(rsmd);
831 crsTemp.setOriginal();
832
833 // Now the join is done.
834 // Make crsInternal = crsTemp, to be ready for next merge, if at all.
835
836 int[] pCol = new int[matchColumnCount];
837 for(int i=0; i<matchColumnCount; i++)
838 pCol[i] = crsInternal.getMatchColumnIndexes()[i];
839
840 crsInternal = (CachedRowSetImpl)crsTemp.createCopy();
841
842 // Because we add the first rowset as crsInternal to the
843 // merged rowset, so pCol will point to the Match column.
844 // until reset, am not sure we should set this or not(?)
845 // if this is not set next inner join won't happen
846 // if we explicitly do not set a set MatchColumn of
847 // the new crsInternal.
848
849 crsInternal.setMatchColumn(pCol);
850 // Add the merged rowset to the class variable of type vector.
851 crsInternal.setMetaData(rsmd);
852 vecRowSetsInJOIN.add(cRowset);
853 } //end if
854 } catch(SQLException sqle) {
855 // %%% Exception should not dump here:
856 sqle.printStackTrace();
857 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.initerror").toString() + sqle);
858 } catch (Exception e) {
859 e.printStackTrace();
860 throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.genericerr").toString() + e);
861 }
862 }
863
864 /**
865 * Return a SQL-like description of the <code>WHERE</code> clause being used
866 * in a <code>JoinRowSet</code> object instance. An implementation can describe
867 * the <code>WHERE</code> clause of the SQL <code>JOIN</code> by supplying a <code>SQL</code>
868 * strings description of <code>JOIN</code> or provide a textual description to assist
869 * applications using a <code>JoinRowSet</code>.
870 *
871 * @return whereClause a textual or SQL descripition of the logical
872 * <code>WHERE</code> cluase used in the <code>JoinRowSet</code> instance
873 * @throws SQLException if an error occurs in generating a representation
874 * of the <code>WHERE</code> clause.
875 */
876 public String getWhereClause() throws SQLException {
877
878 String strWhereClause = "Select ";
879 String whereClause;
880 String tabName= "";
881 String strTabName = "";
882 int sz,cols;
883 int j;
884 CachedRowSetImpl crs;
885
886 // get all the column(s) names from each rowset.
887 // append them with their tablenames i.e. tableName.columnName
888 // Select tableName1.columnName1,..., tableNameX.columnNameY
889 // from tableName1,...tableNameX where
890 // tableName1.(rowset1.getMatchColumnName()) ==
891 // tableName2.(rowset2.getMatchColumnName()) + "and" +
892 // tableNameX.(rowsetX.getMatchColumnName()) ==
893 // tableNameZ.(rowsetZ.getMatchColumnName()));
894
895 sz = vecRowSetsInJOIN.size();
896 for(int i=0;i<sz; i++) {
897 crs = vecRowSetsInJOIN.get(i);
898 cols = crs.getMetaData().getColumnCount();
899 tabName = tabName.concat(crs.getTableName());
900 strTabName = strTabName.concat(tabName+", ");
901 j = 1;
902 while(j<cols) {
903
904 strWhereClause = strWhereClause.concat
905 (tabName+"."+crs.getMetaData().getColumnName(j++));
906 strWhereClause = strWhereClause.concat(", ");
907 } //end while
908 } //end for
909
910
911 // now remove the last ","
912 strWhereClause = strWhereClause.substring
913 (0, strWhereClause.lastIndexOf(','));
914
915 // Add from clause
916 strWhereClause = strWhereClause.concat(" from ");
917
918 // Add the table names.
919 strWhereClause = strWhereClause.concat(strTabName);
920
921 //Remove the last ","
922 strWhereClause = strWhereClause.substring
923 (0, strWhereClause.lastIndexOf(','));
924
925 // Add the where clause
926 strWhereClause = strWhereClause.concat(" where ");
927
928 // Get the match columns
929 // rowset1.getMatchColumnName() == rowset2.getMatchColumnName()
930 for(int i=0;i<sz; i++) {
931 strWhereClause = strWhereClause.concat(
932 vecRowSetsInJOIN.get(i).getMatchColumnNames()[0]);
933 if(i%2!=0) {
934 strWhereClause = strWhereClause.concat("=");
935 } else {
936 strWhereClause = strWhereClause.concat(" and");
937 }
938 strWhereClause = strWhereClause.concat(" ");
939 }
940
941 return strWhereClause;
942 }
943
944
945 /**
946 * Moves the cursor down one row from its current position and
947 * returns <code>true</code> if the new cursor position is a
948 * valid row.
949 * The cursor for a new <code>ResultSet</code> object is initially
950 * positioned before the first row. The first call to the method
951 * <code>next</code> moves the cursor to the first row, making it
952 * the current row; the second call makes the second row the
953 * current row, and so on.
954 *
955 * <P>If an input stream from the previous row is open, it is
956 * implicitly closed. The <code>ResultSet</code> object's warning
957 * chain is cleared when a new row is read.
958 *
959 * @return <code>true</code> if the new current row is valid;
960 * <code>false</code> if there are no more rows
961 * @throws SQLException if an error occurs or
962 * the cursor is not positioned in the rowset, before
963 * the first row, or after the last row
964 */
965 public boolean next() throws SQLException {
966 return crsInternal.next();
967 }
968
969
970 /**
971 * Releases the current contents of this rowset, discarding outstanding
972 * updates. The rowset contains no rows after the method
973 * <code>release</code> is called. This method sends a
974 * <code>RowSetChangedEvent</code> object to all registered listeners prior
975 * to returning.
976 *
977 * @throws SQLException if an error occurs
978 */
979 public void close() throws SQLException {
980 crsInternal.close();
981 }
982
983
984 /**
985 * Reports whether the last column read was SQL <code>NULL</code>.
986 * Note that you must first call the method <code>getXXX</code>
987 * on a column to try to read its value and then call the method
988 * <code>wasNull</code> to determine whether the value was
989 * SQL <code>NULL</code>.
990 *
991 * @return <code>true</code> if the value in the last column read
992 * was SQL <code>NULL</code>; <code>false</code> otherwise
993 * @throws SQLException if an error occurs
994 */
995 public boolean wasNull() throws SQLException {
996 return crsInternal.wasNull();
997 }
998
999 /**
1000 * Retrieves the value of the designated column in the current row
1001 * of this <code>JoinRowSetImpl</code> object as a
1002 * <code>String</code> object.
1003 *
1004 * @param columnIndex the first column is <code>1</code>, the second
1005 * is <code>2</code>, and so on; must be <code>1</code> or larger
1006 * and equal to or less than the number of columns in the rowset
1007 * @return the column value; if the value is SQL <code>NULL</code>, the
1008 * result is <code>null</code>
1009 * @throws SQLException if the given column index is out of bounds or
1010 * the cursor is not on a valid row
1011 */
1012 public String getString(int columnIndex) throws SQLException {
1013 return crsInternal.getString(columnIndex);
1014 }
1015
1016 /**
1017 * Retrieves the value of the designated column in the current row
1018 * of this <code>JoinRowSetImpl</code> object as a
1019 * <code>boolean</code> value.
1020 *
1021 * @param columnIndex the first column is <code>1</code>, the second
1022 * is <code>2</code>, and so on; must be <code>1</code> or larger
1023 * and equal to or less than the number of columns in the rowset
1024 * @return the column value; if the value is SQL <code>NULL</code>, the
1025 * result is <code>false</code>
1026 * @throws SQLException if the given column index is out of bounds,
1027 * the cursor is not on a valid row, or this method fails
1028 */
1029 public boolean getBoolean(int columnIndex) throws SQLException {
1030 return crsInternal.getBoolean(columnIndex);
1031 }
1032
1033 /**
1034 * Retrieves the value of the designated column in the current row
1035 * of this <code>JoinRowSetImpl</code> object as a
1036 * <code>byte</code> value.
1037 *
1038 * @param columnIndex the first column is <code>1</code>, the second
1039 * is <code>2</code>, and so on; must be <code>1</code> or larger
1040 * and equal to or less than the number of columns in the rowset
1041 * @return the column value; if the value is SQL <code>NULL</code>, the
1042 * result is <code>0</code>
1043 * @throws SQLException if the given column index is out of bounds,
1044 * the cursor is not on a valid row, or this method fails
1045 */
1046 public byte getByte(int columnIndex) throws SQLException {
1047 return crsInternal.getByte(columnIndex);
1048 }
1049
1050 /**
1051 * Retrieves the value of the designated column in the current row
1052 * of this <code>JoinRowSetImpl</code> object as a
1053 * <code>short</code> value.
1054 *
1055 * @param columnIndex the first column is <code>1</code>, the second
1056 * is <code>2</code>, and so on; must be <code>1</code> or larger
1057 * and equal to or less than the number of columns in the rowset
1058 * @return the column value; if the value is SQL <code>NULL</code>, the
1059 * result is <code>0</code>
1060 * @throws SQLException if the given column index is out of bounds,
1061 * the cursor is not on a valid row, or this method fails
1062 */
1063 public short getShort(int columnIndex) throws SQLException {
1064 return crsInternal.getShort(columnIndex);
1065 }
1066
1067 /**
1068 * Retrieves the value of the designated column in the current row
1069 * of this <code>JoinRowSetImpl</code> object as a
1070 * <code>short</code> value.
1071 *
1072 * @param columnIndex the first column is <code>1</code>, the second
1073 * is <code>2</code>, and so on; must be <code>1</code> or larger
1074 * and equal to or less than the number of columns in the rowset
1075 * @return the column value; if the value is SQL <code>NULL</code>, the
1076 * result is <code>0</code>
1077 * @throws SQLException if the given column index is out of bounds,
1078 * the cursor is not on a valid row, or this method fails
1079 */
1080 public int getInt(int columnIndex) throws SQLException {
1081 return crsInternal.getInt(columnIndex);
1082 }
1083
1084 /**
1085 * Retrieves the value of the designated column in the current row
1086 * of this <code>JoinRowSetImpl</code> object as a
1087 * <code>long</code> value.
1088 *
1089 * @param columnIndex the first column is <code>1</code>, the second
1090 * is <code>2</code>, and so on; must be <code>1</code> or larger
1091 * and equal to or less than the number of columns in the rowset
1092 * @return the column value; if the value is SQL <code>NULL</code>, the
1093 * result is <code>0</code>
1094 * @throws SQLException if the given column index is out of bounds,
1095 * the cursor is not on a valid row, or this method fails
1096 */
1097 public long getLong(int columnIndex) throws SQLException {
1098 return crsInternal.getLong(columnIndex);
1099 }
1100
1101 /**
1102 * Retrieves the value of the designated column in the current row
1103 * of this <code>JoinRowSetImpl</code> object as a
1104 * <code>float</code> value.
1105 *
1106 * @param columnIndex the first column is <code>1</code>, the second
1107 * is <code>2</code>, and so on; must be <code>1</code> or larger
1108 * and equal to or less than the number of columns in the rowset
1109 * @return the column value; if the value is SQL <code>NULL</code>, the
1110 * result is <code>0</code>
1111 * @throws SQLException if the given column index is out of bounds,
1112 * the cursor is not on a valid row, or this method fails
1113 */
1114 public float getFloat(int columnIndex) throws SQLException {
1115 return crsInternal.getFloat(columnIndex);
1116 }
1117
1118 /**
1119 * Retrieves the value of the designated column in the current row
1120 * of this <code>JoinRowSetImpl</code> object as a
1121 * <code>double</code> value.
1122 *
1123 * @param columnIndex the first column is <code>1</code>, the second
1124 * is <code>2</code>, and so on; must be <code>1</code> or larger
1125 * and equal to or less than the number of columns in the rowset
1126 * @return the column value; if the value is SQL <code>NULL</code>, the
1127 * result is <code>0</code>
1128 * @throws SQLException if the given column index is out of bounds,
1129 * the cursor is not on a valid row, or this method fails
1130 */
1131 public double getDouble(int columnIndex) throws SQLException {
1132 return crsInternal.getDouble(columnIndex);
1133 }
1134
1135 /**
1136 * Retrieves the value of the designated column in the current row
1137 * of this <code>JoinRowSetImpl</code> object as a
1138 * <code>java.math.BigDecimal</code> object.
1139 * <P>
1140 * This method is deprecated; use the version of <code>getBigDecimal</code>
1141 * that does not take a scale parameter and returns a value with full
1142 * precision.
1143 *
1144 * @param columnIndex the first column is <code>1</code>, the second
1145 * is <code>2</code>, and so on; must be <code>1</code> or larger
1146 * and equal to or less than the number of columns in the rowset
1147 * @param scale the number of digits to the right of the decimal point in the
1148 * value returned
1149 * @return the column value with the specified number of digits to the right
1150 * of the decimal point; if the value is SQL <code>NULL</code>, the
1151 * result is <code>null</code>
1152 * @throws SQLException if the given column index is out of bounds,
1153 * the cursor is not on a valid row, or this method fails
1154 * @deprecated
1155 */
1156 @Deprecated
1157 public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
1158 return crsInternal.getBigDecimal(columnIndex);
1159 }
1160
1161 /**
1162 * Retrieves the value of the designated column in the current row
1163 * of this <code>JoinRowSetImpl</code> object as a
1164 * <code>byte array</code> value.
1165 *
1166 * @param columnIndex the first column is <code>1</code>, the second
1167 * is <code>2</code>, and so on; must be <code>1</code> or larger
1168 * and equal to or less than the number of columns in the rowset
1169 * @return the column value; if the value is SQL <code>NULL</code>, the
1170 * result is <code>null</code>
1171 * @throws SQLException if the given column index is out of bounds,
1172 * the cursor is not on a valid row, or the value to be
1173 * retrieved is not binary
1174 */
1175 public byte[] getBytes(int columnIndex) throws SQLException {
1176 return crsInternal.getBytes(columnIndex);
1177 }
1178
1179 /**
1180 * Retrieves the value of the designated column in the current row
1181 * of this <code>JoinRowSetImpl</code> object as a
1182 * <code>java.sql.Date</code> object.
1183 *
1184 * @param columnIndex the first column is <code>1</code>, the second
1185 * is <code>2</code>, and so on; must be <code>1</code> 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</code>, the
1188 * result is <code>null</code>
1189 * @throws SQLException if the given column index is out of bounds,
1190 * the cursor is not on a valid row, or this method fails
1191 */
1192 public java.sql.Date getDate(int columnIndex) throws SQLException {
1193 return crsInternal.getDate(columnIndex);
1194 }
1195
1196 /**
1197 * Retrieves the value of the designated column in the current row
1198 * of this <code>JoinRowSetImpl</code> object as a
1199 * <code>java.sql.Time</code> object.
1200 *
1201 * @param columnIndex the first column is <code>1</code>, the second
1202 * is <code>2</code>, and so on; must be <code>1</code> or larger
1203 * and equal to or less than the number of columns in the rowset
1204 * @return the column value; if the value is SQL <code>NULL</code>, the
1205 * result is <code>null</code>
1206 * @throws SQLException if the given column index is out of bounds,
1207 * the cursor is not on a valid row, or this method fails
1208 */
1209 public java.sql.Time getTime(int columnIndex) throws SQLException {
1210 return crsInternal.getTime(columnIndex);
1211 }
1212
1213 /**
1214 * Retrieves the value of the designated column in the current row
1215 * of this <code>JoinRowSetImpl</code> object as a
1216 * <code>java.sql.Timestamp</code> object.
1217 *
1218 * @param columnIndex the first column is <code>1</code>, the second
1219 * is <code>2</code>, and so on; must be <code>1</code> or larger
1220 * and equal to or less than the number of columns in the rowset
1221 * @return the column value; if the value is SQL <code>NULL</code>, the
1222 * result is <code>null</code>
1223 * @throws SQLException if the given column index is out of bounds,
1224 * the cursor is not on a valid row, or this method fails
1225 */
1226 public java.sql.Timestamp getTimestamp(int columnIndex) throws SQLException {
1227 return crsInternal.getTimestamp(columnIndex);
1228 }
1229
1230 /**
1231 * Retrieves the value of the designated column in the current row
1232 * of this <code>JoinRowSetImpl</code> object as a
1233 * <code>java.sql.Timestamp</code> object.
1234 *
1235 * @param columnIndex the first column is <code>1</code>, the second
1236 * is <code>2</code>, and so on; must be <code>1</code> or larger
1237 * and equal to or less than the number of columns in the rowset
1238 * @return the column value; if the value is SQL <code>NULL</code>, the
1239 * result is <code>null</code>
1240 * @throws SQLException if the given column index is out of bounds,
1241 * the cursor is not on a valid row, or this method fails
1242 */
1243 public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException {
1244 return crsInternal.getAsciiStream(columnIndex);
1245 }
1246
1247 /**
1248 * A column value can be retrieved as a stream of Unicode characters
1249 * and then read in chunks from the stream. This method is particularly
1250 * suitable for retrieving large LONGVARCHAR values. The JDBC driver will
1251 * do any necessary conversion from the database format into Unicode.
1252 *
1253 * <P><B>Note:</B> All the data in the returned stream must be
1254 * read prior to getting the value of any other column. The next
1255 * call to a get method implicitly closes the stream. . Also, a
1256 * stream may return 0 for available() whether there is data
1257 * available or not.
1258 *
1259 * @param columnIndex the first column is <code>1</code>, the second
1260 * is <code>2</code>, and so on; must be <code>1</code> or larger
1261 * and equal to or less than the number of columns in this rowset
1262 * @return a Java input stream that delivers the database column value
1263 * as a stream of two byte Unicode characters. If the value is SQL NULL
1264 * then the result is null.
1265 * @throws SQLException if an error occurs
1266 * @deprecated
1267 */
1268 @Deprecated
1269 public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException {
1270 return crsInternal.getUnicodeStream(columnIndex);
1271 }
1272
1273 /**
1274 * A column value can be retrieved as a stream of uninterpreted bytes
1275 * and then read in chunks from the stream. This method is particularly
1276 * suitable for retrieving large LONGVARBINARY values.
1277 *
1278 * <P><B>Note:</B> All the data in the returned stream must be
1279 * read prior to getting the value of any other column. The next
1280 * call to a get method implicitly closes the stream. Also, a
1281 * stream may return 0 for available() whether there is data
1282 * available or not.
1283 *
1284 * @param columnIndex the first column is <code>1</code>, the second
1285 * is <code>2</code>, and so on; must be <code>1</code> or larger
1286 * and equal to or less than the number of columns in the rowset
1287 * @return a Java input stream that delivers the database column value
1288 * as a stream of uninterpreted bytes. If the value is SQL NULL
1289 * then the result is null.
1290 * @throws SQLException if an error occurs
1291 */
1292 public java.io.InputStream getBinaryStream(int columnIndex) throws SQLException {
1293 return crsInternal.getBinaryStream(columnIndex);
1294 }
1295
1296 // ColumnName methods
1297
1298 /**
1299 * Retrieves the value stored in the designated column
1300 * of the current row as a <code>String</code> object.
1301 *
1302 * @param columnName a <code>String</code> object giving the SQL name of
1303 * a column in this <code>JoinRowSetImpl</code> object
1304 * @return the column value; if the value is SQL <code>NULL</code>,
1305 * the result is <code>null</code>
1306 * @throws SQLException if the given column name does not match one of
1307 * this rowset's column names or the cursor is not on one of
1308 * this rowset's rows or its insert row
1309 */
1310 public String getString(String columnName) throws SQLException {
1311 return crsInternal.getString(columnName);
1312 }
1313
1314 /**
1315 * Retrieves the value stored in the designated column
1316 * of the current row as a <code>boolean</code> value.
1317 *
1318 * @param columnName a <code>String</code> object giving the SQL name of
1319 * a column in this <code>JoinRowSetImpl</code> object
1320 * @return the column value; if the value is SQL <code>NULL</code>,
1321 * the result is <code>false</code>
1322 * @throws SQLException if the given column name does not match one of
1323 * this rowset's column names or the cursor is not on one of
1324 * this rowset's rows or its insert row
1325 */
1326 public boolean getBoolean(String columnName) throws SQLException {
1327 return crsInternal.getBoolean(columnName);
1328 }
1329
1330 /**
1331 * Retrieves the value stored in the designated column
1332 * of the current row as a <code>byte</code> value.
1333 *
1334 * @param columnName a <code>String</code> object giving the SQL name of
1335 * a column in this <code>JoinRowSetImpl</code> object
1336 * @return the column value; if the value is SQL <code>NULL</code>,
1337 * the result is <code>0</code>
1338 * @throws SQLException if the given column name does not match one of
1339 * this rowset's column names or the cursor is not on one of
1340 * this rowset's rows or its insert row
1341 */
1342 public byte getByte(String columnName) throws SQLException {
1343 return crsInternal.getByte(columnName);
1344 }
1345
1346 /**
1347 * Retrieves the value stored in the designated column
1348 * of the current row as a <code>short</code> value.
1349 *
1350 * @param columnName a <code>String</code> object giving the SQL name of
1351 * a column in this <code>JoinRowSetImpl</code> object
1352 * @return the column value; if the value is SQL <code>NULL</code>,
1353 * the result is <code>0</code>
1354 * @throws SQLException if the given column name does not match one of
1355 * this rowset's column names or the cursor is not on one of
1356 * this rowset's rows or its insert row
1357 */
1358 public short getShort(String columnName) throws SQLException {
1359 return crsInternal.getShort(columnName);
1360 }
1361
1362 /**
1363 * Retrieves the value stored in the designated column
1364 * of the current row as an <code>int</code> value.
1365 *
1366 * @param columnName a <code>String</code> object giving the SQL name of
1367 * a column in this <code>JoinRowSetImpl</code> object
1368 * @return the column value; if the value is SQL <code>NULL</code>,
1369 * the result is <code>0</code>
1370 * @throws SQLException if the given column name does not match one of
1371 * this rowset's column names or the cursor is not on one of
1372 * this rowset's rows or its insert row
1373 */
1374 public int getInt(String columnName) throws SQLException {
1375 return crsInternal.getInt(columnName);
1376 }
1377
1378 /**
1379 * Retrieves the value stored in the designated column
1380 * of the current row as a <code>long</code> value.
1381 *
1382 * @param columnName a <code>String</code> object giving the SQL name of
1383 * a column in this <code>JoinRowSetImpl</code> object
1384 * @return the column value; if the value is SQL <code>NULL</code>,
1385 * the result is <code>0</code>
1386 * @throws SQLException if the given column name does not match one of
1387 * this rowset's column names or the cursor is not on one of
1388 * this rowset's rows or its insert row
1389 */
1390 public long getLong(String columnName) throws SQLException {
1391 return crsInternal.getLong(columnName);
1392 }
1393
1394 /**
1395 * Retrieves the value stored in the designated column
1396 * of the current row as a <code>float</code> value.
1397 *
1398 * @param columnName a <code>String</code> object giving the SQL name of
1399 * a column in this <code>JoinRowSetImpl</code> object
1400 * @return the column value; if the value is SQL <code>NULL</code>,
1401 * the result is <code>0</code>
1402 * @throws SQLException if the given column name does not match one of
1403 * this rowset's column names or the cursor is not on one of
1404 * this rowset's rows or its insert row
1405 */
1406 public float getFloat(String columnName) throws SQLException {
1407 return crsInternal.getFloat(columnName);
1408 }
1409
1410 /**
1411 * Retrieves the value stored in the designated column
1412 * of the current row as a <code>double</code> value.
1413 *
1414 * @param columnName a <code>String</code> object giving the SQL name of
1415 * a column in this <code>JoinRowSetImpl</code> object
1416 * @return the column value; if the value is SQL <code>NULL</code>,
1417 * the result is <code>0</code>
1418 * @throws SQLException if the given column name does not match one of
1419 * this rowset's column names or the cursor is not on one of
1420 * this rowset's rows or its insert row
1421 */
1422 public double getDouble(String columnName) throws SQLException {
1423 return crsInternal.getDouble(columnName);
1424 }
1425
1426 /**
1427 * Retrieves the value stored in the designated column
1428 * of the current row as a <code>java.math.BigDecimal</code> object.
1429 *
1430 * @param columnName a <code>String</code> object giving the SQL name of
1431 * a column in this <code>JoinRowSetImpl</code> object
1432 * @param scale the number of digits to the right of the decimal point
1433 * @return the column value; if the value is SQL <code>NULL</code>,
1434 * the result is <code>null</code>
1435 * @throws SQLException if the given column name does not match one of
1436 * this rowset's column names or the cursor is not on one of
1437 * this rowset's rows or its insert row
1438 * @deprecated use the method <code>getBigDecimal(String columnName)</code>
1439 * instead
1440 */
1441 @Deprecated
1442 public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException {
1443 return crsInternal.getBigDecimal(columnName);
1444 }
1445
1446 /**
1447 * Retrieves the value stored in the designated column
1448 * of the current row as a byte array.
1449 * The bytes represent the raw values returned by the driver.
1450 *
1451 * @param columnName a <code>String</code> object giving the SQL name of
1452 * a column in this <code>JoinRowSetImpl</code> object
1453 * @return the column value; if the value is SQL <code>NULL</code>,
1454 * the result is <code>null</code>
1455 * @throws SQLException if the given column name does not match one of
1456 * this rowset's column names or the cursor is not on one of
1457 * this rowset's rows or its insert row
1458 */
1459 public byte[] getBytes(String columnName) throws SQLException {
1460 return crsInternal.getBytes(columnName);
1461 }
1462
1463 /**
1464 * Retrieves the value stored in the designated column
1465 * of the current row as a <code>java.sql.Date</code> object.
1466 *
1467 * @param columnName a <code>String</code> object giving the SQL name of
1468 * a column in this <code>JoinRowSetImpl</code> object
1469 * @return the column value; if the value is SQL <code>NULL</code>,
1470 * the result is <code>null</code>
1471 * @throws SQLException if the given column name does not match one of
1472 * this rowset's column names or the cursor is not on one of
1473 * this rowset's rows or its insert row
1474 */
1475 public java.sql.Date getDate(String columnName) throws SQLException {
1476 return crsInternal.getDate(columnName);
1477 }
1478
1479 /**
1480 * Retrieves the value stored in the designated column
1481 * of the current row as a <code>java.sql.Time</code> object.
1482 *
1483 * @param columnName a <code>String</code> object giving the SQL name of
1484 * a column in this <code>JoinRowSetImpl</code> object
1485 * @return the column value; if the value is SQL <code>NULL</code>,
1486 * the result is <code>null</code>
1487 * @throws SQLException if the given column name does not match one of
1488 * this rowset's column names or the cursor is not on one of
1489 * this rowset's rows or its insert row
1490 */
1491 public java.sql.Time getTime(String columnName) throws SQLException {
1492 return crsInternal.getTime(columnName);
1493 }
1494
1495 /**
1496 * Retrieves the value stored in the designated column
1497 * of the current row as a <code>java.sql.Timestamp</code> object.
1498 *
1499 * @param columnName a <code>String</code> object giving the SQL name of
1500 * a column in this <code>JoinRowSetImpl</code> object
1501 * @return the column value; if the value is SQL <code>NULL</code>,
1502 * the result is <code>null</code>
1503 * @throws SQLException if the given column name does not match one of
1504 * this rowset's column names or the cursor is not on one of
1505 * this rowset's rows or its insert row
1506 */
1507 public java.sql.Timestamp getTimestamp(String columnName) throws SQLException {
1508 return crsInternal.getTimestamp(columnName);
1509 }
1510
1511 /**
1512 * This method is not supported, and it will throw an
1513 * <code>UnsupportedOperationException</code> if it is called.
1514 * <P>
1515 * A column value can be retrieved as a stream of ASCII characters
1516 * and then read in chunks from the stream. This method is particularly
1517 * suitable for retrieving large LONGVARCHAR values. The JDBC driver will
1518 * do any necessary conversion from the database format into ASCII format.
1519 *
1520 * <P><B>Note:</B> All the data in the returned stream must
1521 * be read prior to getting the value of any other column. The
1522 * next call to a <code>getXXX</code> method implicitly closes the stream.
1523 *
1524 * @param columnName a <code>String</code> object giving the SQL name of
1525 * a column in this <code>JoinRowSetImpl</code> object
1526 * @return a Java input stream that delivers the database column value
1527 * as a stream of one-byte ASCII characters. If the value is SQL
1528 * <code>NULL</code>, the result is <code>null</code>.
1529 * @throws UnsupportedOperationException if this method is called
1530 */
1531 public java.io.InputStream getAsciiStream(String columnName) throws SQLException {
1532 return crsInternal.getAsciiStream(columnName);
1533 }
1534
1535 /**
1536 * Retrieves the value stored in the designated column
1537 * of the current row as a <code>java.io.InputStream</code> object.
1538 * A column value can be retrieved as a stream of Unicode characters
1539 * and then read in chunks from the stream. This method is particularly
1540 * suitable for retrieving large <code>LONGVARCHAR</code> values.
1541 * The JDBC driver will do any necessary conversion from the database
1542 * format into Unicode.
1543 *
1544 * <P><B>Note:</B> All the data in the returned stream must
1545 * be read prior to getting the value of any other column. The
1546 * next call to a <code>getXXX</code> method implicitly closes the stream.
1547 *
1548 * @param columnName a <code>String</code> object giving the SQL name of
1549 * a column in this <code>JoinRowSetImpl</code> object
1550 * @return a Java input stream that delivers the database column value
1551 * as a stream of two-byte Unicode characters. If the value is
1552 * SQL <code>NULL</code>, the result is <code>null</code>.
1553 * @throws SQLException if the given column name does not match one of
1554 * this rowset's column names or the cursor is not on one of
1555 * this rowset's rows or its insert row
1556 * @deprecated use the method <code>getCharacterStream</code> instead
1557 */
1558 @Deprecated
1559 public java.io.InputStream getUnicodeStream(String columnName) throws SQLException {
1560 return crsInternal.getUnicodeStream(columnName);
1561 }
1562
1563 /**
1564 * Retrieves the value stored in the designated column
1565 * of the current row as a <code>java.io.InputStream</code> object.
1566 * A column value can be retrieved as a stream of uninterpreted bytes
1567 * and then read in chunks from the stream. This method is particularly
1568 * suitable for retrieving large <code>LONGVARBINARY</code> values.
1569 *
1570 * <P><B>Note:</B> All the data in the returned stream must
1571 * be read prior to getting the value of any other column. The
1572 * next call to a get method implicitly closes the stream.
1573 *
1574 * @param columnName a <code>String</code> object giving the SQL name of
1575 * a column in this <code>JoinRowSetImpl</code> object
1576 * @return a Java input stream that delivers the database column value
1577 * as a stream of uninterpreted bytes. If the value is SQL
1578 * <code>NULL</code>, the result is <code>null</code>.
1579 * @throws SQLException if the given column name does not match one of
1580 * this rowset's column names or the cursor is not on one of
1581 * this rowset's rows or its insert row
1582 */
1583 public java.io.InputStream getBinaryStream(String columnName) throws SQLException {
1584 return crsInternal.getBinaryStream(columnName);
1585 }
1586
1587 /* The first warning reported by calls on this <code>JoinRowSetImpl</code>
1588 * object is returned. Subsequent <code>JoinRowSetImpl</code> warnings will
1589 * be chained to this <code>SQLWarning</code>.
1590 *
1591 * <P>The warning chain is automatically cleared each time a new
1592 * row is read.
1593 *
1594 * <P><B>Note:</B> This warning chain only covers warnings caused
1595 * by <code>ResultSet</code> methods. Any warning caused by statement
1596 * methods (such as reading OUT parameters) will be chained on the
1597 * <code>Statement</code> object.
1598 *
1599 * @return the first SQLWarning or null
1600 * @throws UnsupportedOperationException if this method is called
1601 */
1602 public SQLWarning getWarnings() {
1603 return crsInternal.getWarnings();
1604 }
1605
1606 /**
1607 * Throws an <code>UnsupportedOperationException</code> if called.
1608 * <P>
1609 * After a call to this method, the <code>getWarnings</code> method
1610 * returns <code>null</code> until a new warning is reported for this
1611 * <code>JoinRowSetImpl</code> object.
1612 *
1613 * @throws UnsupportedOperationException if this method is called
1614 */
1615 public void clearWarnings() {
1616 crsInternal.clearWarnings();
1617 }
1618
1619 /**
1620 * Retrieves the name of the SQL cursor used by this
1621 * <code>JoinRowSetImpl</code> object.
1622 *
1623 * <P>In SQL, a result table is retrieved through a cursor that is
1624 * named. The current row of a result can be updated or deleted
1625 * using a positioned update/delete statement that references the
1626 * cursor name. To insure that the cursor has the proper isolation
1627 * level to support an update operation, the cursor's <code>SELECT</code>
1628 * statement should be of the form 'select for update'. If the 'for update'
1629 * clause is omitted, positioned updates may fail.
1630 *
1631 * <P>JDBC supports this SQL feature by providing the name of the
1632 * SQL cursor used by a <code>ResultSet</code> object. The current row
1633 * of a result set is also the current row of this SQL cursor.
1634 *
1635 * <P><B>Note:</B> If positioned updates are not supported, an
1636 * <code>SQLException</code> is thrown.
1637 *
1638 * @return the SQL cursor name for this <code>JoinRowSetImpl</code> object's
1639 * cursor
1640 * @throws SQLException if an error occurs
1641 */
1642 public String getCursorName() throws SQLException {
1643 return crsInternal.getCursorName();
1644 }
1645
1646 /**
1647 * Retrieves the <code>ResultSetMetaData</code> object that contains
1648 * information about this <code>CachedRowsSet</code> object. The
1649 * information includes the number of columns, the data type for each
1650 * column, and other properties for each column.
1651 *
1652 * @return the <code>ResultSetMetaData</code> object that describes this
1653 * <code>JoinRowSetImpl</code> object's columns
1654 * @throws SQLException if an error occurs
1655 */
1656 public ResultSetMetaData getMetaData() throws SQLException {
1657 return crsInternal.getMetaData();
1658 }
1659
1660 /**
1661 * Retrieves the value of the designated column in the current row
1662 * of this <code>JoinRowSetImpl</code> object as an
1663 * <code>Object</code> value.
1664 * <P>
1665 * The type of the <code>Object</code> will be the default
1666 * Java object type corresponding to the column's SQL type,
1667 * following the mapping for built-in types specified in the JDBC
1668 * specification.
1669 * <P>
1670 * This method may also be used to read datatabase-specific
1671 * abstract data types.
1672 * <P>
1673 * This implementation of the method <code>getObject</code> extends its
1674 * behavior so that it gets the attributes of an SQL structured type as
1675 * as an array of <code>Object</code> values. This method also custom
1676 * maps SQL user-defined types to classes in the Java programming language.
1677 * When the specified column contains
1678 * a structured or distinct value, the behavior of this method is as
1679 * if it were a call to the method <code>getObject(columnIndex,
1680 * this.getStatement().getConnection().getTypeMap())</code>.
1681 *
1682 * @param columnIndex the first column is <code>1</code>, the second
1683 * is <code>2</code>, and so on; must be <code>1</code> or larger
1684 * and equal to or less than the number of columns in the rowset
1685 * @return a <code>java.lang.Object</code> holding the column value;
1686 * if the value is SQL <code>NULL</code>, the result is <code>null</code>
1687 * @throws SQLException if the given column index is out of bounds,
1688 * the cursor is not on a valid row, or there is a problem getting
1689 * the <code>Class</code> object for a custom mapping
1690 * @since 1.2
1691 */
1692 public Object getObject(int columnIndex) throws SQLException {
1693 return crsInternal.getObject(columnIndex);
1694 }
1695
1696 /**
1697 * Retrieves the value of the designated column in the current row
1698 * of this <code>JoinRowSetImpl</code> object as an
1699 * <code>Object</code> value.
1700 * <P>
1701 * The type of the <code>Object</code> will be the default
1702 * Java object type corresponding to the column's SQL type,
1703 * following the mapping for built-in types specified in the JDBC
1704 * specification.
1705 * <P>
1706 * This method may also be used to read datatabase-specific
1707 * abstract data types.
1708 * <P>
1709 * This implementation of the method <code>getObject</code> extends its
1710 * behavior so that it gets the attributes of an SQL structured type as
1711 * as an array of <code>Object</code> values. This method also custom
1712 * maps SQL user-defined types to classes
1713 * in the Java programming language. When the specified column contains
1714 * a structured or distinct value, the behavior of this method is as
1715 * if it were a call to the method <code>getObject(columnIndex,
1716 * this.getStatement().getConnection().getTypeMap())</code>.
1717 *
1718 * @param columnIndex the first column is <code>1</code>, the second
1719 * is <code>2</code>, and so on; must be <code>1</code> or larger
1720 * and equal to or less than the number of columns in the rowset
1721 * @param map a <code>java.util.Map</code> object showing the mapping
1722 * from SQL type names to classes in the Java programming
1723 * language
1724 * @return a <code>java.lang.Object</code> holding the column value;
1725 * if the value is SQL <code>NULL</code>, the result is
1726 * <code>null</code>
1727 * @throws SQLException if (1) the given column name does not match
1728 * one of this rowset's column names, (2) the cursor is not
1729 * on a valid row, or (3) there is a problem getting
1730 * the <code>Class</code> object for a custom mapping
1731 */
1732 public Object getObject(int columnIndex,
1733 java.util.Map<String,Class<?>> map)
1734 throws SQLException {
1735 return crsInternal.getObject(columnIndex, map);
1736 }
1737
1738 /**
1739 * Retrieves the value of the designated column in the current row
1740 * of this <code>JoinRowSetImpl</code> object as an
1741 * <code>Object</code> value.
1742 * <P>
1743 * The type of the <code>Object</code> will be the default
1744 * Java object type corresponding to the column's SQL type,
1745 * following the mapping for built-in types specified in the JDBC
1746 * specification.
1747 * <P>
1748 * This method may also be used to read datatabase-specific
1749 * abstract data types.
1750 * <P>
1751 * This implementation of the method <code>getObject</code> extends its
1752 * behavior so that it gets the attributes of an SQL structured type as
1753 * as an array of <code>Object</code> values. This method also custom
1754 * maps SQL user-defined types to classes
1755 * in the Java programming language. When the specified column contains
1756 * a structured or distinct value, the behavior of this method is as
1757 * if it were a call to the method <code>getObject(columnIndex,
1758 * this.getStatement().getConnection().getTypeMap())</code>.
1759 *
1760 * @param columnName a <code>String</code> object that must match the
1761 * SQL name of a column in this rowset, ignoring case
1762 * @return a <code>java.lang.Object</code> holding the column value;
1763 * if the value is SQL <code>NULL</code>, the result is
1764 * <code>null</code>
1765 * @throws SQLException if (1) the given column name does not match
1766 * one of this rowset's column names, (2) the cursor is not
1767 * on a valid row, or (3) there is a problem getting
1768 * the <code>Class</code> object for a custom mapping
1769 */
1770 public Object getObject(String columnName) throws SQLException {
1771 return crsInternal.getObject(columnName);
1772 }
1773
1774 /**
1775 * Retrieves the value of the designated column in this
1776 * <code>JoinRowSetImpl</code> object as an <code>Object</code> in
1777 * the Java programming lanugage, using the given
1778 * <code>java.util.Map</code> object to custom map the value if
1779 * appropriate.
1780 *
1781 * @param columnName a <code>String</code> object that must match the
1782 * SQL name of a column in this rowset, ignoring case
1783 * @param map a <code>java.util.Map</code> object showing the mapping
1784 * from SQL type names to classes in the Java programming
1785 * language
1786 * @return an <code>Object</code> representing the SQL value
1787 * @throws SQLException if the given column index is out of bounds or
1788 * the cursor is not on one of this rowset's rows or its
1789 * insert row
1790 */
1791 public Object getObject(String columnName,
1792 java.util.Map<String,Class<?>> map)
1793 throws SQLException {
1794 return crsInternal.getObject(columnName, map);
1795 }
1796
1797 /**
1798 * Retrieves the value stored in the designated column
1799 * of the current row as a <code>java.io.Reader</code> object.
1800 *
1801 * <P><B>Note:</B> All the data in the returned stream must
1802 * be read prior to getting the value of any other column. The
1803 * next call to a <code>getXXX</code> method implicitly closes the stream.
1804 *
1805 * @param columnIndex the first column is <code>1</code>, the second
1806 * is <code>2</code>, and so on; must be <code>1</code> or larger
1807 * and equal to or less than the number of columns in the rowset
1808 * @return a Java character stream that delivers the database column value
1809 * as a <code>java.io.Reader</code> object. If the value is
1810 * SQL <code>NULL</code>, the result is <code>null</code>.
1811 * @throws SQLException if the given column index is out of bounds,
1812 * the cursor is not on a valid row, or there is a type mismatch
1813 */
1814 public java.io.Reader getCharacterStream(int columnIndex) throws SQLException {
1815 return crsInternal.getCharacterStream(columnIndex);
1816 }
1817
1818 /**
1819 * Retrieves the value stored in the designated column
1820 * of the current row as a <code>java.io.Reader</code> object.
1821 *
1822 * <P><B>Note:</B> All the data in the returned stream must
1823 * be read prior to getting the value of any other column. The
1824 * next call to a <code>getXXX</code> method implicitly closes the stream.
1825 *
1826 * @param columnName a <code>String</code> object giving the SQL name of
1827 * a column in this <code>JoinRowSetImpl</code> object
1828 * @return a Java input stream that delivers the database column value
1829 * as a stream of two-byte Unicode characters. If the value is
1830 * SQL <code>NULL</code>, the result is <code>null</code>.
1831 * @throws SQLException if the given column index is out of bounds,
1832 * the cursor is not on a valid row, or there is a type mismatch
1833 */
1834 public java.io.Reader getCharacterStream(String columnName) throws SQLException {
1835 return crsInternal.getCharacterStream(columnName);
1836 }
1837
1838 /**
1839 * Retrieves the value of the designated column in the current row
1840 * of this <code>JoinRowSetImpl</code> object as a
1841 * <code>java.math.BigDecimal</code> object.
1842 *
1843 * @param columnIndex the first column is <code>1</code>, the second
1844 * is <code>2</code>, and so on; must be <code>1</code> or larger
1845 * and equal to or less than the number of columns in the rowset
1846 * @return a <code>java.math.BigDecimal</code> value with full precision;
1847 * if the value is SQL <code>NULL</code>, the result is <code>null</code>
1848 * @throws SQLException if the given column index is out of bounds,
1849 * the cursor is not on a valid row, or this method fails
1850 */
1851 public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
1852 return crsInternal.getBigDecimal(columnIndex);
1853 }
1854
1855 /**
1856 * Retrieves the value of the designated column in the current row
1857 * of this <code>JoinRowSetImpl</code> object as a
1858 * <code>java.math.BigDecimal</code> object.
1859 *
1860 * @param columnName a <code>String</code> object that must match the
1861 * SQL name of a column in this rowset, ignoring case
1862 * @return a <code>java.math.BigDecimal</code> value with full precision;
1863 * if the value is SQL <code>NULL</code>, the result is <code>null</code>
1864 * @throws SQLException if the given column index is out of bounds,
1865 * the cursor is not on a valid row, or this method fails
1866 */
1867 public BigDecimal getBigDecimal(String columnName) throws SQLException {
1868 return crsInternal.getBigDecimal(columnName);
1869 }
1870
1871 /**
1872 * Returns the number of rows in this <code>JoinRowSetImpl</code> object.
1873 *
1874 * @return number of rows in the rowset
1875 */
1876 public int size() {
1877 return crsInternal.size();
1878 }
1879
1880 /**
1881 * Indicates whether the cursor is before the first row in this
1882 * <code>JoinRowSetImpl</code> object.
1883 *
1884 * @return <code>true</code> if the cursor is before the first row;
1885 * <code>false</code> otherwise or if the rowset contains no rows
1886 * @throws SQLException if an error occurs
1887 */
1888 public boolean isBeforeFirst() throws SQLException {
1889 return crsInternal.isBeforeFirst();
1890 }
1891
1892 /**
1893 * Indicates whether the cursor is after the last row in this
1894 * <code>JoinRowSetImpl</code> object.
1895 *
1896 * @return <code>true</code> if the cursor is after the last row;
1897 * <code>false</code> otherwise or if the rowset contains no rows
1898 * @throws SQLException if an error occurs
1899 */
1900 public boolean isAfterLast() throws SQLException {
1901 return crsInternal.isAfterLast();
1902 }
1903
1904 /**
1905 * Indicates whether the cursor is on the first row in this
1906 * <code>JoinRowSetImpl</code> object.
1907 *
1908 * @return <code>true</code> if the cursor is on the first row;
1909 * <code>false</code> otherwise or if the rowset contains no rows
1910 * @throws SQLException if an error occurs
1911 */
1912 public boolean isFirst() throws SQLException {
1913 return crsInternal.isFirst();
1914 }
1915
1916 /**
1917 * Indicates whether the cursor is on the last row in this
1918 * <code>JoinRowSetImpl</code> object.
1919 * <P>
1920 * Note: Calling the method <code>isLast</code> may be expensive
1921 * because the JDBC driver might need to fetch ahead one row in order
1922 * to determine whether the current row is the last row in this rowset.
1923 *
1924 * @return <code>true</code> if the cursor is on the last row;
1925 * <code>false</code> otherwise or if this rowset contains no rows
1926 * @throws SQLException if an error occurs
1927 */
1928 public boolean isLast() throws SQLException {
1929 return crsInternal.isLast();
1930 }
1931
1932 /**
1933 * Moves this <code>JoinRowSetImpl</code> object's cursor to the front of
1934 * the rowset, just before the first row. This method has no effect if
1935 * this rowset contains no rows.
1936 *
1937 * @throws SQLException if an error occurs or the type of this rowset
1938 * is <code>ResultSet.TYPE_FORWARD_ONLY</code>
1939 */
1940 public void beforeFirst() throws SQLException {
1941 crsInternal.beforeFirst();
1942 }
1943
1944 /**
1945 * Moves this <code>JoinRowSetImpl</code> object's cursor to the end of
1946 * the rowset, just after the last row. This method has no effect if
1947 * this rowset contains no rows.
1948 *
1949 * @throws SQLException if an error occurs
1950 */
1951 public void afterLast() throws SQLException {
1952 crsInternal.afterLast();
1953 }
1954
1955 /**
1956 * Moves this <code>JoinRowSetImpl</code> object's cursor to the first row
1957 * and returns <code>true</code> if the operation was successful. This
1958 * method also notifies registered listeners that the cursor has moved.
1959 *
1960 * @return <code>true</code> if the cursor is on a valid row;
1961 * <code>false</code> otherwise or if there are no rows in this
1962 * <code>JoinRowSetImpl</code> object
1963 * @throws SQLException if the type of this rowset
1964 * is <code>ResultSet.TYPE_FORWARD_ONLY</code>
1965 */
1966 public boolean first() throws SQLException {
1967 return crsInternal.first();
1968 }
1969
1970
1971 /**
1972 * Moves this <code>JoinRowSetImpl</code> object's cursor to the last row
1973 * and returns <code>true</code> if the operation was successful. This
1974 * method also notifies registered listeners that the cursor has moved.
1975 *
1976 * @return <code>true</code> if the cursor is on a valid row;
1977 * <code>false</code> otherwise or if there are no rows in this
1978 * <code>JoinRowSetImpl</code> object
1979 * @throws SQLException if the type of this rowset
1980 * is <code>ResultSet.TYPE_FORWARD_ONLY</code>
1981 */
1982 public boolean last() throws SQLException {
1983 return crsInternal.last();
1984 }
1985
1986 /**
1987 * Returns the number of the current row in this <code>JoinRowSetImpl</code>
1988 * object. The first row is number 1, the second number 2, and so on.
1989 *
1990 * @return the number of the current row; <code>0</code> if there is no
1991 * current row
1992 * @throws SQLException if an error occurs
1993 */
1994 public int getRow() throws SQLException {
1995 return crsInternal.getRow();
1996 }
1997
1998 /**
1999 * Moves this <code>JoinRowSetImpl</code> object's cursor to the row number
2000 * specified.
2001 *
2002 * <p>If the number is positive, the cursor moves to an absolute row with
2003 * respect to the beginning of the rowset. The first row is row 1, the second
2004 * is row 2, and so on. For example, the following command, in which
2005 * <code>crs</code> is a <code>JoinRowSetImpl</code> object, moves the cursor
2006 * to the fourth row, starting from the beginning of the rowset.
2007 * <PRE><code>
2008 *
2009 * crs.absolute(4);
2010 *
2011 * </code> </PRE>
2012 * <P>
2013 * If the number is negative, the cursor moves to an absolute row position
2014 * with respect to the end of the rowset. For example, calling
2015 * <code>absolute(-1)</code> positions the cursor on the last row,
2016 * <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
2017 * If the <code>JoinRowSetImpl</code> object <code>crs</code> has five rows,
2018 * the following command moves the cursor to the fourth-to-last row, which
2019 * in the case of a rowset with five rows, is also the second row, counting
2020 * from the beginning.
2021 * <PRE><code>
2022 *
2023 * crs.absolute(-4);
2024 *
2025 * </code> </PRE>
2026 *
2027 * If the number specified is larger than the number of rows, the cursor
2028 * will move to the position after the last row. If the number specified
2029 * would move the cursor one or more rows before the first row, the cursor
2030 * moves to the position before the first row.
2031 * <P>
2032 * Note: Calling <code>absolute(1)</code> is the same as calling the
2033 * method <code>first()</code>. Calling <code>absolute(-1)</code> is the
2034 * same as calling <code>last()</code>.
2035 *
2036 * @param row a positive number to indicate the row, starting row numbering from
2037 * the first row, which is <code>1</code>; a negative number to indicate
2038 * the row, starting row numbering from the last row, which is
2039 * <code>-1</code>; must not be <code>0</code>
2040 * @return <code>true</code> if the cursor is on the rowset; <code>false</code>
2041 * otherwise
2042 * @throws SQLException if the given cursor position is <code>0</code> or the
2043 * type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
2044 */
2045 public boolean absolute(int row) throws SQLException {
2046 return crsInternal.absolute(row);
2047 }
2048
2049 /**
2050 * Moves the cursor the specified number of rows from the current
2051 * position, with a positive number moving it forward and a
2052 * negative number moving it backward.
2053 * <P>
2054 * If the number is positive, the cursor moves the specified number of
2055 * rows toward the end of the rowset, starting at the current row.
2056 * For example, the following command, in which
2057 * <code>crs</code> is a <code>JoinRowSetImpl</code> object with 100 rows,
2058 * moves the cursor forward four rows from the current row. If the
2059 * current row is 50, the cursor would move to row 54.
2060 * <PRE><code>
2061 *
2062 * crs.relative(4);
2063 *
2064 * </code> </PRE>
2065 * <P>
2066 * If the number is negative, the cursor moves back toward the beginning
2067 * the specified number of rows, starting at the current row.
2068 * For example, calling the method
2069 * <code>absolute(-1)</code> positions the cursor on the last row,
2070 * <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
2071 * If the <code>JoinRowSetImpl</code> object <code>crs</code> has five rows,
2072 * the following command moves the cursor to the fourth-to-last row, which
2073 * in the case of a rowset with five rows, is also the second row
2074 * from the beginning.
2075 * <PRE><code>
2076 *
2077 * crs.absolute(-4);
2078 *
2079 * </code> </PRE>
2080 *
2081 * If the number specified is larger than the number of rows, the cursor
2082 * will move to the position after the last row. If the number specified
2083 * would move the cursor one or more rows before the first row, the cursor
2084 * moves to the position before the first row. In both cases, this method
2085 * throws an <code>SQLException</code>.
2086 * <P>
2087 * Note: Calling <code>absolute(1)</code> is the same as calling the
2088 * method <code>first()</code>. Calling <code>absolute(-1)</code> is the
2089 * same as calling <code>last()</code>. Calling <code>relative(0)</code>
2090 * is valid, but it does not change the cursor position.
2091 *
2092 * @param rows an <code>int</code> indicating the number of rows to move
2093 * the cursor, starting at the current row; a positive number
2094 * moves the cursor forward; a negative number moves the cursor
2095 * backward; must not move the cursor past the valid
2096 * rows
2097 * @return <code>true</code> if the cursor is on a row in this
2098 * <code>JoinRowSetImpl</code> object; <code>false</code>
2099 * otherwise
2100 * @throws SQLException if there are no rows in this rowset, the cursor is
2101 * positioned either before the first row or after the last row, or
2102 * the rowset is type <code>ResultSet.TYPE_FORWARD_ONLY</code>
2103 */
2104 public boolean relative(int rows) throws SQLException {
2105 return crsInternal.relative(rows);
2106 }
2107
2108 /**
2109 * Moves this <code>JoinRowSetImpl</code> object's cursor to the
2110 * previous row and returns <code>true</code> if the cursor is on
2111 * a valid row or <code>false</code> if it is not.
2112 * This method also notifies all listeners registered with this
2113 * <code>JoinRowSetImpl</code> object that its cursor has moved.
2114 * <P>
2115 * Note: calling the method <code>previous()</code> is not the same
2116 * as calling the method <code>relative(-1)</code>. This is true
2117 * because it is possible to call <code>previous()</code> from the insert
2118 * row, from after the last row, or from the current row, whereas
2119 * <code>relative</code> may only be called from the current row.
2120 * <P>
2121 * The method <code>previous</code> may used in a <code>while</code>
2122 * loop to iterate through a rowset starting after the last row
2123 * and moving toward the beginning. The loop ends when <code>previous</code>
2124 * returns <code>false</code>, meaning that there are no more rows.
2125 * For example, the following code fragment retrieves all the data in
2126 * the <code>JoinRowSetImpl</code> object <code>crs</code>, which has
2127 * three columns. Note that the cursor must initially be positioned
2128 * after the last row so that the first call to the method
2129 * <code>previous</code> places the cursor on the last line.
2130 * <PRE> <code>
2131 *
2132 * crs.afterLast();
2133 * while (previous()) {
2134 * String name = crs.getString(1);
2135 * int age = crs.getInt(2);
2136 * short ssn = crs.getShort(3);
2137 * System.out.println(name + " " + age + " " + ssn);
2138 * }
2139 *
2140 * </code> </PRE>
2141 * This method throws an <code>SQLException</code> if the cursor is not
2142 * on a row in the rowset, before the first row, or after the last row.
2143 *
2144 * @return <code>true</code> if the cursor is on a valid row;
2145 * <code>false</code> if it is before the first row or after the
2146 * last row
2147 * @throws SQLException if the cursor is not on a valid position or the
2148 * type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
2149 */
2150 public boolean previous() throws SQLException {
2151 return crsInternal.previous();
2152 }
2153
2154 /**
2155 * Returns the index of the column whose name is <i>columnName</i>.
2156 *
2157 * @param columnName a <code>String</code> object giving the name of the
2158 * column for which the index will be returned; the name must
2159 * match the SQL name of a column in this <code>JoinRowSet</code>
2160 * object, ignoring case
2161 * @throws SQLException if the given column name does not match one of the
2162 * column names for this <code>JoinRowSet</code> object
2163 */
2164 public int findColumn(String columnName) throws SQLException {
2165 return crsInternal.findColumn(columnName);
2166 }
2167
2168 /**
2169 * Indicates whether the current row of this <code>JoinRowSetImpl</code>
2170 * object has been updated. The value returned
2171 * depends on whether this rowset can detect updates: <code>false</code>
2172 * will always be returned if it does not detect updates.
2173 *
2174 * @return <code>true</code> if the row has been visibly updated
2175 * by the owner or another and updates are detected;
2176 * <code>false</code> otherwise
2177 * @throws SQLException if the cursor is on the insert row or not
2178 * on a valid row
2179 *
2180 * @see DatabaseMetaData#updatesAreDetected
2181 */
2182 public boolean rowUpdated() throws SQLException {
2183 return crsInternal.rowUpdated();
2184 }
2185
2186 /**
2187 * Indicates whether the designated column of the current row of
2188 * this <code>JoinRowSetImpl</code> object has been updated. The
2189 * value returned depends on whether this rowset can detcted updates:
2190 * <code>false</code> will always be returned if it does not detect updates.
2191 *
2192 * @return <code>true</code> if the column updated
2193 * <code>false</code> otherwse
2194 * @throws SQLException if the cursor is on the insert row or not
2195 * on a valid row
2196 * @see DatabaseMetaData#updatesAreDetected
2197 */
2198 public boolean columnUpdated(int indexColumn) throws SQLException {
2199 return crsInternal.columnUpdated(indexColumn);
2200 }
2201
2202 /**
2203 * Indicates whether the current row has been inserted. The value returned
2204 * depends on whether or not the rowset can detect visible inserts.
2205 *
2206 * @return <code>true</code> if a row has been inserted and inserts are detected;
2207 * <code>false</code> otherwise
2208 * @throws SQLException if the cursor is on the insert row or not
2209 * not on a valid row
2210 *
2211 * @see DatabaseMetaData#insertsAreDetected
2212 */
2213 public boolean rowInserted() throws SQLException {
2214 return crsInternal.rowInserted();
2215 }
2216
2217 /**
2218 * Indicates whether the current row has been deleted. A deleted row
2219 * may leave a visible "hole" in a rowset. This method can be used to
2220 * detect such holes if the rowset can detect deletions. This method
2221 * will always return <code>false</code> if this rowset cannot detect
2222 * deletions.
2223 *
2224 * @return <code>true</code> if (1)the current row is blank, indicating that
2225 * the row has been deleted, and (2)deletions are detected;
2226 * <code>false</code> otherwise
2227 * @throws SQLException if the cursor is on a valid row in this rowset
2228 * @see DatabaseMetaData#deletesAreDetected
2229 */
2230 public boolean rowDeleted() throws SQLException {
2231 return crsInternal.rowDeleted();
2232 }
2233
2234 /**
2235 * Sets the designated nullable column in the current row or the
2236 * insert row of this <code>JoinRowSetImpl</code> object with
2237 * <code>null</code> value.
2238 * <P>
2239 * This method updates a column value in the current row or the insert
2240 * row of this rowset; however, another method must be called to complete
2241 * the update process. If the cursor is on a row in the rowset, the
2242 * method {@link #updateRow} must be called to mark the row as updated
2243 * and to notify listeners that the row has changed.
2244 * If the cursor is on the insert row, the method {@link #insertRow}
2245 * must be called to insert the new row into this rowset and to notify
2246 * listeners that a row has changed.
2247 * <P>
2248 * In order to propagate updates in this rowset to the underlying
2249 * data source, an application must call the method acceptChanges
2250 * after it calls either <code>updateRow</code> or <code>insertRow</code>.
2251 *
2252 * @param columnIndex the first column is <code>1</code>, the second
2253 * is <code>2</code>, and so on; must be <code>1</code> or larger
2254 * and equal to or less than the number of columns in this rowset
2255 * @throws SQLException if (1) the given column index is out of bounds,
2256 * (2) the cursor is not on one of this rowset's rows or its
2257 * insert row, or (3) this rowset is
2258 * <code>ResultSet.CONCUR_READ_ONLY</code>
2259 */
2260 public void updateNull(int columnIndex) throws SQLException {
2261 crsInternal.updateNull(columnIndex);
2262 }
2263
2264 /**
2265 * Sets the designated column in either the current row or the insert
2266 * row of this <code>JoinRowSetImpl</code> object with the given
2267 * <code>boolean</code> value.
2268 * <P>
2269 * This method updates a column value in the current row or the insert
2270 * row of this rowset, but it does not update the database.
2271 * If the cursor is on a row in the rowset, the
2272 * method {@link #updateRow} must be called to update the database.
2273 * If the cursor is on the insert row, the method {@link #insertRow}
2274 * must be called, which will insert the new row into both this rowset
2275 * and the database. Both of these methods must be called before the
2276 * cursor moves to another row.
2277 *
2278 * @param columnIndex the first column is <code>1</code>, the second
2279 * is <code>2</code>, and so on; must be <code>1</code> or larger
2280 * and equal to or less than the number of columns in this rowset
2281 * @param x the new column value
2282 * @throws SQLException if (1) the given column index is out of bounds,
2283 * (2) the cursor is not on one of this rowset's rows or its
2284 * insert row, or (3) this rowset is
2285 * <code>ResultSet.CONCUR_READ_ONLY</code>
2286 */
2287 public void updateBoolean(int columnIndex, boolean x) throws SQLException {
2288 crsInternal.updateBoolean(columnIndex, x);
2289 }
2290
2291 /**
2292 * Sets the designated column in either the current row or the insert
2293 * row of this <code>JoinRowSetImpl</code> object with the given
2294 * <code>byte</code> value.
2295 * <P>
2296 * This method updates a column value in the current row or the insert
2297 * row of this rowset, but it does not update the database.
2298 * If the cursor is on a row in the rowset, the
2299 * method {@link #updateRow} must be called to update the database.
2300 * If the cursor is on the insert row, the method {@link #insertRow}
2301 * must be called, which will insert the new row into both this rowset
2302 * and the database. Both of these methods must be called before the
2303 * cursor moves to another row.
2304 *
2305 * @param columnIndex the first column is <code>1</code>, the second
2306 * is <code>2</code>, and so on; must be <code>1</code> or larger
2307 * and equal to or less than the number of columns in this rowset
2308 * @param x the new column value
2309 * @throws SQLException if (1) the given column index is out of bounds,
2310 * (2) the cursor is not on one of this rowset's rows or its
2311 * insert row, or (3) this rowset is
2312 * <code>ResultSet.CONCUR_READ_ONLY</code>
2313 */
2314 public void updateByte(int columnIndex, byte x) throws SQLException {
2315 crsInternal.updateByte(columnIndex, x);
2316 }
2317
2318 /**
2319 * Sets the designated column in either the current row or the insert
2320 * row of this <code>JoinRowSetImpl</code> object with the given
2321 * <code>short</code> value.
2322 * <P>
2323 * This method updates a column value in the current row or the insert
2324 * row of this rowset, but it does not update the database.
2325 * If the cursor is on a row in the rowset, the
2326 * method {@link #updateRow} must be called to update the database.
2327 * If the cursor is on the insert row, the method {@link #insertRow}
2328 * must be called, which will insert the new row into both this rowset
2329 * and the database. Both of these methods must be called before the
2330 * cursor moves to another row.
2331 *
2332 * @param columnIndex the first column is <code>1</code>, the second
2333 * is <code>2</code>, and so on; must be <code>1</code> or larger
2334 * and equal to or less than the number of columns in this rowset
2335 * @param x the new column value
2336 * @throws SQLException if (1) the given column index is out of bounds,
2337 * (2) the cursor is not on one of this rowset's rows or its
2338 * insert row, or (3) this rowset is
2339 * <code>ResultSet.CONCUR_READ_ONLY</code>
2340 */
2341 public void updateShort(int columnIndex, short x) throws SQLException {
2342 crsInternal.updateShort(columnIndex, x);
2343 }
2344
2345 /**
2346 * Sets the designated column in either the current row or the insert
2347 * row of this <code>JoinRowSetImpl</code> object with the given
2348 * <code>int</code> value.
2349 * <P>
2350 * This method updates a column value in the current row or the insert
2351 * row of this rowset, but it does not update the database.
2352 * If the cursor is on a row in the rowset, the
2353 * method {@link #updateRow} must be called to update the database.
2354 * If the cursor is on the insert row, the method {@link #insertRow}
2355 * must be called, which will insert the new row into both this rowset
2356 * and the database. Both of these methods must be called before the
2357 * cursor moves to another row.
2358 *
2359 * @param columnIndex the first column is <code>1</code>, the second
2360 * is <code>2</code>, and so on; must be <code>1</code> or larger
2361 * and equal to or less than the number of columns in this rowset
2362 * @param x the new column value
2363 * @throws SQLException if (1) the given column index is out of bounds,
2364 * (2) the cursor is not on one of this rowset's rows or its
2365 * insert row, or (3) this rowset is
2366 * <code>ResultSet.CONCUR_READ_ONLY</code>
2367 */
2368 public void updateInt(int columnIndex, int x) throws SQLException {
2369 crsInternal.updateInt(columnIndex, x);
2370 }
2371
2372 /**
2373 * Sets the designated column in either the current row or the insert
2374 * row of this <code>JoinRowSetImpl</code> object with the given
2375 * <code>long</code> value.
2376 * <P>
2377 * This method updates a column value in the current row or the insert
2378 * row of this rowset, but it does not update the database.
2379 * If the cursor is on a row in the rowset, the
2380 * method {@link #updateRow} must be called to update the database.
2381 * If the cursor is on the insert row, the method {@link #insertRow}
2382 * must be called, which will insert the new row into both this rowset
2383 * and the database. Both of these methods must be called before the
2384 * cursor moves to another row.
2385 *
2386 * @param columnIndex the first column is <code>1</code>, the second
2387 * is <code>2</code>, and so on; must be <code>1</code> or larger
2388 * and equal to or less than the number of columns in this rowset
2389 * @param x the new column value
2390 * @throws SQLException if (1) the given column index is out of bounds,
2391 * (2) the cursor is not on one of this rowset's rows or its
2392 * insert row, or (3) this rowset is
2393 * <code>ResultSet.CONCUR_READ_ONLY</code>
2394 */
2395 public void updateLong(int columnIndex, long x) throws SQLException {
2396 crsInternal.updateLong(columnIndex, x);
2397 }
2398
2399 /**
2400 * Sets the designated column in either the current row or the insert
2401 * row of this <code>JoinRowSetImpl</code> object with the given
2402 * <code>float</code> value.
2403 * <P>
2404 * This method updates a column value in the current row or the insert
2405 * row of this rowset, but it does not update the database.
2406 * If the cursor is on a row in the rowset, the
2407 * method {@link #updateRow} must be called to update the database.
2408 * If the cursor is on the insert row, the method {@link #insertRow}
2409 * must be called, which will insert the new row into both this rowset
2410 * and the database. Both of these methods must be called before the
2411 * cursor moves to another row.
2412 *
2413 * @param columnIndex the first column is <code>1</code>, the second
2414 * is <code>2</code>, and so on; must be <code>1</code> or larger
2415 * and equal to or less than the number of columns in this rowset
2416 * @param x the new column value
2417 * @throws SQLException if (1) the given column index is out of bounds,
2418 * (2) the cursor is not on one of this rowset's rows or its
2419 * insert row, or (3) this rowset is
2420 * <code>ResultSet.CONCUR_READ_ONLY</code>
2421 */
2422 public void updateFloat(int columnIndex, float x) throws SQLException {
2423 crsInternal.updateFloat(columnIndex, x);
2424 }
2425
2426 /**
2427 * Sets the designated column in either the current row or the insert
2428 * row of this <code>JoinRowSetImpl</code> object with the given
2429 * <code>double</code> value.
2430 *
2431 * This method updates a column value in either the current row or
2432 * the insert row of this rowset, but it does not update the
2433 * database. If the cursor is on a row in the rowset, the
2434 * method {@link #updateRow} must be called to update the database.
2435 * If the cursor is on the insert row, the method {@link #insertRow}
2436 * must be called, which will insert the new row into both this rowset
2437 * and the database. Both of these methods must be called before the
2438 * cursor moves to another row.
2439 *
2440 * @param columnIndex the first column is <code>1</code>, the second
2441 * is <code>2</code>, and so on; must be <code>1</code> or larger
2442 * and equal to or less than the number of columns in this rowset
2443 * @param x the new column value
2444 * @throws SQLException if (1) the given column index is out of bounds,
2445 * (2) the cursor is not on one of this rowset's rows or its
2446 * insert row, or (3) this rowset is
2447 * <code>ResultSet.CONCUR_READ_ONLY</code>
2448 */
2449 public void updateDouble(int columnIndex, double x) throws SQLException {
2450 crsInternal.updateDouble(columnIndex, x);
2451 }
2452
2453 /**
2454 * Sets the designated column in either the current row or the insert
2455 * row of this <code>JoinRowSetImpl</code> object with the given
2456 * <code>java.math.BigDecimal</code> object.
2457 * <P>
2458 * This method updates a column value in the current row or the insert
2459 * row of this rowset, but it does not update the database.
2460 * If the cursor is on a row in the rowset, the
2461 * method {@link #updateRow} must be called to update the database.
2462 * If the cursor is on the insert row, the method {@link #insertRow}
2463 * must be called, which will insert the new row into both this rowset
2464 * and the database. Both of these methods must be called before the
2465 * cursor moves to another row.
2466 *
2467 * @param columnIndex the first column is <code>1</code>, the second
2468 * is <code>2</code>, and so on; must be <code>1</code> or larger
2469 * and equal to or less than the number of columns in this rowset
2470 * @param x the new column value
2471 * @throws SQLException if (1) the given column index is out of bounds,
2472 * (2) the cursor is not on one of this rowset's rows or its
2473 * insert row, or (3) this rowset is
2474 * <code>ResultSet.CONCUR_READ_ONLY</code>
2475 */
2476 public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
2477 crsInternal.updateBigDecimal(columnIndex, x);
2478 }
2479
2480 /**
2481 * Sets the designated column in either the current row or the insert
2482 * row of this <code>JoinRowSetImpl</code> object with the given
2483 * <code>String</code> object.
2484 * <P>
2485 * This method updates a column value in either the current row or
2486 * the insert row of this rowset, but it does not update the
2487 * database. If the cursor is on a row in the rowset, the
2488 * method {@link #updateRow} must be called to mark the row as updated.
2489 * If the cursor is on the insert row, the method {@link #insertRow}
2490 * must be called to insert the new row into this rowset and mark it
2491 * as inserted. Both of these methods must be called before the
2492 * cursor moves to another row.
2493 * <P>
2494 * The method <code>acceptChanges</code> must be called if the
2495 * updated values are to be written back to the underlying database.
2496 *
2497 * @param columnIndex the first column is <code>1</code>, the second
2498 * is <code>2</code>, and so on; must be <code>1</code> or larger
2499 * and equal to or less than the number of columns in this rowset
2500 * @param x the new column value
2501 * @throws SQLException if (1) the given column index is out of bounds,
2502 * (2) the cursor is not on one of this rowset's rows or its
2503 * insert row, or (3) this rowset is
2504 * <code>ResultSet.CONCUR_READ_ONLY</code>
2505 */
2506 public void updateString(int columnIndex, String x) throws SQLException {
2507 crsInternal.updateString(columnIndex, x);
2508 }
2509
2510 /**
2511 * Sets the designated column in either the current row or the insert
2512 * row of this <code>JoinRowSetImpl</code> object with the given
2513 * <code>byte</code> array.
2514 *
2515 * This method updates a column value in either the current row or
2516 * the insert row of this rowset, but it does not update the
2517 * database. If the cursor is on a row in the rowset, the
2518 * method {@link #updateRow} must be called to update the database.
2519 * If the cursor is on the insert row, the method {@link #insertRow}
2520 * must be called, which will insert the new row into both this rowset
2521 * and the database. Both of these methods must be called before the
2522 * cursor moves to another row.
2523 *
2524 * @param columnIndex the first column is <code>1</code>, the second
2525 * is <code>2</code>, and so on; must be <code>1</code> or larger
2526 * and equal to or less than the number of columns in this rowset
2527 * @param x the new column value
2528 * @throws SQLException if (1) the given column index is out of bounds,
2529 * (2) the cursor is not on one of this rowset's rows or its
2530 * insert row, or (3) this rowset is
2531 * <code>ResultSet.CONCUR_READ_ONLY</code>
2532 */
2533 public void updateBytes(int columnIndex, byte x[]) throws SQLException {
2534 crsInternal.updateBytes(columnIndex, x);
2535 }
2536
2537 /**
2538 * Sets the designated column in either the current row or the insert
2539 * row of this <code>JoinRowSetImpl</code> object with the given
2540 * <code>Date</code> object.
2541 *
2542 * This method updates a column value in either the current row or
2543 * the insert row of this rowset, but it does not update the
2544 * database. If the cursor is on a row in the rowset, the
2545 * method {@link #updateRow} must be called to update the database.
2546 * If the cursor is on the insert row, the method {@link #insertRow}
2547 * must be called, which will insert the new row into both this rowset
2548 * and the database. Both of these methods must be called before the
2549 * cursor moves to another row.
2550 *
2551 * @param columnIndex the first column is <code>1</code>, the second
2552 * is <code>2</code>, and so on; must be <code>1</code> or larger
2553 * and equal to or less than the number of columns in this rowset
2554 * @param x the new column value
2555 * @throws SQLException if (1) the given column index is out of bounds,
2556 * (2) the cursor is not on one of this rowset's rows or its
2557 * insert row, (3) the type of the designated column is not
2558 * an SQL <code>DATE</code> or <code>TIMESTAMP</code>, or
2559 * (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2560 */
2561 public void updateDate(int columnIndex, java.sql.Date x) throws SQLException {
2562 crsInternal.updateDate(columnIndex, x);
2563 }
2564
2565 /**
2566 * Sets the designated column in either the current row or the insert
2567 * row of this <code>JoinRowSetImpl</code> object with the given
2568 * <code>Time</code> object.
2569 *
2570 * This method updates a column value in either the current row or
2571 * the insert row of this rowset, but it does not update the
2572 * database. If the cursor is on a row in the rowset, the
2573 * method {@link #updateRow} must be called to update the database.
2574 * If the cursor is on the insert row, the method {@link #insertRow}
2575 * must be called, which will insert the new row into both this rowset
2576 * and the database. Both of these methods must be called before the
2577 * cursor moves to another row.
2578 *
2579 * @param columnIndex the first column is <code>1</code>, the second
2580 * is <code>2</code>, and so on; must be <code>1</code> or larger
2581 * and equal to or less than the number of columns in this rowset
2582 * @param x the new column value
2583 * @throws SQLException if (1) the given column index is out of bounds,
2584 * (2) the cursor is not on one of this rowset's rows or its
2585 * insert row, (3) the type of the designated column is not
2586 * an SQL <code>TIME</code> or <code>TIMESTAMP</code>, or
2587 * (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2588 */
2589 public void updateTime(int columnIndex, java.sql.Time x) throws SQLException {
2590 crsInternal.updateTime(columnIndex, x);
2591 }
2592
2593 /**
2594 * Sets the designated column in either the current row or the insert
2595 * row of this <code>JoinRowSetImpl</code> object with the given
2596 * <code>Timestamp</code> object.
2597 *
2598 * This method updates a column value in either the current row or
2599 * the insert row of this rowset, but it does not update the
2600 * database. If the cursor is on a row in the rowset, the
2601 * method {@link #updateRow} must be called to update the database.
2602 * If the cursor is on the insert row, the method {@link #insertRow}
2603 * must be called, which will insert the new row into both this rowset
2604 * and the database. Both of these methods must be called before the
2605 * cursor moves to another row.
2606 *
2607 * @param columnIndex the first column is <code>1</code>, the second
2608 * is <code>2</code>, and so on; must be <code>1</code> or larger
2609 * and equal to or less than the number of columns in this rowset
2610 * @param x the new column value
2611 * @throws SQLException if (1) the given column index is out of bounds,
2612 * (2) the cursor is not on one of this rowset's rows or its
2613 * insert row, (3) the type of the designated column is not
2614 * an SQL <code>DATE</code>, <code>TIME</code>, or
2615 * <code>TIMESTAMP</code>, or (4) this rowset is
2616 * <code>ResultSet.CONCUR_READ_ONLY</code>
2617 */
2618 public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException {
2619 crsInternal.updateTimestamp(columnIndex, x);
2620 }
2621
2622 /*
2623 * Sets the designated column in either the current row or the insert
2624 * row of this <code>JoinRowSetImpl</code> object with the given
2625 * ASCII stream value.
2626 * <P>
2627 * This method updates a column value in either the current row or
2628 * the insert row of this rowset, but it does not update the
2629 * database. If the cursor is on a row in the rowset, the
2630 * method {@link #updateRow} must be called to update the database.
2631 * If the cursor is on the insert row, the method {@link #insertRow}
2632 * must be called, which will insert the new row into both this rowset
2633 * and the database. Both of these methods must be called before the
2634 * cursor moves to another row.
2635 *
2636 * @param columnIndex the first column is <code>1</code>, the second
2637 * is <code>2</code>, and so on; must be <code>1</code> or larger
2638 * and equal to or less than the number of columns in this rowset
2639 * @param x the new column value
2640 * @param length the number of one-byte ASCII characters in the stream
2641 * @throws UnsupportedOperationException if this method is invoked
2642 */
2643 public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException {
2644 crsInternal.updateAsciiStream(columnIndex, x, length);
2645 }
2646
2647 /**
2648 * Sets the designated column in either the current row or the insert
2649 * row of this <code>JoinRowSetImpl</code> object with the given
2650 * <code>java.io.InputStream</code> object.
2651 * <P>
2652 * This method updates a column value in either the current row or
2653 * the insert row of this rowset, but it does not update the
2654 * database. If the cursor is on a row in the rowset, the
2655 * method {@link #updateRow} must be called to update the database.
2656 * If the cursor is on the insert row, the method {@link #insertRow}
2657 * must be called, which will insert the new row into both this rowset
2658 * and the database. Both of these methods must be called before the
2659 * cursor moves to another row.
2660 *
2661 * @param columnIndex the first column is <code>1</code>, the second
2662 * is <code>2</code>, and so on; must be <code>1</code> or larger
2663 * and equal to or less than the number of columns in this rowset
2664 * @param x the new column value; must be a <code>java.io.InputStream</code>
2665 * containing <code>BINARY</code>, <code>VARBINARY</code>, or
2666 * <code>LONGVARBINARY</code> data
2667 * @param length the length of the stream in bytes
2668 * @throws SQLException if (1) the given column index is out of bounds,
2669 * (2) the cursor is not on one of this rowset's rows or its
2670 * insert row, (3) the data in the stream is not binary, or
2671 * (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2672 */
2673 public void updateBinaryStream(int columnIndex, java.io.InputStream x, int length) throws SQLException {
2674 crsInternal.updateBinaryStream(columnIndex, x, length);
2675 }
2676
2677 /**
2678 * Sets the designated column in either the current row or the insert
2679 * row of this <code>JoinRowSetImpl</code> object with the given
2680 * <code>java.io.Reader</code> object.
2681 * <P>
2682 * This method updates a column value in either the current row or
2683 * the insert row of this rowset, but it does not update the
2684 * database. If the cursor is on a row in the rowset, the
2685 * method {@link #updateRow} must be called to update the database.
2686 * If the cursor is on the insert row, the method {@link #insertRow}
2687 * must be called, which will insert the new row into both this rowset
2688 * and the database. Both of these methods must be called before the
2689 * cursor moves to another row.
2690 *
2691 * @param columnIndex the first column is <code>1</code>, the second
2692 * is <code>2</code>, and so on; must be <code>1</code> or larger
2693 * and equal to or less than the number of columns in this rowset
2694 * @param x the new column value; must be a <code>java.io.Reader</code>
2695 * containing <code>BINARY</code>, <code>VARBINARY</code>,
2696 * <code>LONGVARBINARY</code>, <code>CHAR</code>, <code>VARCHAR</code>,
2697 * or <code>LONGVARCHAR</code> data
2698 * @param length the length of the stream in characters
2699 * @throws SQLException if (1) the given column index is out of bounds,
2700 * (2) the cursor is not on one of this rowset's rows or its
2701 * insert row, (3) the data in the stream is not a binary or
2702 * character type, or (4) this rowset is
2703 * <code>ResultSet.CONCUR_READ_ONLY</code>
2704 */
2705 public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException {
2706 crsInternal.updateCharacterStream(columnIndex, x, length);
2707 }
2708
2709 /**
2710 * Sets the designated column in either the current row or the insert
2711 * row of this <code>JoinRowSetImpl</code> object with the given
2712 * <code>Object</code> value. The <code>scale</code> parameter indicates
2713 * the number of digits to the right of the decimal point and is ignored
2714 * if the new column value is not a type that will be mapped to an SQL
2715 * <code>DECIMAL</code> or <code>NUMERIC</code> value.
2716 * <P>
2717 * This method updates a column value in either the current row or
2718 * the insert row of this rowset, but it does not update the
2719 * database. If the cursor is on a row in the rowset, the
2720 * method {@link #updateRow} must be called to update the database.
2721 * If the cursor is on the insert row, the method {@link #insertRow}
2722 * must be called, which will insert the new row into both this rowset
2723 * and the database. Both of these methods must be called before the
2724 * cursor moves to another row.
2725 *
2726 * @param columnIndex the first column is <code>1</code>, the second
2727 * is <code>2</code>, and so on; must be <code>1</code> or larger
2728 * and equal to or less than the number of columns in this rowset
2729 * @param x the new column value
2730 * @param scale the number of digits to the right of the decimal point (for
2731 * <code>DECIMAL</code> and <code>NUMERIC</code> types only)
2732 * @throws SQLException if (1) the given column index is out of bounds,
2733 * (2) the cursor is not on one of this rowset's rows or its
2734 * insert row, or (3) this rowset is
2735 * <code>ResultSet.CONCUR_READ_ONLY</code>
2736 */
2737 public void updateObject(int columnIndex, Object x, int scale) throws SQLException {
2738 crsInternal.updateObject(columnIndex, x, scale);
2739 }
2740
2741 /**
2742 * Sets the designated column in either the current row or the insert
2743 * row of this <code>JoinRowSetImpl</code> object with the given
2744 * <code>Object</code> value.
2745 * <P>
2746 * This method updates a column value in either the current row or
2747 * the insert row of this rowset, but it does not update the
2748 * database. If the cursor is on a row in the rowset, the
2749 * method {@link #updateRow} must be called to update the database.
2750 * If the cursor is on the insert row, the method {@link #insertRow}
2751 * must be called, which will insert the new row into both this rowset
2752 * and the database. Both of these methods must be called before the
2753 * cursor moves to another row.
2754 *
2755 * @param columnIndex the first column is <code>1</code>, the second
2756 * is <code>2</code>, and so on; must be <code>1</code> or larger
2757 * and equal to or less than the number of columns in this rowset
2758 * @param x the new column value
2759 * @throws SQLException if (1) the given column index is out of bounds,
2760 * (2) the cursor is not on one of this rowset's rows or its
2761 * insert row, or (3) this rowset is
2762 * <code>ResultSet.CONCUR_READ_ONLY</code>
2763 */
2764 public void updateObject(int columnIndex, Object x) throws SQLException {
2765 crsInternal.updateObject(columnIndex, x);
2766 }
2767
2768 // columnName updates
2769
2770 /**
2771 * Sets the designated nullable column in the current row or the
2772 * insert row of this <code>JoinRowSetImpl</code> object with
2773 * <code>null</code> value.
2774 * <P>
2775 * This method updates a column value in the current row or the insert
2776 * row of this rowset, but it does not update the database.
2777 * If the cursor is on a row in the rowset, the
2778 * method {@link #updateRow} must be called to update the database.
2779 * If the cursor is on the insert row, the method {@link #insertRow}
2780 * must be called, which will insert the new row into both this rowset
2781 * and the database.
2782 *
2783 * @param columnName a <code>String</code> object that must match the
2784 * SQL name of a column in this rowset, ignoring case
2785 * @throws SQLException if (1) the given column name does not match the
2786 * name of a column in this rowset, (2) the cursor is not on
2787 * one of this rowset's rows or its insert row, or (3) this
2788 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2789 */
2790 public void updateNull(String columnName) throws SQLException {
2791 crsInternal.updateNull(columnName);
2792 }
2793
2794 /**
2795 * Sets the designated column in either the current row or the insert
2796 * row of this <code>JoinRowSetImpl</code> object with the given
2797 * <code>boolean</code> value.
2798 * <P>
2799 * This method updates a column value in the current row or the insert
2800 * row of this rowset, but it does not update the database.
2801 * If the cursor is on a row in the rowset, the
2802 * method {@link #updateRow} must be called to update the database.
2803 * If the cursor is on the insert row, the method {@link #insertRow}
2804 * must be called, which will insert the new row into both this rowset
2805 * and the database. Both of these methods must be called before the
2806 * cursor moves to another row.
2807 *
2808 * @param columnName a <code>String</code> object that must match the
2809 * SQL name of a column in this rowset, ignoring case
2810 * @param x the new column value
2811 * @throws SQLException if (1) the given column name does not match the
2812 * name of a column in this rowset, (2) the cursor is not on
2813 * one of this rowset's rows or its insert row, or (3) this
2814 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2815 */
2816 public void updateBoolean(String columnName, boolean x) throws SQLException {
2817 crsInternal.updateBoolean(columnName, x);
2818 }
2819
2820 /**
2821 * Sets the designated column in either the current row or the insert
2822 * row of this <code>JoinRowSetImpl</code> object with the given
2823 * <code>byte</code> value.
2824 * <P>
2825 * This method updates a column value in the current row or the insert
2826 * row of this rowset, but it does not update the database.
2827 * If the cursor is on a row in the rowset, the
2828 * method {@link #updateRow} must be called to update the database.
2829 * If the cursor is on the insert row, the method {@link #insertRow}
2830 * must be called, which will insert the new row into both this rowset
2831 * and the database. Both of these methods must be called before the
2832 * cursor moves to another row.
2833 *
2834 * @param columnName a <code>String</code> object that must match the
2835 * SQL name of a column in this rowset, ignoring case
2836 * @param x the new column value
2837 * @throws SQLException if (1) the given column name does not match the
2838 * name of a column in this rowset, (2) the cursor is not on
2839 * one of this rowset's rows or its insert row, or (3) this
2840 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2841 */
2842 public void updateByte(String columnName, byte x) throws SQLException {
2843 crsInternal.updateByte(columnName, x);
2844 }
2845
2846 /**
2847 * Sets the designated column in either the current row or the insert
2848 * row of this <code>JoinRowSetImpl</code> object with the given
2849 * <code>short</code> value.
2850 * <P>
2851 * This method updates a column value in the current row or the insert
2852 * row of this rowset, but it does not update the database.
2853 * If the cursor is on a row in the rowset, the
2854 * method {@link #updateRow} must be called to update the database.
2855 * If the cursor is on the insert row, the method {@link #insertRow}
2856 * must be called, which will insert the new row into both this rowset
2857 * and the database. Both of these methods must be called before the
2858 * cursor moves to another row.
2859 *
2860 * @param columnName a <code>String</code> object that must match the
2861 * SQL name of a column in this rowset, ignoring case
2862 * @param x the new column value
2863 * @throws SQLException if (1) the given column name does not match the
2864 * name of a column in this rowset, (2) the cursor is not on
2865 * one of this rowset's rows or its insert row, or (3) this
2866 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2867 */
2868 public void updateShort(String columnName, short x) throws SQLException {
2869 crsInternal.updateShort(columnName, x);
2870 }
2871
2872 /**
2873 * Sets the designated column in either the current row or the insert
2874 * row of this <code>JoinRowSetImpl</code> object with the given
2875 * <code>int</code> value.
2876 * <P>
2877 * This method updates a column value in the current row or the insert
2878 * row of this rowset, but it does not update the database.
2879 * If the cursor is on a row in the rowset, the
2880 * method {@link #updateRow} must be called to update the database.
2881 * If the cursor is on the insert row, the method {@link #insertRow}
2882 * must be called, which will insert the new row into both this rowset
2883 * and the database. Both of these methods must be called before the
2884 * cursor moves to another row.
2885 *
2886 * @param columnName a <code>String</code> object that must match the
2887 * SQL name of a column in this rowset, ignoring case
2888 * @param x the new column value
2889 * @throws SQLException if (1) the given column name does not match the
2890 * name of a column in this rowset, (2) the cursor is not on
2891 * one of this rowset's rows or its insert row, or (3) this
2892 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2893 */
2894 public void updateInt(String columnName, int x) throws SQLException {
2895 crsInternal.updateInt(columnName, x);
2896 }
2897
2898 /**
2899 * Sets the designated column in either the current row or the insert
2900 * row of this <code>JoinRowSetImpl</code> object with the given
2901 * <code>long</code> value.
2902 * <P>
2903 * This method updates a column value in the current row or the insert
2904 * row of this rowset, but it does not update the database.
2905 * If the cursor is on a row in the rowset, the
2906 * method {@link #updateRow} must be called to update the database.
2907 * If the cursor is on the insert row, the method {@link #insertRow}
2908 * must be called, which will insert the new row into both this rowset
2909 * and the database. Both of these methods must be called before the
2910 * cursor moves to another row.
2911 *
2912 * @param columnName a <code>String</code> object that must match the
2913 * SQL name of a column in this rowset, ignoring case
2914 * @param x the new column value
2915 * @throws SQLException if (1) the given column name does not match the
2916 * name of a column in this rowset, (2) the cursor is not on
2917 * one of this rowset's rows or its insert row, or (3) this
2918 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2919 */
2920 public void updateLong(String columnName, long x) throws SQLException {
2921 crsInternal.updateLong(columnName, x);
2922 }
2923
2924 /**
2925 * Sets the designated column in either the current row or the insert
2926 * row of this <code>JoinRowSetImpl</code> object with the given
2927 * <code>float</code> value.
2928 * <P>
2929 * This method updates a column value in the current row or the insert
2930 * row of this rowset, but it does not update the database.
2931 * If the cursor is on a row in the rowset, the
2932 * method {@link #updateRow} must be called to update the database.
2933 * If the cursor is on the insert row, the method {@link #insertRow}
2934 * must be called, which will insert the new row into both this rowset
2935 * and the database. Both of these methods must be called before the
2936 * cursor moves to another row.
2937 *
2938 * @param columnName a <code>String</code> object that must match the
2939 * SQL name of a column in this rowset, ignoring case
2940 * @param x the new column value
2941 * @throws SQLException if (1) the given column name does not match the
2942 * name of a column in this rowset, (2) the cursor is not on
2943 * one of this rowset's rows or its insert row, or (3) this
2944 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2945 */
2946 public void updateFloat(String columnName, float x) throws SQLException {
2947 crsInternal.updateFloat(columnName, x);
2948 }
2949
2950 /**
2951 * Sets the designated column in either the current row or the insert
2952 * row of this <code>JoinRowSetImpl</code> object with the given
2953 * <code>double</code> value.
2954 *
2955 * This method updates a column value in either the current row or
2956 * the insert row of this rowset, but it does not update the
2957 * database. If the cursor is on a row in the rowset, the
2958 * method {@link #updateRow} must be called to update the database.
2959 * If the cursor is on the insert row, the method {@link #insertRow}
2960 * must be called, which will insert the new row into both this rowset
2961 * and the database. Both of these methods must be called before the
2962 * cursor moves to another row.
2963 *
2964 * @param columnName a <code>String</code> object that must match the
2965 * SQL name of a column in this rowset, ignoring case
2966 * @param x the new column value
2967 * @throws SQLException if (1) the given column name does not match the
2968 * name of a column in this rowset, (2) the cursor is not on
2969 * one of this rowset's rows or its insert row, or (3) this
2970 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2971 */
2972 public void updateDouble(String columnName, double x) throws SQLException {
2973 crsInternal.updateDouble(columnName, x);
2974 }
2975
2976 /**
2977 * Sets the designated column in either the current row or the insert
2978 * row of this <code>JoinRowSetImpl</code> object with the given
2979 * <code>java.math.BigDecimal</code> object.
2980 * <P>
2981 * This method updates a column value in the current row or the insert
2982 * row of this rowset, but it does not update the database.
2983 * If the cursor is on a row in the rowset, the
2984 * method {@link #updateRow} must be called to update the database.
2985 * If the cursor is on the insert row, the method {@link #insertRow}
2986 * must be called, which will insert the new row into both this rowset
2987 * and the database. Both of these methods must be called before the
2988 * cursor moves to another row.
2989 *
2990 * @param columnName a <code>String</code> object that must match the
2991 * SQL name of a column in this rowset, ignoring case
2992 * @param x the new column value
2993 * @throws SQLException if (1) the given column name does not match the
2994 * name of a column in this rowset, (2) the cursor is not on
2995 * one of this rowset's rows or its insert row, or (3) this
2996 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
2997 */
2998 public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException {
2999 crsInternal.updateBigDecimal(columnName, x);
3000 }
3001
3002 /**
3003 * Sets the designated column in either the current row or the insert
3004 * row of this <code>JoinRowSetImpl</code> object with the given
3005 * <code>String</code> object.
3006 *
3007 * This method updates a column value in either the current row or
3008 * the insert row of this rowset, but it does not update the
3009 * database. If the cursor is on a row in the rowset, the
3010 * method {@link #updateRow} must be called to update the database.
3011 * If the cursor is on the insert row, the method {@link #insertRow}
3012 * must be called, which will insert the new row into both this rowset
3013 * and the database. Both of these methods must be called before the
3014 * cursor moves to another row.
3015 *
3016 * @param columnName a <code>String</code> object that must match the
3017 * SQL name of a column in this rowset, ignoring case
3018 * @param x the new column value
3019 * @throws SQLException if (1) the given column name does not match the
3020 * name of a column in this rowset, (2) the cursor is not on
3021 * one of this rowset's rows or its insert row, or (3) this
3022 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3023 */
3024 public void updateString(String columnName, String x) throws SQLException {
3025 crsInternal.updateString(columnName, x);
3026 }
3027
3028 /**
3029 * Sets the designated column in either the current row or the insert
3030 * row of this <code>JoinRowSetImpl</code> object with the given
3031 * <code>byte</code> array.
3032 *
3033 * This method updates a column value in either the current row or
3034 * the insert row of this rowset, but it does not update the
3035 * database. If the cursor is on a row in the rowset, the
3036 * method {@link #updateRow} must be called to update the database.
3037 * If the cursor is on the insert row, the method {@link #insertRow}
3038 * must be called, which will insert the new row into both this rowset
3039 * and the database. Both of these methods must be called before the
3040 * cursor moves to another row.
3041 *
3042 * @param columnName a <code>String</code> object that must match the
3043 * SQL name of a column in this rowset, ignoring case
3044 * @param x the new column value
3045 * @throws SQLException if (1) the given column name does not match the
3046 * name of a column in this rowset, (2) the cursor is not on
3047 * one of this rowset's rows or its insert row, or (3) this
3048 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3049 */
3050 public void updateBytes(String columnName, byte x[]) throws SQLException {
3051 crsInternal.updateBytes(columnName, x);
3052 }
3053
3054 /**
3055 * Sets the designated column in either the current row or the insert
3056 * row of this <code>JoinRowSetImpl</code> object with the given
3057 * <code>Date</code> object.
3058 *
3059 * This method updates a column value in either the current row or
3060 * the insert row of this rowset, but it does not update the
3061 * database. If the cursor is on a row in the rowset, the
3062 * method {@link #updateRow} must be called to update the database.
3063 * If the cursor is on the insert row, the method {@link #insertRow}
3064 * must be called, which will insert the new row into both this rowset
3065 * and the database. Both of these methods must be called before the
3066 * cursor moves to another row.
3067 *
3068 * @param columnName a <code>String</code> object that must match the
3069 * SQL name of a column in this rowset, ignoring case
3070 * @param x the new column value
3071 * @throws SQLException if (1) the given column name does not match the
3072 * name of a column in this rowset, (2) the cursor is not on
3073 * one of this rowset's rows or its insert row, (3) the type
3074 * of the designated column is not an SQL <code>DATE</code> or
3075 * <code>TIMESTAMP</code>, or (4) this rowset is
3076 * <code>ResultSet.CONCUR_READ_ONLY</code>
3077 */
3078 public void updateDate(String columnName, java.sql.Date x) throws SQLException {
3079 crsInternal.updateDate(columnName, x);
3080 }
3081
3082 /**
3083 * Sets the designated column in either the current row or the insert
3084 * row of this <code>JoinRowSetImpl</code> object with the given
3085 * <code>Time</code> object.
3086 *
3087 * This method updates a column value in either the current row or
3088 * the insert row of this rowset, but it does not update the
3089 * database. If the cursor is on a row in the rowset, the
3090 * method {@link #updateRow} must be called to update the database.
3091 * If the cursor is on the insert row, the method {@link #insertRow}
3092 * must be called, which will insert the new row into both this rowset
3093 * and the database. Both of these methods must be called before the
3094 * cursor moves to another row.
3095 *
3096 * @param columnName a <code>String</code> object that must match the
3097 * SQL name of a column in this rowset, ignoring case
3098 * @param x the new column value
3099 * @throws SQLException if (1) the given column name does not match the
3100 * name of a column in this rowset, (2) the cursor is not on
3101 * one of this rowset's rows or its insert row, (3) the type
3102 * of the designated column is not an SQL <code>TIME</code> or
3103 * <code>TIMESTAMP</code>, or (4) this rowset is
3104 * <code>ResultSet.CONCUR_READ_ONLY</code>
3105 */
3106 public void updateTime(String columnName, java.sql.Time x) throws SQLException {
3107 crsInternal.updateTime(columnName, x);
3108 }
3109
3110 /**
3111 * Sets the designated column in either the current row or the insert
3112 * row of this <code>JoinRowSetImpl</code> object with the given
3113 * <code>Timestamp</code> object.
3114 *
3115 * This method updates a column value in either the current row or
3116 * the insert row of this rowset, but it does not update the
3117 * database. If the cursor is on a row in the rowset, the
3118 * method {@link #updateRow} must be called to update the database.
3119 * If the cursor is on the insert row, the method {@link #insertRow}
3120 * must be called, which will insert the new row into both this rowset
3121 * and the database. Both of these methods must be called before the
3122 * cursor moves to another row.
3123 *
3124 * @param columnName a <code>String</code> object that must match the
3125 * SQL name of a column in this rowset, ignoring case
3126 * @param x the new column value
3127 * @throws SQLException if the given column index is out of bounds or
3128 * the cursor is not on one of this rowset's rows or its
3129 * insert row
3130 * @throws SQLException if (1) the given column name does not match the
3131 * name of a column in this rowset, (2) the cursor is not on
3132 * one of this rowset's rows or its insert row, (3) the type
3133 * of the designated column is not an SQL <code>DATE</code>,
3134 * <code>TIME</code>, or <code>TIMESTAMP</code>, or (4) this
3135 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3136 */
3137 public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException {
3138 crsInternal.updateTimestamp(columnName, x);
3139 }
3140
3141 /**
3142 * Unsupported; throws an <code>UnsupportedOperationException</code>
3143 * if called.
3144 * <P>
3145 * Sets the designated column in either the current row or the insert
3146 * row of this <code>JoinRowSetImpl</code> object with the given
3147 * ASCII stream value.
3148 * <P>
3149 * This method updates a column value in either the current row or
3150 * the insert row of this rowset, but it does not update the
3151 * database. If the cursor is on a row in the rowset, the
3152 * method {@link #updateRow} must be called to update the database.
3153 * If the cursor is on the insert row, the method {@link #insertRow}
3154 * must be called, which will insert the new row into both this rowset
3155 * and the database. Both of these methods must be called before the
3156 * cursor moves to another row.
3157 *
3158 * @param columnName a <code>String</code> object that must match the
3159 * SQL name of a column in this rowset, ignoring case
3160 * @param x the new column value
3161 * @param length the number of one-byte ASCII characters in the stream
3162 * @throws UnsupportedOperationException if this method is invoked
3163 */
3164 public void updateAsciiStream(String columnName, java.io.InputStream x, int length) throws SQLException {
3165 crsInternal.updateAsciiStream(columnName, x, length);
3166 }
3167
3168 /**
3169 * Sets the designated column in either the current row or the insert
3170 * row of this <code>JoinRowSetImpl</code> object with the given
3171 * <code>java.io.InputStream</code> object.
3172 * <P>
3173 * This method updates a column value in either the current row or
3174 * the insert row of this rowset, but it does not update the
3175 * database. If the cursor is on a row in the rowset, the
3176 * method {@link #updateRow} must be called to update the database.
3177 * If the cursor is on the insert row, the method {@link #insertRow}
3178 * must be called, which will insert the new row into both this rowset
3179 * and the database. Both of these methods must be called before the
3180 * cursor moves to another row.
3181 *
3182 * @param columnName a <code>String</code> object that must match the
3183 * SQL name of a column in this rowset, ignoring case
3184 * @param x the new column value; must be a <code>java.io.InputStream</code>
3185 * containing <code>BINARY</code>, <code>VARBINARY</code>, or
3186 * <code>LONGVARBINARY</code> data
3187 * @param length the length of the stream in bytes
3188 * @throws SQLException if (1) the given column name does not match the
3189 * name of a column in this rowset, (2) the cursor is not on
3190 * one of this rowset's rows or its insert row, (3) the data
3191 * in the stream is not binary, or (4) this rowset is
3192 * <code>ResultSet.CONCUR_READ_ONLY</code>
3193 */
3194 public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException {
3195 crsInternal.updateBinaryStream(columnName, x, length);
3196 }
3197
3198 /**
3199 * Sets the designated column in either the current row or the insert
3200 * row of this <code>JoinRowSetImpl</code> object with the given
3201 * <code>java.io.Reader</code> object.
3202 * <P>
3203 * This method updates a column value in either the current row or
3204 * the insert row of this rowset, but it does not update the
3205 * database. 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</code> object that must match the
3213 * SQL name of a column in this rowset, ignoring case
3214 * @param x the new column value; must be a <code>java.io.Reader</code>
3215 * containing <code>BINARY</code>, <code>VARBINARY</code>,
3216 * <code>LONGVARBINARY</code>, <code>CHAR</code>, <code>VARCHAR</code>,
3217 * or <code>LONGVARCHAR</code> data
3218 * @param length the length of the stream in characters
3219 * @throws SQLException if (1) the given column name does not match the
3220 * name of a column in this rowset, (2) the cursor is not on
3221 * one of this rowset's rows or its insert row, (3) the data
3222 * in the stream is not a binary or character type, or (4) this
3223 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3224 */
3225 public void updateCharacterStream(String columnName, java.io.Reader x, int length) throws SQLException {
3226 crsInternal.updateCharacterStream(columnName, x, length);
3227 }
3228
3229 /**
3230 * Sets the designated column in either the current row or the insert
3231 * row of this <code>JoinRowSetImpl</code> object with the given
3232 * <code>Object</code> value. The <code>scale</code> parameter
3233 * indicates the number of digits to the right of the decimal point
3234 * and is ignored if the new column value is not a type that will be
3235 * mapped to an SQL <code>DECIMAL</code> or <code>NUMERIC</code> value.
3236 * <P>
3237 * This method updates a column value in either the current row or
3238 * the insert row of this rowset, but it does not update the
3239 * database. If the cursor is on a row in the rowset, the
3240 * method {@link #updateRow} must be called to update the database.
3241 * If the cursor is on the insert row, the method {@link #insertRow}
3242 * must be called, which will insert the new row into both this rowset
3243 * and the database. Both of these methods must be called before the
3244 * cursor moves to another row.
3245 *
3246 * @param columnName a <code>String</code> object that must match the
3247 * SQL name of a column in this rowset, ignoring case
3248 * @param x the new column value
3249 * @param scale the number of digits to the right of the decimal point (for
3250 * <code>DECIMAL</code> and <code>NUMERIC</code> types only)
3251 * @throws SQLException if the given column index is out of bounds or
3252 * the cursor is not on one of this rowset's rows or its
3253 * insert row
3254 * @throws SQLException if (1) the given column name does not match the
3255 * name of a column in this rowset, (2) the cursor is not on
3256 * one of this rowset's rows or its insert row, or (3) this
3257 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3258 */
3259 public void updateObject(String columnName, Object x, int scale) throws SQLException {
3260 crsInternal.updateObject(columnName, x, scale);
3261 }
3262
3263 /**
3264 * Sets the designated column in either the current row or the insert
3265 * row of this <code>JoinRowSetImpl</code> object with the given
3266 * <code>Object</code> value.
3267 * <P>
3268 * This method updates a column value in either the current row or
3269 * the insert row of this rowset, but it does not update the
3270 * database. If the cursor is on a row in the rowset, the
3271 * method {@link #updateRow} must be called to update the database.
3272 * If the cursor is on the insert row, the method {@link #insertRow}
3273 * must be called, which will insert the new row into both this rowset
3274 * and the database. Both of these methods must be called before the
3275 * cursor moves to another row.
3276 *
3277 * @param columnName a <code>String</code> object that must match the
3278 * SQL name of a column in this rowset, ignoring case
3279 * @param x the new column value
3280 * @throws SQLException if (1) the given column name does not match the
3281 * name of a column in this rowset, (2) the cursor is not on
3282 * one of this rowset's rows or its insert row, or (3) this
3283 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3284 */
3285 public void updateObject(String columnName, Object x) throws SQLException {
3286 crsInternal.updateObject(columnName, x);
3287 }
3288
3289 /**
3290 * Inserts the contents of this <code>JoinRowSetImpl</code> object's insert
3291 * row into this rowset immediately following the current row.
3292 * If the current row is the
3293 * position after the last row or before the first row, the new row will
3294 * be inserted at the end of the rowset. This method also notifies
3295 * listeners registered with this rowset that the row has changed.
3296 * <P>
3297 * The cursor must be on the insert row when this method is called.
3298 *
3299 * @throws SQLException if (1) the cursor is not on the insert row,
3300 * (2) one or more of the non-nullable columns in the insert
3301 * row has not been given a value, or (3) this rowset is
3302 * <code>ResultSet.CONCUR_READ_ONLY</code>
3303 */
3304 public void insertRow() throws SQLException {
3305 crsInternal.insertRow();
3306 }
3307
3308 /**
3309 * Marks the current row of this <code>JoinRowSetImpl</code> object as
3310 * updated and notifies listeners registered with this rowset that the
3311 * row has changed.
3312 * <P>
3313 * This method cannot be called when the cursor is on the insert row, and
3314 * it should be called before the cursor moves to another row. If it is
3315 * called after the cursor moves to another row, this method has no effect,
3316 * and the updates made before the cursor moved will be lost.
3317 *
3318 * @throws SQLException if the cursor is on the insert row or this
3319 * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3320 */
3321 public void updateRow() throws SQLException {
3322 crsInternal.updateRow();
3323 }
3324
3325 /**
3326 * Deletes the current row from this <code>JoinRowSetImpl</code> object and
3327 * notifies listeners registered with this rowset that a row has changed.
3328 * This method cannot be called when the cursor is on the insert row.
3329 * <P>
3330 * This method marks the current row as deleted, but it does not delete
3331 * the row from the underlying data source. The method
3332 * <code>acceptChanges</code> must be called to delete the row in
3333 * the data source.
3334 *
3335 * @throws SQLException if (1) this method is called when the cursor
3336 * is on the insert row, before the first row, or after the
3337 * last row or (2) this rowset is
3338 * <code>ResultSet.CONCUR_READ_ONLY</code>
3339 */
3340 public void deleteRow() throws SQLException {
3341 crsInternal.deleteRow();
3342 }
3343
3344 /**
3345 * Sets the current row with its original value and marks the row as
3346 * not updated, thus undoing any changes made to the row since the
3347 * last call to the methods <code>updateRow</code> or <code>deleteRow</code>.
3348 * This method should be called only when the cursor is on a row in
3349 * this rowset.
3350 *
3351 * @throws SQLException if the cursor is on the insert row, before the
3352 * first row, or after the last row
3353 */
3354 public void refreshRow() throws SQLException {
3355 crsInternal.refreshRow();
3356 }
3357
3358 /**
3359 * Rolls back any updates made to the current row of this
3360 * <code>JoinRowSetImpl</code> object and notifies listeners that
3361 * a row has changed. To have an effect, this method
3362 * must be called after an <code>updateXXX</code> method has been
3363 * called and before the method <code>updateRow</code> has been called.
3364 * If no updates have been made or the method <code>updateRow</code>
3365 * has already been called, this method has no effect.
3366 * <P>
3367 * After <code>updateRow</code> is called it is the
3368 * <code>cancelRowUpdates</code> has no affect on the newly
3369 * inserted values. The method <code>cancelRowInsert</code> can
3370 * be used to remove any rows inserted into the RowSet.
3371 *
3372 * @throws SQLException if the cursor is on the insert row, before the
3373 * first row, or after the last row
3374 */
3375 public void cancelRowUpdates() throws SQLException {
3376 crsInternal.cancelRowUpdates();
3377 }
3378
3379 /**
3380 * Moves the cursor for this <code>JoinRowSetImpl</code> object
3381 * to the insert row. The current row in the rowset is remembered
3382 * while the cursor is on the insert row.
3383 * <P>
3384 * The insert row is a special row associated with an updatable
3385 * rowset. It is essentially a buffer where a new row may
3386 * be constructed by calling the appropriate <code>updateXXX</code>
3387 * methods to assign a value to each column in the row. A complete
3388 * row must be constructed; that is, every column that is not nullable
3389 * must be assigned a value. In order for the new row to become part
3390 * of this rowset, the method <code>insertRow</code> must be called
3391 * before the cursor is moved back to the rowset.
3392 * <P>
3393 * Only certain methods may be invoked while the cursor is on the insert
3394 * row; many methods throw an exception if they are called while the
3395 * cursor is there. In addition to the <code>updateXXX</code>
3396 * and <code>insertRow</code> methods, only the <code>getXXX</code> methods
3397 * may be called when the cursor is on the insert row. A <code>getXXX</code>
3398 * method should be called on a column only after an <code>updateXXX</code>
3399 * method has been called on that column; otherwise, the value returned is
3400 * undetermined.
3401 *
3402 * @throws SQLException if this <code>JoinRowSetImpl</code> object is
3403 * <code>ResultSet.CONCUR_READ_ONLY</code>
3404 */
3405 public void moveToInsertRow() throws SQLException {
3406 crsInternal.moveToInsertRow();
3407 }
3408
3409 /**
3410 * Moves the cursor for this <code>JoinRowSetImpl</code> object to
3411 * the current row. The current row is the row the cursor was on
3412 * when the method <code>moveToInsertRow</code> was called.
3413 * <P>
3414 * Calling this method has no effect unless it is called while the
3415 * cursor is on the insert row.
3416 *
3417 * @throws SQLException if an error occurs
3418 */
3419 public void moveToCurrentRow() throws SQLException {
3420 crsInternal.moveToCurrentRow();
3421 }
3422
3423 /**
3424 * Returns <code>null</code>.
3425 *
3426 * @return <code>null</code>
3427 * @throws SQLException if an error occurs
3428 */
3429 public Statement getStatement() throws SQLException {
3430 return crsInternal.getStatement();
3431 }
3432
3433 /**
3434 * Retrieves the value of the designated column in this
3435 * <code>JoinRowSetImpl</code> object as a <code>Ref</code> object
3436 * in the Java programming lanugage.
3437 *
3438 * @param columnIndex the first column is <code>1</code>, the second
3439 * is <code>2</code>, and so on; must be <code>1</code> or larger
3440 * and equal to or less than the number of columns in this rowset
3441 * @return a <code>Ref</code> object representing an SQL<code> REF</code> value
3442 * @throws SQLException if (1) the given column index is out of bounds,
3443 * (2) the cursor is not on one of this rowset's rows or its
3444 * insert row, or (3) the designated column does not store an
3445 * SQL <code>REF</code> value
3446 */
3447 public Ref getRef(int columnIndex) throws SQLException {
3448 return crsInternal.getRef(columnIndex);
3449 }
3450
3451 /**
3452 * Retrieves the value of the designated column in this
3453 * <code>JoinRowSetImpl</code> object as a <code>Blob</code> object
3454 * in the Java programming lanugage.
3455 *
3456 * @param columnIndex the first column is <code>1</code>, the second
3457 * is <code>2</code>, and so on; must be <code>1</code> or larger
3458 * and equal to or less than the number of columns in this rowset
3459 * @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
3460 * @throws SQLException if (1) the given column index is out of bounds,
3461 * (2) the cursor is not on one of this rowset's rows or its
3462 * insert row, or (3) the designated column does not store an
3463 * SQL <code>BLOB</code> value
3464 */
3465 public Blob getBlob(int columnIndex) throws SQLException {
3466 return crsInternal.getBlob(columnIndex);
3467 }
3468
3469 /**
3470 * Retrieves the value of the designated column in this
3471 * <code>JoinRowSetImpl</code> object as a <code>Clob</code> object
3472 * in the Java programming lanugage.
3473 *
3474 * @param columnIndex the first column is <code>1</code>, the second
3475 * is <code>2</code>, and so on; must be <code>1</code> or larger
3476 * and equal to or less than the number of columns in this rowset
3477 * @return a <code>Clob</code> object representing an SQL <code>CLOB</code> value
3478 * @throws SQLException if (1) the given column index is out of bounds,
3479 * (2) the cursor is not on one of this rowset's rows or its
3480 * insert row, or (3) the designated column does not store an
3481 * SQL <code>CLOB</code> value
3482 */
3483 public Clob getClob(int columnIndex) throws SQLException {
3484 return crsInternal.getClob(columnIndex);
3485 }
3486
3487 /**
3488 * Retrieves the value of the designated column in this
3489 * <code>JoinRowSetImpl</code> object as an <code>Array</code> object
3490 * in the Java programming lanugage.
3491 *
3492 * @param columnIndex the first column is <code>1</code>, the second
3493 * is <code>2</code>, and so on; must be <code>1</code> or larger
3494 * and equal to or less than the number of columns in this rowset
3495 * @return an <code>Array</code> object representing an SQL
3496 * <code>ARRAY</code> value
3497 * @throws SQLException if (1) the given column index is out of bounds,
3498 * (2) the cursor is not on one of this rowset's rows or its
3499 * insert row, or (3) the designated column does not store an
3500 * SQL <code>ARRAY</code> value
3501 */
3502 public Array getArray(int columnIndex) throws SQLException {
3503 return crsInternal.getArray(columnIndex);
3504 }
3505
3506 // ColumnName
3507
3508 /**
3509 * Retrieves the value of the designated column in this
3510 * <code>JoinRowSetImpl</code> object as a <code>Ref</code> object
3511 * in the Java programming lanugage.
3512 *
3513 * @param columnName a <code>String</code> object that must match the
3514 * SQL name of a column in this rowset, ignoring case
3515 * @return a <code>Ref</code> object representing an SQL<code> REF</code> value
3516 * @throws SQLException if (1) the given column name is not the name
3517 * of a column in this rowset, (2) the cursor is not on one of
3518 * this rowset's rows or its insert row, or (3) the column value
3519 * is not an SQL <code>REF</code> value
3520 */
3521 public Ref getRef(String columnName) throws SQLException {
3522 return crsInternal.getRef(columnName);
3523 }
3524
3525 /**
3526 * Retrieves the value of the designated column in this
3527 * <code>JoinRowSetImpl</code> object as a <code>Blob</code> object
3528 * in the Java programming lanugage.
3529 *
3530 * @param columnName a <code>String</code> object that must match the
3531 * SQL name of a column in this rowset, ignoring case
3532 * @return a <code>Blob</code> object representing an SQL
3533 * <code>BLOB</code> value
3534 * @throws SQLException if (1) the given column name is not the name of
3535 * a column in this rowset, (2) the cursor is not on one of
3536 * this rowset's rows or its insert row, or (3) the designated
3537 * column does not store an SQL <code>BLOB</code> value
3538 */
3539 public Blob getBlob(String columnName) throws SQLException {
3540 return crsInternal.getBlob(columnName);
3541 }
3542
3543 /**
3544 * Retrieves the value of the designated column in this
3545 * <code>JoinRowSetImpl</code> object as a <code>Clob</code> object
3546 * in the Java programming lanugage.
3547 *
3548 * @param columnName a <code>String</code> object that must match the
3549 * SQL name of a column in this rowset, ignoring case
3550 * @return a <code>Clob</code> object representing an SQL
3551 * <code>CLOB</code> value
3552 * @throws SQLException if (1) the given column name is not the name of
3553 * a column in this rowset, (2) the cursor is not on one of
3554 * this rowset's rows or its insert row, or (3) the designated
3555 * column does not store an SQL <code>CLOB</code> value
3556 */
3557 public Clob getClob(String columnName) throws SQLException {
3558 return crsInternal.getClob(columnName);
3559 }
3560
3561 /**
3562 * Retrieves the value of the designated column in this
3563 * <code>JoinRowSetImpl</code> object as an <code>Array</code> object
3564 * in the Java programming lanugage.
3565 *
3566 * @param columnName a <code>String</code> object that must match the
3567 * SQL name of a column in this rowset, ignoring case
3568 * @return an <code>Array</code> object representing an SQL
3569 * <code>ARRAY</code> value
3570 * @throws SQLException if (1) the given column name is not the name of
3571 * a column in this rowset, (2) the cursor is not on one of
3572 * this rowset's rows or its insert row, or (3) the designated
3573 * column does not store an SQL <code>ARRAY</code> value
3574 */
3575 public Array getArray(String columnName) throws SQLException {
3576 return crsInternal.getArray(columnName);
3577 }
3578
3579 /**
3580 * Retrieves the value of the designated column in the current row
3581 * of this <code>JoinRowSetImpl</code> object as a <code>java.sql.Date</code>
3582 * object, using the given <code>Calendar</code> object to construct an
3583 * appropriate millisecond value for the date.
3584 *
3585 * @param columnIndex the first column is <code>1</code>, the second
3586 * is <code>2</code>, and so on; must be <code>1</code> or larger
3587 * and equal to or less than the number of columns in the rowset
3588 * @param cal the <code>java.util.Calendar</code> object to use in
3589 * constructing the date
3590 * @return the column value; if the value is SQL <code>NULL</code>,
3591 * the result is <code>null</code>
3592 * @throws SQLException if (1) the given column name is not the name of
3593 * a column in this rowset, (2) the cursor is not on one of
3594 * this rowset's rows or its insert row, or (3) the designated
3595 * column does not store an SQL <code>DATE</code> or
3596 * <code>TIMESTAMP</code> value
3597 */
3598 public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException {
3599 return crsInternal.getDate(columnIndex, cal);
3600 }
3601
3602 /**
3603 * Retrieves the value of the designated column in the current row
3604 * of this <code>JoinRowSetImpl</code> object as a <code>java.sql.Date</code>
3605 * object, using the given <code>Calendar</code> object to construct an
3606 * appropriate millisecond value for the date.
3607 *
3608 * @param columnName a <code>String</code> object that must match the
3609 * SQL name of a column in this rowset, ignoring case
3610 * @param cal the <code>java.util.Calendar</code> object to use in
3611 * constructing the date
3612 * @return the column value; if the value is SQL <code>NULL</code>,
3613 * the result is <code>null</code>
3614 * @throws SQLException if (1) the given column name is not the name of
3615 * a column in this rowset, (2) the cursor is not on one of
3616 * this rowset's rows or its insert row, or (3) the designated
3617 * column does not store an SQL <code>DATE</code> or
3618 * <code>TIMESTAMP</code> value
3619 */
3620 public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException {
3621 return crsInternal.getDate(columnName, cal);
3622 }
3623
3624 /**
3625 * Retrieves the value of the designated column in the current row
3626 * of this <code>JoinRowSetImpl</code> object as a <code>java.sql.Time</code>
3627 * object, using the given <code>Calendar</code> object to construct an
3628 * appropriate millisecond value for the date.
3629 *
3630 * @param columnIndex the first column is <code>1</code>, the second
3631 * is <code>2</code>, and so on; must be <code>1</code> or larger
3632 * and equal to or less than the number of columns in the rowset
3633 * @param cal the <code>java.util.Calendar</code> object to use in
3634 * constructing the date
3635 * @return the column value; if the value is SQL <code>NULL</code>,
3636 * the result is <code>null</code>
3637 * @throws SQLException if (1) the given column name is not the name of
3638 * a column in this rowset, (2) the cursor is not on one of
3639 * this rowset's rows or its insert row, or (3) the designated
3640 * column does not store an SQL <code>TIME</code> or
3641 * <code>TIMESTAMP</code> value
3642 */
3643 public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException {
3644 return crsInternal.getTime(columnIndex, cal);
3645 }
3646
3647 /**
3648 * Retrieves the value of the designated column in the current row
3649 * of this <code>JoinRowSetImpl</code> object as a <code>java.sql.Time</code>
3650 * object, using the given <code>Calendar</code> object to construct an
3651 * appropriate millisecond value for the date.
3652 *
3653 * @param columnName a <code>String</code> object that must match the
3654 * SQL name of a column in this rowset, ignoring case
3655 * @param cal the <code>java.util.Calendar</code> object to use in
3656 * constructing the date
3657 * @return the column value; if the value is SQL <code>NULL</code>,
3658 * the result is <code>null</code>
3659 * @throws SQLException if (1) the given column name is not the name of
3660 * a column in this rowset, (2) the cursor is not on one of
3661 * this rowset's rows or its insert row, or (3) the designated
3662 * column does not store an SQL <code>TIME</code> or
3663 * <code>TIMESTAMP</code> value
3664 */
3665 public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException {
3666 return crsInternal.getTime(columnName, cal);
3667 }
3668
3669 /**
3670 * Retrieves the value of the designated column in the current row
3671 * of this <code>JoinRowSetImpl</code> object as a <code>java.sql.Timestamp</code>
3672 * object, using the given <code>Calendar</code> object to construct an
3673 * appropriate millisecond value for the date.
3674 *
3675 * @param columnIndex the first column is <code>1</code>, the second
3676 * is <code>2</code>, and so on; must be <code>1</code> or larger
3677 * and equal to or less than the number of columns in the rowset
3678 * @param cal the <code>java.util.Calendar</code> object to use in
3679 * constructing the date
3680 * @return the column value; if the value is SQL <code>NULL</code>,
3681 * the result is <code>null</code>
3682 * @throws SQLException if (1) the given column name is not the name of
3683 * a column in this rowset, (2) the cursor is not on one of
3684 * this rowset's rows or its insert row, or (3) the designated
3685 * column does not store an SQL <code>TIME</code> or
3686 * <code>TIMESTAMP</code> value
3687 */
3688 public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
3689 return crsInternal.getTimestamp(columnIndex, cal);
3690 }
3691
3692 /**
3693 * Retrieves the value of the designated column in the current row
3694 * of this <code>JoinRowSetImpl</code> object as a
3695 * <code>java.sql.Timestamp</code> object, using the given
3696 * <code>Calendar</code> object to construct an appropriate
3697 * millisecond value for the date.
3698 *
3699 * @param columnName a <code>String</code> object that must match the
3700 * SQL name of a column in this rowset, ignoring case
3701 * @param cal the <code>java.util.Calendar</code> object to use in
3702 * constructing the date
3703 * @return the column value; if the value is SQL <code>NULL</code>,
3704 * the result is <code>null</code>
3705 * @throws SQLException if (1) the given column name is not the name of
3706 * a column in this rowset, (2) the cursor is not on one of
3707 * this rowset's rows or its insert row, or (3) the designated
3708 * column does not store an SQL <code>DATE</code>,
3709 * <code>TIME</code>, or <code>TIMESTAMP</code> value
3710 */
3711 public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException {
3712 return crsInternal.getTimestamp(columnName, cal);
3713 }
3714
3715 /**
3716 * Sets the metadata for this <code>JoinRowSetImpl</code> object
3717 * with the given <code>RowSetMetaData</code> object.
3718 *
3719 * @param md a <code>RowSetMetaData</code> object instance containing
3720 * metadata about the columsn in the rowset
3721 * @throws SQLException if invalid meta data is supplied to the
3722 * rowset
3723 */
3724 public void setMetaData(RowSetMetaData md) throws SQLException {
3725 crsInternal.setMetaData(md);
3726 }
3727
3728 public ResultSet getOriginal() throws SQLException {
3729 return crsInternal.getOriginal();
3730 }
3731
3732 /**
3733 * Returns a result set containing the original value of the rowset.
3734 * The cursor is positioned before the first row in the result set.
3735 * Only rows contained in the result set returned by getOriginal()
3736 * are said to have an original value.
3737 *
3738 * @return the original result set of the rowset
3739 * @throws SQLException if an error occurs produce the
3740 * <code>ResultSet</code> object
3741 */
3742 public ResultSet getOriginalRow() throws SQLException {
3743 return crsInternal.getOriginalRow();
3744 }
3745
3746 /**
3747 * Returns a result set containing the original value of the current
3748 * row only.
3749 *
3750 * @throws SQLException if there is no current row
3751 * @see #setOriginalRow
3752 */
3753 public void setOriginalRow() throws SQLException {
3754 crsInternal.setOriginalRow();
3755 }
3756
3757 /**
3758 * Returns the columns that make a key to uniquely identify a
3759 * row in this <code>JoinRowSetImpl</code> object.
3760 *
3761 * @return an array of column number that constites a primary
3762 * key for this rowset. This array should be empty
3763 * if no columns is representitive of a primary key
3764 * @throws SQLException if the rowset is empty or no columns
3765 * are designated as primary keys
3766 * @see #setKeyColumns
3767 */
3768 public int[] getKeyColumns() throws SQLException {
3769 return crsInternal.getKeyColumns();
3770 }
3771
3772 /**
3773 * Sets this <code>JoinRowSetImpl</code> object's
3774 * <code>keyCols</code> field with the given array of column
3775 * numbers, which forms a key for uniquely identifying a row
3776 * in this rowset.
3777 *
3778 * @param cols an array of <code>int</code> indicating the
3779 * columns that form a primary key for this
3780 * <code>JoinRowSetImpl</code> object; every
3781 * element in the array must be greater than
3782 * <code>0</code> and less than or equal to the number
3783 * of columns in this rowset
3784 * @throws SQLException if any of the numbers in the
3785 * given array is not valid for this rowset
3786 * @see #getKeyColumns
3787 */
3788 public void setKeyColumns(int[] cols) throws SQLException {
3789 crsInternal.setKeyColumns(cols);
3790 }
3791
3792 /**
3793 * Sets the designated column in either the current row or the insert
3794 * row of this <code>JoinRowSetImpl</code> object with the given
3795 * <code>Ref</code> value.
3796 * <P>
3797 * This method updates a column value in the current row or the insert
3798 * row of this rowset, but it does not update the database.
3799 * If the cursor is on a row in the rowset, the
3800 * method {@link #updateRow} must be called to update the database.
3801 * If the cursor is on the insert row, the method {@link #insertRow}
3802 * must be called, which will insert the new row into both this rowset
3803 * and the database. Either of these methods must be called before the
3804 * cursor moves to another row.
3805 *
3806 * @param columnIndex the first column is <code>1</code>, the second
3807 * is <code>2</code>, and so on; must be <code>1</code> or larger
3808 * and equal to or less than the number of columns in this rowset
3809 * @param ref the <code>java.sql.Ref</code> object that will be set as
3810 * the new column value
3811 * @throws SQLException if (1) the given column index is out of bounds,
3812 * (2) the cursor is not on one of this rowset's rows or its
3813 * insert row, or (3) this rowset is
3814 * <code>ResultSet.CONCUR_READ_ONLY</code>
3815 */
3816 public void updateRef(int columnIndex, java.sql.Ref ref) throws SQLException {
3817 crsInternal.updateRef(columnIndex, ref);
3818 }
3819
3820 /**
3821 * Sets the designated column in either the current row or the insert
3822 * row of this <code>JoinRowSetImpl</code> object with the given
3823 * <code>Ref</code> value.
3824 * <P>
3825 * This method updates a column value in the current row or the insert
3826 * row of this rowset, but it does not update the database.
3827 * If the cursor is on a row in the rowset, the
3828 * method {@link #updateRow} must be called to update the database.
3829 * If the cursor is on the insert row, the method {@link #insertRow}
3830 * must be called, which will insert the new row into both this rowset
3831 * and the database. Either of these methods must be called before the
3832 * cursor moves to another row.
3833 *
3834 * @param columnName a <code>String</code> object giving the name of the column
3835 * to be updated; must match one of the column names in this
3836 * <code>JoinRowSetImpl</code> object
3837 * @param ref the <code>java.sql.Ref</code> object that will be set as
3838 * the new column value
3839 * @throws SQLException if (1) the given column name is not valid,
3840 * (2) the cursor is not on one of this rowset's rows or its
3841 * insert row, or (3) this rowset is
3842 * <code>ResultSet.CONCUR_READ_ONLY</code>
3843 */
3844 public void updateRef(String columnName, java.sql.Ref ref) throws SQLException {
3845 crsInternal.updateRef(columnName, ref);
3846 }
3847
3848 /**
3849 * Sets the designated column in either the current row or the insert
3850 * row of this <code>JoinRowSetImpl</code> object with the given
3851 * <code>Clob</code> object.
3852 * <P>
3853 * This method updates a column value in the current row or the insert
3854 * row of this rowset, but it does not update the database.
3855 * If the cursor is on a row in the rowset, the
3856 * method {@link #updateRow} must be called to update the database.
3857 * If the cursor is on the insert row, the method {@link #insertRow}
3858 * must be called, which will insert the new row into both this rowset
3859 * and the database. Either of these methods must be called before the
3860 * cursor moves to another row.
3861 *
3862 * @param columnIndex the first column is <code>1</code>, the second
3863 * is <code>2</code>, and so on; must be <code>1</code> or larger
3864 * and equal to or less than the number of columns in this rowset
3865 * @param c the <code>java.sql.Clob</code> object that will be set as
3866 * the new column value
3867 * @throws SQLException if (1) the given column index is out of bounds,
3868 * (2) the cursor is not on one of this rowset's rows or its
3869 * insert row, or (3) this rowset is
3870 * <code>ResultSet.CONCUR_READ_ONLY</code>
3871 */
3872 public void updateClob(int columnIndex, Clob c) throws SQLException {
3873 crsInternal.updateClob(columnIndex, c);
3874 }
3875
3876 /**
3877 * Sets the designated column in either the current row or the insert
3878 * row of this <code>JoinRowSetImpl</code> object with the given
3879 * <code>Clob</code> object.
3880 * <P>
3881 * This method updates a column value in the current row or the insert
3882 * row of this rowset, but it does not update the database.
3883 * If the cursor is on a row in the rowset, the
3884 * method {@link #updateRow} must be called to update the database.
3885 * If the cursor is on the insert row, the method {@link #insertRow}
3886 * must be called, which will insert the new row into both this rowset
3887 * and the database. Either of these methods must be called before the
3888 * cursor moves to another row.
3889 *
3890 * @param columnName a <code>String</code> object giving the name of the column
3891 * to be updated; must match one of the column names in this
3892 * <code>JoinRowSetImpl</code> object
3893 * @param c the <code>java.sql.Clob</code> object that will be set as
3894 * the new column value
3895 * @throws SQLException if (1) the given column name is not valid,
3896 * (2) the cursor is not on one of this rowset's rows or its
3897 * insert row, or (3) this rowset is
3898 * <code>ResultSet.CONCUR_READ_ONLY</code>
3899 */
3900 public void updateClob(String columnName, Clob c) throws SQLException {
3901 crsInternal.updateClob(columnName, c);
3902 }
3903
3904 /**
3905 * Sets the designated column in either the current row or the insert
3906 * row of this <code>JoinRowSetImpl</code> object with the given
3907 * <code>Blob</code> value.
3908 * <P>
3909 * This method updates a column value in the current row or the insert
3910 * row of this rowset, but it does not update the database.
3911 * If the cursor is on a row in the rowset, the
3912 * method {@link #updateRow} must be called to update the database.
3913 * If the cursor is on the insert row, the method {@link #insertRow}
3914 * must be called, which will insert the new row into both this rowset
3915 * and the database. Either of these methods must be called before the
3916 * cursor moves to another row.
3917 *
3918 * @param columnIndex the first column is <code>1</code>, the second
3919 * is <code>2</code>, and so on; must be <code>1</code> or larger
3920 * and equal to or less than the number of columns in this rowset
3921 * @param b the <code>java.sql.Blob</code> object that will be set as
3922 * the new column value
3923 * @throws SQLException if (1) the given column index is out of bounds,
3924 * (2) the cursor is not on one of this rowset's rows or its
3925 * insert row, or (3) this rowset is
3926 * <code>ResultSet.CONCUR_READ_ONLY</code>
3927 */
3928 public void updateBlob(int columnIndex, Blob b) throws SQLException {
3929 crsInternal.updateBlob(columnIndex, b);
3930 }
3931
3932 /**
3933 * Sets the designated column in either the current row or the insert
3934 * row of this <code>JoinRowSetImpl</code> object with the given
3935 * <code>Blob</code> object.
3936 * <P>
3937 * This method updates a column value in the current row or the insert
3938 * row of this rowset, but it does not update the database.
3939 * If the cursor is on a row in the rowset, the
3940 * method {@link #updateRow} must be called to update the database.
3941 * If the cursor is on the insert row, the method {@link #insertRow}
3942 * must be called, which will insert the new row into both this rowset
3943 * and the database. Either of these methods must be called before the
3944 * cursor moves to another row.
3945 *
3946 * @param columnName a <code>String</code> object giving the name of the column
3947 * to be updated; must match one of the column names in this
3948 * <code>JoinRowSetImpl</code> object
3949 * @param b the <code>java.sql.Blob</code> object that will be set as
3950 * the new column value
3951 * @throws SQLException if (1) the given column name is not valid,
3952 * (2) the cursor is not on one of this rowset's rows or its
3953 * insert row, or (3) this rowset is
3954 * <code>ResultSet.CONCUR_READ_ONLY</code>
3955 */
3956 public void updateBlob(String columnName, Blob b) throws SQLException {
3957 crsInternal.updateBlob(columnName, b);
3958 }
3959
3960 /**
3961 * Sets the designated column in either the current row or the insert
3962 * row of this <code>JoinRowSetImpl</code> object with the given
3963 * <code>Array</code> object.
3964 * <P>
3965 * This method updates a column value in the current row or the insert
3966 * row of this rowset, but it does not update the database.
3967 * If the cursor is on a row in the rowset, the
3968 * method {@link #updateRow} must be called to update the database.
3969 * If the cursor is on the insert row, the method {@link #insertRow}
3970 * must be called, which will insert the new row into both this rowset
3971 * and the database. Either of these methods must be called before the
3972 * cursor moves to another row.
3973 *
3974 * @param columnIndex the first column is <code>1</code>, the second
3975 * is <code>2</code>, and so on; must be <code>1</code> or larger
3976 * and equal to or less than the number of columns in this rowset
3977 * @param a the <code>java.sql.Array</code> object that will be set as
3978 * the new column value
3979 * @throws SQLException if (1) the given column index is out of bounds,
3980 * (2) the cursor is not on one of this rowset's rows or its
3981 * insert row, or (3) this rowset is
3982 * <code>ResultSet.CONCUR_READ_ONLY</code>
3983 */
3984 public void updateArray(int columnIndex, Array a) throws SQLException {
3985 crsInternal.updateArray(columnIndex, a);
3986 }
3987
3988 /**
3989 * Sets the designated column in either the current row or the insert
3990 * row of this <code>JoinRowSetImpl</code> object with the given
3991 * <code>Array</code> object.
3992 * <P>
3993 * This method updates a column value in the current row or the insert
3994 * row of this rowset, but it does not update the database.
3995 * If the cursor is on a row in the rowset, the
3996 * method {@link #updateRow} must be called to update the database.
3997 * If the cursor is on the insert row, the method {@link #insertRow}
3998 * must be called, which will insert the new row into both this rowset
3999 * and the database. Either of these methods must be called before the
4000 * cursor moves to another row.
4001 *
4002 * @param columnName a <code>String</code> object giving the name of the column
4003 * to be updated; must match one of the column names in this
4004 * <code>JoinRowSetImpl</code> object
4005 * @param a the <code>java.sql.Array</code> object that will be set as
4006 * the new column value
4007 * @throws SQLException if (1) the given column name is not valid,
4008 * (2) the cursor is not on one of this rowset's rows or its
4009 * insert row, or (3) this rowset is
4010 * <code>ResultSet.CONCUR_READ_ONLY</code>
4011 */
4012 public void updateArray(String columnName, Array a) throws SQLException {
4013 crsInternal.updateArray(columnName, a);
4014 }
4015
4016 /**
4017 * Populates this <code>JoinRowSetImpl</code> object with data.
4018 * This form of the method uses the rowset's user, password, and url or
4019 * data source name properties to create a database
4020 * connection. If properties that are needed
4021 * have not been set, this method will throw an exception.
4022 * <P>
4023 * Another form of this method uses an existing JDBC <code>Connection</code>
4024 * object instead of creating a new one; therefore, it ignores the
4025 * properties used for establishing a new connection.
4026 * <P>
4027 * The query specified by the command property is executed to create a
4028 * <code>ResultSet</code> object from which to retrieve data.
4029 * The current contents of the rowset are discarded, and the
4030 * rowset's metadata is also (re)set. If there are outstanding updates,
4031 * they are also ignored.
4032 * <P>
4033 * The method <code>execute</code> closes any database connections that it
4034 * creates.
4035 *
4036 * @throws SQLException if an error occurs or the
4037 * necessary properties have not been set
4038 */
4039 public void execute() throws SQLException {
4040 crsInternal.execute();
4041 }
4042
4043 /**
4044 * Populates this <code>JoinRowSetImpl</code> object with data,
4045 * using the given connection to produce the result set from
4046 * which data will be read. A second form of this method,
4047 * which takes no arguments, uses the values from this rowset's
4048 * user, password, and either url or data source properties to
4049 * create a new database connection. The form of <code>execute</code>
4050 * that is given a connection ignores these properties.
4051 *
4052 * @param conn A standard JDBC <code>Connection</code> object with valid
4053 * properties that the <code>JoinRowSet</code> implementation
4054 * can pass to a synchronization provider to establish a
4055 * connection to the datasource
4056 * @throws SQLException if an invalid <code>Connection</code> is supplied
4057 * or an error occurs in establishing the connection to the
4058 * data soure
4059 * @see java.sql.Connection
4060 */
4061 public void execute(Connection conn) throws SQLException {
4062 crsInternal.execute(conn);
4063 }
4064
4065 /**
4066 * Provide interface coverage for getURL(int) in
4067 * ResultSet{@literal ->}RowSet
4068 */
4069 public java.net.URL getURL(int columnIndex) throws SQLException {
4070 return crsInternal.getURL(columnIndex);
4071 }
4072
4073 /**
4074 * Provide interface coverage for getURL(String) in
4075 * ResultSet{@literal ->}RowSet
4076 */
4077 public java.net.URL getURL(String columnName) throws SQLException {
4078 return crsInternal.getURL(columnName);
4079 }
4080
4081 /**
4082 * Creates a new <code>WebRowSet</code> object, populates it with the
4083 * data in the given <code>ResultSet</code> object, and writes it
4084 * to the given <code>java.io.Writer</code> object in XML format.
4085 *
4086 * @throws SQLException if an error occurs writing out the rowset
4087 * contents to XML
4088 */
4089 public void writeXml(ResultSet rs, java.io.Writer writer)
4090 throws SQLException {
4091 wrs = new WebRowSetImpl();
4092 wrs.populate(rs);
4093 wrs.writeXml(writer);
4094 }
4095
4096 /**
4097 * Writes this <code>JoinRowSet</code> object to the given
4098 * <code>java.io.Writer</code> object in XML format. In
4099 * addition to the rowset's data, its properties and metadata
4100 * are also included.
4101 *
4102 * @throws SQLException if an error occurs writing out the rowset
4103 * contents to XML
4104 */
4105 public void writeXml(java.io.Writer writer) throws SQLException {
4106 createWebRowSet().writeXml(writer);
4107}
4108
4109 /**
4110 * Reads this <code>JoinRowSet</code> object in its XML format.
4111 *
4112 * @throws SQLException if a database access error occurs
4113 */
4114 public void readXml(java.io.Reader reader) throws SQLException {
4115 wrs = new WebRowSetImpl();
4116 wrs.readXml(reader);
4117 crsInternal = (CachedRowSetImpl)wrs;
4118 }
4119
4120 // Stream based methods
4121 /**
4122 * Reads a stream based XML input to populate an <code>WebRowSet</code>
4123 *
4124 * @throws SQLException if a data source access occurs
4125 * @throws IOException if a IO exception occurs
4126 */
4127 public void readXml(java.io.InputStream iStream) throws SQLException, IOException {
4128 wrs = new WebRowSetImpl();
4129 wrs.readXml(iStream);
4130 crsInternal = (CachedRowSetImpl)wrs;
4131 }
4132
4133 /**
4134 * Creates an output stream of the internal state and contents of a
4135 * <code>WebRowSet</code> for XML proceessing
4136 *
4137 * @throws SQLException if a datasource access occurs
4138 * @throws IOException if an IO exception occurs
4139 */
4140 public void writeXml(java.io.OutputStream oStream) throws SQLException, IOException {
4141 createWebRowSet().writeXml(oStream);
4142 }
4143
4144 /**
4145 * Creates a new <code>WebRowSet</code> object, populates it with
4146 * the contents of the <code>ResultSet</code> and creates an output
4147 * streams the internal state and contents of the rowset for XML processing.
4148 *
4149 * @throws SQLException if a datasource access occurs
4150 * @throws IOException if an IO exception occurs
4151 */
4152 public void writeXml(ResultSet rs, java.io.OutputStream oStream) throws SQLException, IOException {
4153 wrs = new WebRowSetImpl();
4154 wrs.populate(rs);
4155 wrs.writeXml(oStream);
4156 }
4157
4158 /**
4159 * %%% Javadoc comments to be added here
4160 */
4161 private WebRowSet createWebRowSet() throws SQLException {
4162 if(wrs != null) {
4163 // check if it has already been initialized.
4164 return wrs;
4165 } else {
4166 wrs = new WebRowSetImpl();
4167 crsInternal.beforeFirst();
4168 wrs.populate(crsInternal);
4169 return wrs;
4170 }
4171 }
4172
4173 /**
4174 * Returns the last set SQL <code>JOIN</code> type in this JoinRowSetImpl
4175 * object
4176 *
4177 * @return joinType One of the standard JoinRowSet static field JOIN types
4178 * @throws SQLException if an error occurs determining the current join type
4179 */
4180 public int getJoinType() throws SQLException {
4181 if (vecJoinType == null) {
4182 // Default JoinRowSet type
4183 this.setJoinType(JoinRowSet.INNER_JOIN);
4184 }
4185 Integer i = vecJoinType.get(vecJoinType.size()-1);
4186 return i.intValue();
4187 }
4188
4189 /**
4190 * The listener will be notified whenever an event occurs on this <code>JoinRowSet</code>
4191 * object.
4192 * <P>
4193 * A listener might, for example, be a table or graph that needs to
4194 * be updated in order to accurately reflect the current state of
4195 * the <code>RowSet</code> object.
4196 * <p>
4197 * <b>Note</b>: if the <code>RowSetListener</code> object is
4198 * <code>null</code>, this method silently discards the <code>null</code>
4199 * value and does not add a null reference to the set of listeners.
4200 * <p>
4201 * <b>Note</b>: if the listener is already set, and the new <code>RowSetListerner</code>
4202 * instance is added to the set of listeners already registered to receive
4203 * event notifications from this <code>RowSet</code>.
4204 *
4205 * @param listener an object that has implemented the
4206 * <code>javax.sql.RowSetListener</code> interface and wants to be notified
4207 * of any events that occur on this <code>JoinRowSet</code> object; May be
4208 * null.
4209 * @see #removeRowSetListener
4210 */
4211 public void addRowSetListener(RowSetListener listener) {
4212 crsInternal.addRowSetListener(listener);
4213 }
4214
4215 /**
4216 * Removes the designated object from this <code>JoinRowSet</code> object's list of listeners.
4217 * If the given argument is not a registered listener, this method
4218 * does nothing.
4219 *
4220 * <b>Note</b>: if the <code>RowSetListener</code> object is
4221 * <code>null</code>, this method silently discards the <code>null</code>
4222 * value.
4223 *
4224 * @param listener a <code>RowSetListener</code> object that is on the list
4225 * of listeners for this <code>JoinRowSet</code> object
4226 * @see #addRowSetListener
4227 */
4228 public void removeRowSetListener(RowSetListener listener) {
4229 crsInternal.removeRowSetListener(listener);
4230 }
4231
4232 /**
4233 * Converts this <code>JoinRowSetImpl</code> object to a collection
4234 * of tables. The sample implementation utilitizes the <code>TreeMap</code>
4235 * collection type.
4236 * This class guarantees that the map will be in ascending key order,
4237 * sorted according to the natural order for the key's class.
4238 *
4239 * @return a <code>Collection</code> object consisting of tables,
4240 * each of which is a copy of a row in this
4241 * <code>JoinRowSetImpl</code> object
4242 * @throws SQLException if an error occurs in generating the collection
4243 * @see #toCollection(int)
4244 * @see #toCollection(String)
4245 * @see java.util.TreeMap
4246 */
4247 public Collection<?> toCollection() throws SQLException {
4248 return crsInternal.toCollection();
4249 }
4250
4251 /**
4252 * Returns the specified column of this <code>JoinRowSetImpl</code> object
4253 * as a <code>Collection</code> object. This method makes a copy of the
4254 * column's data and utilitizes the <code>Vector</code> to establish the
4255 * collection. The <code>Vector</code> class implements a growable array
4256 * objects allowing the individual components to be accessed using an
4257 * an integer index similar to that of an array.
4258 *
4259 * @return a <code>Collection</code> object that contains the value(s)
4260 * stored in the specified column of this
4261 * <code>JoinRowSetImpl</code>
4262 * object
4263 * @throws SQLException if an error occurs generated the collection; or
4264 * an invalid column is provided.
4265 * @see #toCollection()
4266 * @see #toCollection(String)
4267 * @see java.util.Vector
4268 */
4269 public Collection<?> toCollection(int column) throws SQLException {
4270 return crsInternal.toCollection(column);
4271 }
4272
4273 /**
4274 * Returns the specified column of this <code>JoinRowSetImpl</code> object
4275 * as a <code>Collection</code> object. This method makes a copy of the
4276 * column's data and utilitizes the <code>Vector</code> to establish the
4277 * collection. The <code>Vector</code> class implements a growable array
4278 * objects allowing the individual components to be accessed using an
4279 * an integer index similar to that of an array.
4280 *
4281 * @return a <code>Collection</code> object that contains the value(s)
4282 * stored in the specified column of this
4283 * <code>JoinRowSetImpl</code>
4284 * object
4285 * @throws SQLException if an error occurs generated the collection; or
4286 * an invalid column is provided.
4287 * @see #toCollection()
4288 * @see #toCollection(int)
4289 * @see java.util.Vector
4290 */
4291 public Collection<?> toCollection(String column) throws SQLException {
4292 return crsInternal.toCollection(column);
4293 }
4294
4295 /**
4296 * Creates a <code>RowSet</code> object that is a copy of
4297 * this <code>JoinRowSetImpl</code> object's table structure
4298 * and the constraints only.
4299 * There will be no data in the object being returned.
4300 * Updates made on a copy are not visible to the original rowset.
4301 * <P>
4302 * This helps in getting the underlying XML schema which can
4303 * be used as the basis for populating a <code>WebRowSet</code>.
4304 *
4305 * @return a new <code>CachedRowSet</code> object that is a copy
4306 * of this <code>JoinRowSetImpl</code> object's schema and
4307 * retains all the constraints on the original rowset but contains
4308 * no data
4309 * @throws SQLException if an error occurs in generating the copy
4310 * of the <code>CachedRowSet</code> object
4311 * @see #createShared
4312 * @see #createCopy
4313 * @see #createCopyNoConstraints
4314 * @see javax.sql.RowSetEvent
4315 * @see javax.sql.RowSetListener
4316 */
4317 public CachedRowSet createCopySchema() throws SQLException {
4318 return crsInternal.createCopySchema();
4319 }
4320
4321 /**
4322 * {@inheritDoc}
4323 */
4324 public void setSyncProvider(String providerStr) throws SQLException {
4325 crsInternal.setSyncProvider(providerStr);
4326 }
4327
4328 /**
4329 * {@inheritDoc}
4330 */
4331 public void acceptChanges() throws SyncProviderException {
4332 crsInternal.acceptChanges();
4333 }
4334
4335 /**
4336 * {@inheritDoc}
4337 */
4338 public SyncProvider getSyncProvider() throws SQLException {
4339 return crsInternal.getSyncProvider();
4340 }
4341
4342 /**
4343 * This method re populates the resBundle
4344 * during the deserialization process
4345 *
4346 */
4347 private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
4348 // Default state initialization happens here
4349 ois.defaultReadObject();
4350 // Initialization of transient Res Bundle happens here .
4351 try {
4352 resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
4353 } catch(IOException ioe) {
4354 throw new RuntimeException(ioe);
4355 }
4356
4357 }
4358
4359 static final long serialVersionUID = -5590501621560008453L;
4360}
4361