Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java
38919 views
1
/*
2
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package com.sun.rowset;
27
28
import java.sql.*;
29
import javax.sql.*;
30
import java.io.*;
31
import java.math.*;
32
import java.util.*;
33
import java.text.*;
34
35
import javax.sql.rowset.*;
36
import javax.sql.rowset.spi.*;
37
import javax.sql.rowset.serial.*;
38
import com.sun.rowset.internal.*;
39
import com.sun.rowset.providers.*;
40
import sun.reflect.misc.ReflectUtil;
41
42
/**
43
* The standard implementation of the <code>CachedRowSet</code> interface.
44
*
45
* See interface definition for full behavior and implementation requirements.
46
* This reference implementation has made provision for a one-to-one write back
47
* facility and it is curremtly be possible to change the peristence provider
48
* during the life-time of any CachedRowSetImpl.
49
*
50
* @author Jonathan Bruce, Amit Handa
51
*/
52
53
public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetInternal, Serializable, Cloneable, CachedRowSet {
54
55
/**
56
* The <code>SyncProvider</code> used by the CachedRowSet
57
*/
58
private SyncProvider provider;
59
60
/**
61
* The <code>RowSetReaderImpl</code> object that is the reader
62
* for this rowset. The method <code>execute</code> uses this
63
* reader as part of its implementation.
64
* @serial
65
*/
66
private RowSetReader rowSetReader;
67
68
/**
69
* The <code>RowSetWriterImpl</code> object that is the writer
70
* for this rowset. The method <code>acceptChanges</code> uses
71
* this writer as part of its implementation.
72
* @serial
73
*/
74
private RowSetWriter rowSetWriter;
75
76
/**
77
* The <code>Connection</code> object that connects with this
78
* <code>CachedRowSetImpl</code> object's current underlying data source.
79
*/
80
private transient Connection conn;
81
82
/**
83
* The <code>ResultSetMetaData</code> object that contains information
84
* about the columns in the <code>ResultSet</code> object that is the
85
* current source of data for this <code>CachedRowSetImpl</code> object.
86
*/
87
private transient ResultSetMetaData RSMD;
88
89
/**
90
* The <code>RowSetMetaData</code> object that contains information about
91
* the columns in this <code>CachedRowSetImpl</code> object.
92
* @serial
93
*/
94
private RowSetMetaDataImpl RowSetMD;
95
96
// Properties of this RowSet
97
98
/**
99
* An array containing the columns in this <code>CachedRowSetImpl</code>
100
* object that form a unique identifier for a row. This array
101
* is used by the writer.
102
* @serial
103
*/
104
private int keyCols[];
105
106
/**
107
* The name of the table in the underlying database to which updates
108
* should be written. This name is needed because most drivers
109
* do not return this information in a <code>ResultSetMetaData</code>
110
* object.
111
* @serial
112
*/
113
private String tableName;
114
115
/**
116
* A <code>Vector</code> object containing the <code>Row</code>
117
* objects that comprise this <code>CachedRowSetImpl</code> object.
118
* @serial
119
*/
120
private Vector<Object> rvh;
121
122
/**
123
* The current position of the cursor in this <code>CachedRowSetImpl</code>
124
* object.
125
* @serial
126
*/
127
private int cursorPos;
128
129
/**
130
* The current position of the cursor in this <code>CachedRowSetImpl</code>
131
* object not counting rows that have been deleted, if any.
132
* <P>
133
* For example, suppose that the cursor is on the last row of a rowset
134
* that started with five rows and subsequently had the second and third
135
* rows deleted. The <code>absolutePos</code> would be <code>3</code>,
136
* whereas the <code>cursorPos</code> would be <code>5</code>.
137
* @serial
138
*/
139
private int absolutePos;
140
141
/**
142
* The number of deleted rows currently in this <code>CachedRowSetImpl</code>
143
* object.
144
* @serial
145
*/
146
private int numDeleted;
147
148
/**
149
* The total number of rows currently in this <code>CachedRowSetImpl</code>
150
* object.
151
* @serial
152
*/
153
private int numRows;
154
155
/**
156
* A special row used for constructing a new row. A new
157
* row is constructed by using <code>ResultSet.updateXXX</code>
158
* methods to insert column values into the insert row.
159
* @serial
160
*/
161
private InsertRow insertRow;
162
163
/**
164
* A <code>boolean</code> indicating whether the cursor is
165
* currently on the insert row.
166
* @serial
167
*/
168
private boolean onInsertRow;
169
170
/**
171
* The field that temporarily holds the last position of the
172
* cursor before it moved to the insert row, thus preserving
173
* the number of the current row to which the cursor may return.
174
* @serial
175
*/
176
private int currentRow;
177
178
/**
179
* A <code>boolean</code> indicating whether the last value
180
* returned was an SQL <code>NULL</code>.
181
* @serial
182
*/
183
private boolean lastValueNull;
184
185
/**
186
* A <code>SQLWarning</code> which logs on the warnings
187
*/
188
private SQLWarning sqlwarn;
189
190
/**
191
* Used to track match column for JoinRowSet consumption
192
*/
193
private String strMatchColumn ="";
194
195
/**
196
* Used to track match column for JoinRowSet consumption
197
*/
198
private int iMatchColumn = -1;
199
200
/**
201
* A <code>RowSetWarning</code> which logs on the warnings
202
*/
203
private RowSetWarning rowsetWarning;
204
205
/**
206
* The default SyncProvider for the RI CachedRowSetImpl
207
*/
208
private String DEFAULT_SYNC_PROVIDER = "com.sun.rowset.providers.RIOptimisticProvider";
209
210
/**
211
* The boolean variable indicating locatorsUpdateValue
212
*/
213
private boolean dbmslocatorsUpdateCopy;
214
215
/**
216
* The <code>ResultSet</code> object that is used to maintain the data when
217
* a ResultSet and start position are passed as parameters to the populate function
218
*/
219
private transient ResultSet resultSet;
220
221
/**
222
* The integer value indicating the end position in the ResultSetwhere the picking
223
* up of rows for populating a CachedRowSet object was left off.
224
*/
225
private int endPos;
226
227
/**
228
* The integer value indicating the end position in the ResultSetwhere the picking
229
* up of rows for populating a CachedRowSet object was left off.
230
*/
231
private int prevEndPos;
232
233
/**
234
* The integer value indicating the position in the ResultSet, to populate the
235
* CachedRowSet object.
236
*/
237
private int startPos;
238
239
/**
240
* The integer value indicating the position from where the page prior to this
241
* was populated.
242
*/
243
private int startPrev;
244
245
/**
246
* The integer value indicating size of the page.
247
*/
248
private int pageSize;
249
250
/**
251
* The integer value indicating number of rows that have been processed so far.
252
* Used for checking whether maxRows has been reached or not.
253
*/
254
private int maxRowsreached;
255
/**
256
* The boolean value when true signifies that pages are still to follow and a
257
* false value indicates that this is the last page.
258
*/
259
private boolean pagenotend = true;
260
261
/**
262
* The boolean value indicating whether this is the first page or not.
263
*/
264
private boolean onFirstPage;
265
266
/**
267
* The boolean value indicating whether this is the last page or not.
268
*/
269
private boolean onLastPage;
270
271
/**
272
* The integer value indicating how many times the populate function has been called.
273
*/
274
private int populatecallcount;
275
276
/**
277
* The integer value indicating the total number of rows to be processed in the
278
* ResultSet object passed to the populate function.
279
*/
280
private int totalRows;
281
282
/**
283
* The boolean value indicating how the CahedRowSet object has been populated for
284
* paging purpose. True indicates that connection parameter is passed.
285
*/
286
private boolean callWithCon;
287
288
/**
289
* CachedRowSet reader object to read the data from the ResultSet when a connection
290
* parameter is passed to populate the CachedRowSet object for paging.
291
*/
292
private CachedRowSetReader crsReader;
293
294
/**
295
* The Vector holding the Match Columns
296
*/
297
private Vector<Integer> iMatchColumns;
298
299
/**
300
* The Vector that will hold the Match Column names.
301
*/
302
private Vector<String> strMatchColumns;
303
304
/**
305
* Trigger that indicates whether the active SyncProvider is exposes the
306
* additional TransactionalWriter method
307
*/
308
private boolean tXWriter = false;
309
310
/**
311
* The field object for a transactional RowSet writer
312
*/
313
private TransactionalWriter tWriter = null;
314
315
protected transient JdbcRowSetResourceBundle resBundle;
316
317
private boolean updateOnInsert;
318
319
320
321
/**
322
* Constructs a new default <code>CachedRowSetImpl</code> object with
323
* the capacity to hold 100 rows. This new object has no metadata
324
* and has the following default values:
325
* <pre>
326
* onInsertRow = false
327
* insertRow = null
328
* cursorPos = 0
329
* numRows = 0
330
* showDeleted = false
331
* queryTimeout = 0
332
* maxRows = 0
333
* maxFieldSize = 0
334
* rowSetType = ResultSet.TYPE_SCROLL_INSENSITIVE
335
* concurrency = ResultSet.CONCUR_UPDATABLE
336
* readOnly = false
337
* isolation = Connection.TRANSACTION_READ_COMMITTED
338
* escapeProcessing = true
339
* onInsertRow = false
340
* insertRow = null
341
* cursorPos = 0
342
* absolutePos = 0
343
* numRows = 0
344
* </pre>
345
* A <code>CachedRowSetImpl</code> object is configured to use the default
346
* <code>RIOptimisticProvider</code> implementation to provide connectivity
347
* and synchronization capabilities to the set data source.
348
* <P>
349
* @throws SQLException if an error occurs
350
*/
351
public CachedRowSetImpl() throws SQLException {
352
353
try {
354
resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
355
} catch(IOException ioe) {
356
throw new RuntimeException(ioe);
357
}
358
359
// set the Reader, this maybe overridden latter
360
provider =
361
SyncFactory.getInstance(DEFAULT_SYNC_PROVIDER);
362
363
if (!(provider instanceof RIOptimisticProvider)) {
364
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidp").toString());
365
}
366
367
rowSetReader = (CachedRowSetReader)provider.getRowSetReader();
368
rowSetWriter = (CachedRowSetWriter)provider.getRowSetWriter();
369
370
// allocate the parameters collection
371
initParams();
372
373
initContainer();
374
375
// set up some default values
376
initProperties();
377
378
// insert row setup
379
onInsertRow = false;
380
insertRow = null;
381
382
// set the warninings
383
sqlwarn = new SQLWarning();
384
rowsetWarning = new RowSetWarning();
385
386
}
387
388
/**
389
* Provides a <code>CachedRowSetImpl</code> instance with the same default properties as
390
* as the zero parameter constructor.
391
* <pre>
392
* onInsertRow = false
393
* insertRow = null
394
* cursorPos = 0
395
* numRows = 0
396
* showDeleted = false
397
* queryTimeout = 0
398
* maxRows = 0
399
* maxFieldSize = 0
400
* rowSetType = ResultSet.TYPE_SCROLL_INSENSITIVE
401
* concurrency = ResultSet.CONCUR_UPDATABLE
402
* readOnly = false
403
* isolation = Connection.TRANSACTION_READ_COMMITTED
404
* escapeProcessing = true
405
* onInsertRow = false
406
* insertRow = null
407
* cursorPos = 0
408
* absolutePos = 0
409
* numRows = 0
410
* </pre>
411
*
412
* However, applications will have the means to specify at runtime the
413
* desired <code>SyncProvider</code> object.
414
* <p>
415
* For example, creating a <code>CachedRowSetImpl</code> object as follows ensures
416
* that a it is established with the <code>com.foo.provider.Impl</code> synchronization
417
* implementation providing the synchronization mechanism for this disconnected
418
* <code>RowSet</code> object.
419
* <pre>
420
* Hashtable env = new Hashtable();
421
* env.put(javax.sql.rowset.spi.SyncFactory.ROWSET_PROVIDER_NAME,
422
* "com.foo.provider.Impl");
423
* CachedRowSetImpl crs = new CachedRowSet(env);
424
* </pre>
425
* <p>
426
* Calling this constructor with a <code>null</code> parameter will
427
* cause the <code>SyncFactory</code> to provide the reference
428
* optimistic provider <code>com.sun.rowset.providers.RIOptimisticProvider</code>.
429
* <p>
430
* In addition, the following properties can be associated with the
431
* provider to assist in determining the choice of the synchronizaton
432
* provider such as:
433
* <ul>
434
* <li><code>ROWSET_SYNC_PROVIDER</code> - the property specifying the the
435
* <code>SyncProvider</code> class name to be instantiated by the
436
* <code>SyncFacttory</code>
437
* <li><code>ROWSET_SYNC_VENDOR</code> - the property specifying the software
438
* vendor associated with a <code>SyncProvider</code> implementation.
439
* <li><code>ROWSET_SYNC_PROVIDER_VER</code> - the property specifying the
440
* version of the <code>SyncProvider</code> implementation provided by the
441
* software vendor.
442
* </ul>
443
* More specific detailes are available in the <code>SyncFactory</code>
444
* and <code>SyncProvider</code> specificiations later in this document.
445
* <p>
446
* @param env a <code>Hashtable</code> object with a list of desired
447
* synchronization providers
448
* @throws SQLException if the requested provider cannot be found by the
449
* synchronization factory
450
* @see SyncProvider
451
*/
452
public CachedRowSetImpl(@SuppressWarnings("rawtypes") Hashtable env) throws SQLException {
453
454
455
try {
456
resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
457
} catch(IOException ioe) {
458
throw new RuntimeException(ioe);
459
}
460
461
if (env == null) {
462
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.nullhash").toString());
463
}
464
465
String providerName = (String)env.get(
466
javax.sql.rowset.spi.SyncFactory.ROWSET_SYNC_PROVIDER);
467
468
// set the Reader, this maybe overridden latter
469
provider =
470
SyncFactory.getInstance(providerName);
471
472
rowSetReader = provider.getRowSetReader();
473
rowSetWriter = provider.getRowSetWriter();
474
475
initParams(); // allocate the parameters collection
476
initContainer();
477
initProperties(); // set up some default values
478
}
479
480
/**
481
* Sets the <code>rvh</code> field to a new <code>Vector</code>
482
* object with a capacity of 100 and sets the
483
* <code>cursorPos</code> and <code>numRows</code> fields to zero.
484
*/
485
private void initContainer() {
486
487
rvh = new Vector<Object>(100);
488
cursorPos = 0;
489
absolutePos = 0;
490
numRows = 0;
491
numDeleted = 0;
492
}
493
494
/**
495
* Sets the properties for this <code>CachedRowSetImpl</code> object to
496
* their default values. This method is called internally by the
497
* default constructor.
498
*/
499
500
private void initProperties() throws SQLException {
501
502
if(resBundle == null) {
503
try {
504
resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
505
} catch(IOException ioe) {
506
throw new RuntimeException(ioe);
507
}
508
}
509
setShowDeleted(false);
510
setQueryTimeout(0);
511
setMaxRows(0);
512
setMaxFieldSize(0);
513
setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
514
setConcurrency(ResultSet.CONCUR_UPDATABLE);
515
if((rvh.size() > 0) && (isReadOnly() == false))
516
setReadOnly(false);
517
else
518
setReadOnly(true);
519
setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
520
setEscapeProcessing(true);
521
//setTypeMap(null);
522
checkTransactionalWriter();
523
524
//Instantiating the vector for MatchColumns
525
526
iMatchColumns = new Vector<Integer>(10);
527
for(int i = 0; i < 10 ; i++) {
528
iMatchColumns.add(i, -1);
529
}
530
531
strMatchColumns = new Vector<String>(10);
532
for(int j = 0; j < 10; j++) {
533
strMatchColumns.add(j,null);
534
}
535
}
536
537
/**
538
* Determine whether the SyncProvider's writer implements the
539
* <code>TransactionalWriter<code> interface
540
*/
541
private void checkTransactionalWriter() {
542
if (rowSetWriter != null) {
543
Class<?> c = rowSetWriter.getClass();
544
if (c != null) {
545
Class<?>[] theInterfaces = c.getInterfaces();
546
for (int i = 0; i < theInterfaces.length; i++) {
547
if ((theInterfaces[i].getName()).indexOf("TransactionalWriter") > 0) {
548
tXWriter = true;
549
establishTransactionalWriter();
550
}
551
}
552
}
553
}
554
}
555
556
/**
557
* Sets an private field to all transaction bounddaries to be set
558
*/
559
private void establishTransactionalWriter() {
560
tWriter = (TransactionalWriter)provider.getRowSetWriter();
561
}
562
563
//-----------------------------------------------------------------------
564
// Properties
565
//-----------------------------------------------------------------------
566
567
/**
568
* Sets this <code>CachedRowSetImpl</code> object's command property
569
* to the given <code>String</code> object and clears the parameters,
570
* if any, that were set for the previous command.
571
* <P>
572
* The command property may not be needed
573
* if the rowset is produced by a data source, such as a spreadsheet,
574
* that does not support commands. Thus, this property is optional
575
* and may be <code>null</code>.
576
*
577
* @param cmd a <code>String</code> object containing an SQL query
578
* that will be set as the command; may be <code>null</code>
579
* @throws SQLException if an error occurs
580
*/
581
public void setCommand(String cmd) throws SQLException {
582
583
super.setCommand(cmd);
584
585
if(!buildTableName(cmd).equals("")) {
586
this.setTableName(buildTableName(cmd));
587
}
588
}
589
590
591
//---------------------------------------------------------------------
592
// Reading and writing data
593
//---------------------------------------------------------------------
594
595
/**
596
* Populates this <code>CachedRowSetImpl</code> object with data from
597
* the given <code>ResultSet</code> object. This
598
* method is an alternative to the method <code>execute</code>
599
* for filling the rowset with data. The method <code>populate</code>
600
* does not require that the properties needed by the method
601
* <code>execute</code>, such as the <code>command</code> property,
602
* be set. This is true because the method <code>populate</code>
603
* is given the <code>ResultSet</code> object from
604
* which to get data and thus does not need to use the properties
605
* required for setting up a connection and executing this
606
* <code>CachedRowSetImpl</code> object's command.
607
* <P>
608
* After populating this rowset with data, the method
609
* <code>populate</code> sets the rowset's metadata and
610
* then sends a <code>RowSetChangedEvent</code> object
611
* to all registered listeners prior to returning.
612
*
613
* @param data the <code>ResultSet</code> object containing the data
614
* to be read into this <code>CachedRowSetImpl</code> object
615
* @throws SQLException if an error occurs; or the max row setting is
616
* violated while populating the RowSet
617
* @see #execute
618
*/
619
620
public void populate(ResultSet data) throws SQLException {
621
int rowsFetched;
622
Row currentRow;
623
int numCols;
624
int i;
625
Map<String, Class<?>> map = getTypeMap();
626
Object obj;
627
int mRows;
628
629
if (data == null) {
630
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.populate").toString());
631
}
632
this.resultSet = data;
633
634
// get the meta data for this ResultSet
635
RSMD = data.getMetaData();
636
637
// set up the metadata
638
RowSetMD = new RowSetMetaDataImpl();
639
initMetaData(RowSetMD, RSMD);
640
641
// release the meta-data so that aren't tempted to use it.
642
RSMD = null;
643
numCols = RowSetMD.getColumnCount();
644
mRows = this.getMaxRows();
645
rowsFetched = 0;
646
currentRow = null;
647
648
while ( data.next()) {
649
650
currentRow = new Row(numCols);
651
652
if ( rowsFetched > mRows && mRows > 0) {
653
rowsetWarning.setNextWarning(new RowSetWarning("Populating rows "
654
+ "setting has exceeded max row setting"));
655
}
656
for ( i = 1; i <= numCols; i++) {
657
/*
658
* check if the user has set a map. If no map
659
* is set then use plain getObject. This lets
660
* us work with drivers that do not support
661
* getObject with a map in fairly sensible way
662
*/
663
if (map == null || map.isEmpty()) {
664
obj = data.getObject(i);
665
} else {
666
obj = data.getObject(i, map);
667
}
668
/*
669
* the following block checks for the various
670
* types that we have to serialize in order to
671
* store - right now only structs have been tested
672
*/
673
if (obj instanceof Struct) {
674
obj = new SerialStruct((Struct)obj, map);
675
} else if (obj instanceof SQLData) {
676
obj = new SerialStruct((SQLData)obj, map);
677
} else if (obj instanceof Blob) {
678
obj = new SerialBlob((Blob)obj);
679
} else if (obj instanceof Clob) {
680
obj = new SerialClob((Clob)obj);
681
} else if (obj instanceof java.sql.Array) {
682
if(map != null)
683
obj = new SerialArray((java.sql.Array)obj, map);
684
else
685
obj = new SerialArray((java.sql.Array)obj);
686
}
687
688
currentRow.initColumnObject(i, obj);
689
}
690
rowsFetched++;
691
rvh.add(currentRow);
692
}
693
694
numRows = rowsFetched ;
695
// Also rowsFetched should be equal to rvh.size()
696
697
// notify any listeners that the rowset has changed
698
notifyRowSetChanged();
699
700
701
}
702
703
/**
704
* Initializes the given <code>RowSetMetaData</code> object with the values
705
* in the given <code>ResultSetMetaData</code> object.
706
*
707
* @param md the <code>RowSetMetaData</code> object for this
708
* <code>CachedRowSetImpl</code> object, which will be set with
709
* values from rsmd
710
* @param rsmd the <code>ResultSetMetaData</code> object from which new
711
* values for md will be read
712
* @throws SQLException if an error occurs
713
*/
714
private void initMetaData(RowSetMetaDataImpl md, ResultSetMetaData rsmd) throws SQLException {
715
int numCols = rsmd.getColumnCount();
716
717
md.setColumnCount(numCols);
718
for (int col=1; col <= numCols; col++) {
719
md.setAutoIncrement(col, rsmd.isAutoIncrement(col));
720
if(rsmd.isAutoIncrement(col))
721
updateOnInsert = true;
722
md.setCaseSensitive(col, rsmd.isCaseSensitive(col));
723
md.setCurrency(col, rsmd.isCurrency(col));
724
md.setNullable(col, rsmd.isNullable(col));
725
md.setSigned(col, rsmd.isSigned(col));
726
md.setSearchable(col, rsmd.isSearchable(col));
727
/*
728
* The PostgreSQL drivers sometimes return negative columnDisplaySize,
729
* which causes an exception to be thrown. Check for it.
730
*/
731
int size = rsmd.getColumnDisplaySize(col);
732
if (size < 0) {
733
size = 0;
734
}
735
md.setColumnDisplaySize(col, size);
736
md.setColumnLabel(col, rsmd.getColumnLabel(col));
737
md.setColumnName(col, rsmd.getColumnName(col));
738
md.setSchemaName(col, rsmd.getSchemaName(col));
739
/*
740
* Drivers return some strange values for precision, for non-numeric data, including reports of
741
* non-integer values; maybe we should check type, & set to 0 for non-numeric types.
742
*/
743
int precision = rsmd.getPrecision(col);
744
if (precision < 0) {
745
precision = 0;
746
}
747
md.setPrecision(col, precision);
748
749
/*
750
* It seems, from a bug report, that a driver can sometimes return a negative
751
* value for scale. javax.sql.rowset.RowSetMetaDataImpl will throw an exception
752
* if we attempt to set a negative value. As such, we'll check for this case.
753
*/
754
int scale = rsmd.getScale(col);
755
if (scale < 0) {
756
scale = 0;
757
}
758
md.setScale(col, scale);
759
md.setTableName(col, rsmd.getTableName(col));
760
md.setCatalogName(col, rsmd.getCatalogName(col));
761
md.setColumnType(col, rsmd.getColumnType(col));
762
md.setColumnTypeName(col, rsmd.getColumnTypeName(col));
763
}
764
765
if( conn != null){
766
// JDBC 4.0 mandates as does the Java EE spec that all DataBaseMetaData methods
767
// must be implemented, therefore, the previous fix for 5055528 is being backed out
768
dbmslocatorsUpdateCopy = conn.getMetaData().locatorsUpdateCopy();
769
}
770
}
771
772
/**
773
* Populates this <code>CachedRowSetImpl</code> object with data,
774
* using the given connection to produce the result set from
775
* which data will be read. A second form of this method,
776
* which takes no arguments, uses the values from this rowset's
777
* user, password, and either url or data source properties to
778
* create a new database connection. The form of <code>execute</code>
779
* that is given a connection ignores these properties.
780
*
781
* @param conn A standard JDBC <code>Connection</code> object that this
782
* <code>CachedRowSet</code> object can pass to a synchronization provider
783
* to establish a connection to the data source
784
* @throws SQLException if an invalid <code>Connection</code> is supplied
785
* or an error occurs in establishing the connection to the
786
* data source
787
* @see #populate
788
* @see java.sql.Connection
789
*/
790
public void execute(Connection conn) throws SQLException {
791
// store the connection so the reader can find it.
792
setConnection(conn);
793
794
if(getPageSize() != 0){
795
crsReader = (CachedRowSetReader)provider.getRowSetReader();
796
crsReader.setStartPosition(1);
797
callWithCon = true;
798
crsReader.readData((RowSetInternal)this);
799
}
800
801
// Now call the current reader's readData method
802
else {
803
rowSetReader.readData((RowSetInternal)this);
804
}
805
RowSetMD = (RowSetMetaDataImpl)this.getMetaData();
806
807
if(conn != null){
808
// JDBC 4.0 mandates as does the Java EE spec that all DataBaseMetaData methods
809
// must be implemented, therefore, the previous fix for 5055528 is being backed out
810
dbmslocatorsUpdateCopy = conn.getMetaData().locatorsUpdateCopy();
811
}
812
813
}
814
815
/**
816
* Sets this <code>CachedRowSetImpl</code> object's connection property
817
* to the given <code>Connection</code> object. This method is called
818
* internally by the version of the method <code>execute</code> that takes a
819
* <code>Connection</code> object as an argument. The reader for this
820
* <code>CachedRowSetImpl</code> object can retrieve the connection stored
821
* in the rowset's connection property by calling its
822
* <code>getConnection</code> method.
823
*
824
* @param connection the <code>Connection</code> object that was passed in
825
* to the method <code>execute</code> and is to be stored
826
* in this <code>CachedRowSetImpl</code> object's connection
827
* property
828
*/
829
private void setConnection (Connection connection) {
830
conn = connection;
831
}
832
833
834
/**
835
* Propagates all row update, insert, and delete changes to the
836
* underlying data source backing this <code>CachedRowSetImpl</code>
837
* object.
838
* <P>
839
* <b>Note</b>In the reference implementation an optimistic concurrency implementation
840
* is provided as a sample implementation of a the <code>SyncProvider</code>
841
* abstract class.
842
* <P>
843
* This method fails if any of the updates cannot be propagated back
844
* to the data source. When it fails, the caller can assume that
845
* none of the updates are reflected in the data source.
846
* When an exception is thrown, the current row
847
* is set to the first "updated" row that resulted in an exception
848
* unless the row that caused the exception is a "deleted" row.
849
* In that case, when deleted rows are not shown, which is usually true,
850
* the current row is not affected.
851
* <P>
852
* If no <code>SyncProvider</code> is configured, the reference implementation
853
* leverages the <code>RIOptimisticProvider</code> available which provides the
854
* default and reference synchronization capabilities for disconnected
855
* <code>RowSets</code>.
856
*
857
* @throws SQLException if the cursor is on the insert row or the underlying
858
* reference synchronization provider fails to commit the updates
859
* to the datasource
860
* @throws SyncProviderException if an internal error occurs within the
861
* <code>SyncProvider</code> instance during either during the
862
* process or at any time when the <code>SyncProvider</code>
863
* instance touches the data source.
864
* @see #acceptChanges(java.sql.Connection)
865
* @see javax.sql.RowSetWriter
866
* @see javax.sql.rowset.spi.SyncProvider
867
*/
868
public void acceptChanges() throws SyncProviderException {
869
if (onInsertRow == true) {
870
throw new SyncProviderException(resBundle.handleGetObject("cachedrowsetimpl.invalidop").toString());
871
}
872
873
int saveCursorPos = cursorPos;
874
boolean success = false;
875
boolean conflict = false;
876
877
try {
878
if (rowSetWriter != null) {
879
saveCursorPos = cursorPos;
880
conflict = rowSetWriter.writeData((RowSetInternal)this);
881
cursorPos = saveCursorPos;
882
}
883
884
if (tXWriter) {
885
// do commit/rollback's here
886
if (!conflict) {
887
tWriter = (TransactionalWriter)rowSetWriter;
888
tWriter.rollback();
889
success = false;
890
} else {
891
tWriter = (TransactionalWriter)rowSetWriter;
892
if (tWriter instanceof CachedRowSetWriter) {
893
((CachedRowSetWriter)tWriter).commit(this, updateOnInsert);
894
} else {
895
tWriter.commit();
896
}
897
898
success = true;
899
}
900
}
901
902
if (success == true) {
903
setOriginal();
904
} else if (!(success) ) {
905
throw new SyncProviderException(resBundle.handleGetObject("cachedrowsetimpl.accfailed").toString());
906
}
907
908
} catch (SyncProviderException spe) {
909
throw spe;
910
} catch (SQLException e) {
911
e.printStackTrace();
912
throw new SyncProviderException(e.getMessage());
913
} catch (SecurityException e) {
914
throw new SyncProviderException(e.getMessage());
915
}
916
}
917
918
/**
919
* Propagates all row update, insert, and delete changes to the
920
* data source backing this <code>CachedRowSetImpl</code> object
921
* using the given <code>Connection</code> object.
922
* <P>
923
* The reference implementation <code>RIOptimisticProvider</code>
924
* modifies its synchronization to a write back function given
925
* the updated connection
926
* The reference implementation modifies its synchronization behaviour
927
* via the <code>SyncProvider</code> to ensure the synchronization
928
* occurs according to the updated JDBC <code>Connection</code>
929
* properties.
930
*
931
* @param con a standard JDBC <code>Connection</code> object
932
* @throws SQLException if the cursor is on the insert row or the underlying
933
* synchronization provider fails to commit the updates
934
* back to the data source
935
* @see #acceptChanges
936
* @see javax.sql.RowSetWriter
937
* @see javax.sql.rowset.spi.SyncFactory
938
* @see javax.sql.rowset.spi.SyncProvider
939
*/
940
public void acceptChanges(Connection con) throws SyncProviderException{
941
setConnection(con);
942
acceptChanges();
943
}
944
945
/**
946
* Restores this <code>CachedRowSetImpl</code> object to its original state,
947
* that is, its state before the last set of changes.
948
* <P>
949
* Before returning, this method moves the cursor before the first row
950
* and sends a <code>rowSetChanged</code> event to all registered
951
* listeners.
952
* @throws SQLException if an error is occurs rolling back the RowSet
953
* state to the definied original value.
954
* @see javax.sql.RowSetListener#rowSetChanged
955
*/
956
public void restoreOriginal() throws SQLException {
957
Row currentRow;
958
for (Iterator<?> i = rvh.iterator(); i.hasNext();) {
959
currentRow = (Row)i.next();
960
if (currentRow.getInserted() == true) {
961
i.remove();
962
--numRows;
963
} else {
964
if (currentRow.getDeleted() == true) {
965
currentRow.clearDeleted();
966
}
967
if (currentRow.getUpdated() == true) {
968
currentRow.clearUpdated();
969
}
970
}
971
}
972
// move to before the first
973
cursorPos = 0;
974
975
// notify any listeners
976
notifyRowSetChanged();
977
}
978
979
/**
980
* Releases the current contents of this <code>CachedRowSetImpl</code>
981
* object and sends a <code>rowSetChanged</code> event object to all
982
* registered listeners.
983
*
984
* @throws SQLException if an error occurs flushing the contents of
985
* RowSet.
986
* @see javax.sql.RowSetListener#rowSetChanged
987
*/
988
public void release() throws SQLException {
989
initContainer();
990
notifyRowSetChanged();
991
}
992
993
/**
994
* Cancels deletion of the current row and notifies listeners that
995
* a row has changed.
996
* <P>
997
* Note: This method can be ignored if deleted rows are not being shown,
998
* which is the normal case.
999
*
1000
* @throws SQLException if the cursor is not on a valid row
1001
*/
1002
public void undoDelete() throws SQLException {
1003
if (getShowDeleted() == false) {
1004
return;
1005
}
1006
// make sure we are on a row
1007
checkCursor();
1008
1009
// don't want this to happen...
1010
if (onInsertRow == true) {
1011
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
1012
}
1013
1014
Row currentRow = (Row)getCurrentRow();
1015
if (currentRow.getDeleted() == true) {
1016
currentRow.clearDeleted();
1017
--numDeleted;
1018
notifyRowChanged();
1019
}
1020
}
1021
1022
/**
1023
* Immediately removes the current row from this
1024
* <code>CachedRowSetImpl</code> object if the row has been inserted, and
1025
* also notifies listeners the a row has changed. An exception is thrown
1026
* if the row is not a row that has been inserted or the cursor is before
1027
* the first row, after the last row, or on the insert row.
1028
* <P>
1029
* This operation cannot be undone.
1030
*
1031
* @throws SQLException if an error occurs,
1032
* the cursor is not on a valid row,
1033
* or the row has not been inserted
1034
*/
1035
public void undoInsert() throws SQLException {
1036
// make sure we are on a row
1037
checkCursor();
1038
1039
// don't want this to happen...
1040
if (onInsertRow == true) {
1041
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
1042
}
1043
1044
Row currentRow = (Row)getCurrentRow();
1045
if (currentRow.getInserted() == true) {
1046
rvh.remove(cursorPos-1);
1047
--numRows;
1048
notifyRowChanged();
1049
} else {
1050
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.illegalop").toString());
1051
}
1052
}
1053
1054
/**
1055
* Immediately reverses the last update operation if the
1056
* row has been modified. This method can be
1057
* called to reverse updates on a all columns until all updates in a row have
1058
* been rolled back to their originating state since the last synchronization
1059
* (<code>acceptChanges</code>) or population. This method may also be called
1060
* while performing updates to the insert row.
1061
* <P>
1062
* <code>undoUpdate</code may be called at any time during the life-time of a
1063
* rowset, however after a synchronization has occurs this method has no
1064
* affect until further modification to the RowSet data occurs.
1065
*
1066
* @throws SQLException if cursor is before the first row, after the last
1067
* row in rowset.
1068
* @see #undoDelete
1069
* @see #undoInsert
1070
* @see java.sql.ResultSet#cancelRowUpdates
1071
*/
1072
public void undoUpdate() throws SQLException {
1073
// if on insert row, cancel the insert row
1074
// make the insert row flag,
1075
// cursorPos back to the current row
1076
moveToCurrentRow();
1077
1078
// else if not on insert row
1079
// call undoUpdate or undoInsert
1080
undoDelete();
1081
1082
undoInsert();
1083
1084
}
1085
1086
//--------------------------------------------------------------------
1087
// Views
1088
//--------------------------------------------------------------------
1089
1090
/**
1091
* Returns a new <code>RowSet</code> object backed by the same data as
1092
* that of this <code>CachedRowSetImpl</code> object and sharing a set of cursors
1093
* with it. This allows cursors to interate over a shared set of rows, providing
1094
* multiple views of the underlying data.
1095
*
1096
* @return a <code>RowSet</code> object that is a copy of this <code>CachedRowSetImpl</code>
1097
* object and shares a set of cursors with it
1098
* @throws SQLException if an error occurs or cloning is
1099
* not supported
1100
* @see javax.sql.RowSetEvent
1101
* @see javax.sql.RowSetListener
1102
*/
1103
public RowSet createShared() throws SQLException {
1104
RowSet clone;
1105
try {
1106
clone = (RowSet)clone();
1107
} catch (CloneNotSupportedException ex) {
1108
throw new SQLException(ex.getMessage());
1109
}
1110
return clone;
1111
}
1112
1113
/**
1114
* Returns a new <code>RowSet</code> object containing by the same data
1115
* as this <code>CachedRowSetImpl</code> object. This method
1116
* differs from the method <code>createCopy</code> in that it throws a
1117
* <code>CloneNotSupportedException</code> object instead of an
1118
* <code>SQLException</code> object, as the method <code>createShared</code>
1119
* does. This <code>clone</code>
1120
* method is called internally by the method <code>createShared</code>,
1121
* which catches the <code>CloneNotSupportedException</code> object
1122
* and in turn throws a new <code>SQLException</code> object.
1123
*
1124
* @return a copy of this <code>CachedRowSetImpl</code> object
1125
* @throws CloneNotSupportedException if an error occurs when
1126
* attempting to clone this <code>CachedRowSetImpl</code> object
1127
* @see #createShared
1128
*/
1129
protected Object clone() throws CloneNotSupportedException {
1130
return (super.clone());
1131
}
1132
1133
/**
1134
* Creates a <code>RowSet</code> object that is a deep copy of
1135
* this <code>CachedRowSetImpl</code> object's data, including
1136
* constraints. Updates made
1137
* on a copy are not visible to the original rowset;
1138
* a copy of a rowset is completely independent from the original.
1139
* <P>
1140
* Making a copy saves the cost of creating an identical rowset
1141
* from first principles, which can be quite expensive.
1142
* For example, it can eliminate the need to query a
1143
* remote database server.
1144
* @return a new <code>CachedRowSet</code> object that is a deep copy
1145
* of this <code>CachedRowSet</code> object and is
1146
* completely independent from this <code>CachedRowSetImpl</code>
1147
* object.
1148
* @throws SQLException if an error occurs in generating the copy of this
1149
* of the <code>CachedRowSetImpl</code>
1150
* @see #createShared
1151
* @see javax.sql.RowSetEvent
1152
* @see javax.sql.RowSetListener
1153
*/
1154
public CachedRowSet createCopy() throws SQLException {
1155
ObjectOutputStream out;
1156
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
1157
try {
1158
out = new ObjectOutputStream(bOut);
1159
out.writeObject(this);
1160
} catch (IOException ex) {
1161
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.clonefail").toString() , ex.getMessage()));
1162
}
1163
1164
ObjectInputStream in;
1165
1166
try {
1167
ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray());
1168
in = new ObjectInputStream(bIn);
1169
} catch (StreamCorruptedException ex) {
1170
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.clonefail").toString() , ex.getMessage()));
1171
} catch (IOException ex) {
1172
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.clonefail").toString() , ex.getMessage()));
1173
}
1174
1175
try {
1176
//return ((CachedRowSet)(in.readObject()));
1177
CachedRowSetImpl crsTemp = (CachedRowSetImpl)in.readObject();
1178
crsTemp.resBundle = this.resBundle;
1179
return ((CachedRowSet)crsTemp);
1180
1181
} catch (ClassNotFoundException ex) {
1182
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.clonefail").toString() , ex.getMessage()));
1183
} catch (OptionalDataException ex) {
1184
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.clonefail").toString() , ex.getMessage()));
1185
} catch (IOException ex) {
1186
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.clonefail").toString() , ex.getMessage()));
1187
}
1188
}
1189
1190
/**
1191
* Creates a <code>RowSet</code> object that is a copy of
1192
* this <code>CachedRowSetImpl</code> object's table structure
1193
* and the constraints only.
1194
* There will be no data in the object being returned.
1195
* Updates made on a copy are not visible to the original rowset.
1196
* <P>
1197
* This helps in getting the underlying XML schema which can
1198
* be used as the basis for populating a <code>WebRowSet</code>.
1199
*
1200
* @return a new <code>CachedRowSet</code> object that is a copy
1201
* of this <code>CachedRowSetImpl</code> object's schema and
1202
* retains all the constraints on the original rowset but contains
1203
* no data
1204
* @throws SQLException if an error occurs in generating the copy
1205
* of the <code>CachedRowSet</code> object
1206
* @see #createShared
1207
* @see #createCopy
1208
* @see #createCopyNoConstraints
1209
* @see javax.sql.RowSetEvent
1210
* @see javax.sql.RowSetListener
1211
*/
1212
public CachedRowSet createCopySchema() throws SQLException {
1213
// Copy everything except data i.e all constraints
1214
1215
// Store the number of rows of "this"
1216
// and make numRows equals zero.
1217
// and make data also zero.
1218
int nRows = numRows;
1219
numRows = 0;
1220
1221
CachedRowSet crs = this.createCopy();
1222
1223
// reset this object back to number of rows.
1224
numRows = nRows;
1225
1226
return crs;
1227
}
1228
1229
/**
1230
* Creates a <code>CachedRowSet</code> object that is a copy of
1231
* this <code>CachedRowSetImpl</code> object's data only.
1232
* All constraints set in this object will not be there
1233
* in the returning object. Updates made
1234
* on a copy are not visible to the original rowset.
1235
*
1236
* @return a new <code>CachedRowSet</code> object that is a deep copy
1237
* of this <code>CachedRowSetImpl</code> object and is
1238
* completely independent from this <code>CachedRowSetImpl</code> object
1239
* @throws SQLException if an error occurs in generating the copy of the
1240
* of the <code>CachedRowSet</code>
1241
* @see #createShared
1242
* @see #createCopy
1243
* @see #createCopySchema
1244
* @see javax.sql.RowSetEvent
1245
* @see javax.sql.RowSetListener
1246
*/
1247
public CachedRowSet createCopyNoConstraints() throws SQLException {
1248
// Copy the whole data ONLY without any constraints.
1249
CachedRowSetImpl crs;
1250
crs = (CachedRowSetImpl)this.createCopy();
1251
1252
crs.initProperties();
1253
try {
1254
crs.unsetMatchColumn(crs.getMatchColumnIndexes());
1255
} catch(SQLException sqle) {
1256
//do nothing, if the setMatchColumn is not set.
1257
}
1258
1259
try {
1260
crs.unsetMatchColumn(crs.getMatchColumnNames());
1261
} catch(SQLException sqle) {
1262
//do nothing, if the setMatchColumn is not set.
1263
}
1264
1265
return crs;
1266
}
1267
1268
/**
1269
* Converts this <code>CachedRowSetImpl</code> object to a collection
1270
* of tables. The sample implementation utilitizes the <code>TreeMap</code>
1271
* collection type.
1272
* This class guarantees that the map will be in ascending key order,
1273
* sorted according to the natural order for the key's class.
1274
*
1275
* @return a <code>Collection</code> object consisting of tables,
1276
* each of which is a copy of a row in this
1277
* <code>CachedRowSetImpl</code> object
1278
* @throws SQLException if an error occurs in generating the collection
1279
* @see #toCollection(int)
1280
* @see #toCollection(String)
1281
* @see java.util.TreeMap
1282
*/
1283
public Collection<?> toCollection() throws SQLException {
1284
1285
TreeMap<Integer, Object> tMap = new TreeMap<>();
1286
1287
for (int i = 0; i<numRows; i++) {
1288
tMap.put(i, rvh.get(i));
1289
}
1290
1291
return (tMap.values());
1292
}
1293
1294
/**
1295
* Returns the specified column of this <code>CachedRowSetImpl</code> object
1296
* as a <code>Collection</code> object. This method makes a copy of the
1297
* column's data and utilitizes the <code>Vector</code> to establish the
1298
* collection. The <code>Vector</code> class implements a growable array
1299
* objects allowing the individual components to be accessed using an
1300
* an integer index similar to that of an array.
1301
*
1302
* @return a <code>Collection</code> object that contains the value(s)
1303
* stored in the specified column of this
1304
* <code>CachedRowSetImpl</code>
1305
* object
1306
* @throws SQLException if an error occurs generated the collection; or
1307
* an invalid column is provided.
1308
* @see #toCollection()
1309
* @see #toCollection(String)
1310
* @see java.util.Vector
1311
*/
1312
public Collection<?> toCollection(int column) throws SQLException {
1313
1314
int nRows = numRows;
1315
Vector<Object> vec = new Vector<>(nRows);
1316
1317
// create a copy
1318
CachedRowSetImpl crsTemp;
1319
crsTemp = (CachedRowSetImpl) this.createCopy();
1320
1321
while(nRows!=0) {
1322
crsTemp.next();
1323
vec.add(crsTemp.getObject(column));
1324
nRows--;
1325
}
1326
1327
return (Collection)vec;
1328
}
1329
1330
/**
1331
* Returns the specified column of this <code>CachedRowSetImpl</code> object
1332
* as a <code>Collection</code> object. This method makes a copy of the
1333
* column's data and utilitizes the <code>Vector</code> to establish the
1334
* collection. The <code>Vector</code> class implements a growable array
1335
* objects allowing the individual components to be accessed using an
1336
* an integer index similar to that of an array.
1337
*
1338
* @return a <code>Collection</code> object that contains the value(s)
1339
* stored in the specified column of this
1340
* <code>CachedRowSetImpl</code>
1341
* object
1342
* @throws SQLException if an error occurs generated the collection; or
1343
* an invalid column is provided.
1344
* @see #toCollection()
1345
* @see #toCollection(int)
1346
* @see java.util.Vector
1347
*/
1348
public Collection<?> toCollection(String column) throws SQLException {
1349
return toCollection(getColIdxByName(column));
1350
}
1351
1352
//--------------------------------------------------------------------
1353
// Advanced features
1354
//--------------------------------------------------------------------
1355
1356
1357
/**
1358
* Returns the <code>SyncProvider</code> implementation being used
1359
* with this <code>CachedRowSetImpl</code> implementation rowset.
1360
*
1361
* @return the SyncProvider used by the rowset. If not provider was
1362
* set when the rowset was instantiated, the reference
1363
* implementation (default) provider is returned.
1364
* @throws SQLException if error occurs while return the
1365
* <code>SyncProvider</code> instance.
1366
*/
1367
public SyncProvider getSyncProvider() throws SQLException {
1368
return provider;
1369
}
1370
1371
/**
1372
* Sets the active <code>SyncProvider</code> and attempts to load
1373
* load the new provider using the <code>SyncFactory</code> SPI.
1374
*
1375
* @throws SQLException if an error occurs while resetting the
1376
* <code>SyncProvider</code>.
1377
*/
1378
public void setSyncProvider(String providerStr) throws SQLException {
1379
provider =
1380
SyncFactory.getInstance(providerStr);
1381
1382
rowSetReader = provider.getRowSetReader();
1383
rowSetWriter = provider.getRowSetWriter();
1384
}
1385
1386
1387
//-----------------
1388
// methods inherited from RowSet
1389
//-----------------
1390
1391
1392
1393
1394
1395
1396
//---------------------------------------------------------------------
1397
// Reading and writing data
1398
//---------------------------------------------------------------------
1399
1400
/**
1401
* Populates this <code>CachedRowSetImpl</code> object with data.
1402
* This form of the method uses the rowset's user, password, and url or
1403
* data source name properties to create a database
1404
* connection. If properties that are needed
1405
* have not been set, this method will throw an exception.
1406
* <P>
1407
* Another form of this method uses an existing JDBC <code>Connection</code>
1408
* object instead of creating a new one; therefore, it ignores the
1409
* properties used for establishing a new connection.
1410
* <P>
1411
* The query specified by the command property is executed to create a
1412
* <code>ResultSet</code> object from which to retrieve data.
1413
* The current contents of the rowset are discarded, and the
1414
* rowset's metadata is also (re)set. If there are outstanding updates,
1415
* they are also ignored.
1416
* <P>
1417
* The method <code>execute</code> closes any database connections that it
1418
* creates.
1419
*
1420
* @throws SQLException if an error occurs or the
1421
* necessary properties have not been set
1422
*/
1423
public void execute() throws SQLException {
1424
execute(null);
1425
}
1426
1427
1428
1429
//-----------------------------------
1430
// Methods inherited from ResultSet
1431
//-----------------------------------
1432
1433
/**
1434
* Moves the cursor down one row from its current position and
1435
* returns <code>true</code> if the new cursor position is a
1436
* valid row.
1437
* The cursor for a new <code>ResultSet</code> object is initially
1438
* positioned before the first row. The first call to the method
1439
* <code>next</code> moves the cursor to the first row, making it
1440
* the current row; the second call makes the second row the
1441
* current row, and so on.
1442
*
1443
* <P>If an input stream from the previous row is open, it is
1444
* implicitly closed. The <code>ResultSet</code> object's warning
1445
* chain is cleared when a new row is read.
1446
*
1447
* @return <code>true</code> if the new current row is valid;
1448
* <code>false</code> if there are no more rows
1449
* @throws SQLException if an error occurs or
1450
* the cursor is not positioned in the rowset, before
1451
* the first row, or after the last row
1452
*/
1453
public boolean next() throws SQLException {
1454
/*
1455
* make sure things look sane. The cursor must be
1456
* positioned in the rowset or before first (0) or
1457
* after last (numRows + 1)
1458
*/
1459
if (cursorPos < 0 || cursorPos >= numRows + 1) {
1460
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
1461
}
1462
// now move and notify
1463
boolean ret = this.internalNext();
1464
notifyCursorMoved();
1465
1466
return ret;
1467
}
1468
1469
/**
1470
* Moves this <code>CachedRowSetImpl</code> object's cursor to the next
1471
* row and returns <code>true</code> if the cursor is still in the rowset;
1472
* returns <code>false</code> if the cursor has moved to the position after
1473
* the last row.
1474
* <P>
1475
* This method handles the cases where the cursor moves to a row that
1476
* has been deleted.
1477
* If this rowset shows deleted rows and the cursor moves to a row
1478
* that has been deleted, this method moves the cursor to the next
1479
* row until the cursor is on a row that has not been deleted.
1480
* <P>
1481
* The method <code>internalNext</code> is called by methods such as
1482
* <code>next</code>, <code>absolute</code>, and <code>relative</code>,
1483
* and, as its name implies, is only called internally.
1484
* <p>
1485
* This is a implementation only method and is not required as a standard
1486
* implementation of the <code>CachedRowSet</code> interface.
1487
*
1488
* @return <code>true</code> if the cursor is on a valid row in this
1489
* rowset; <code>false</code> if it is after the last row
1490
* @throws SQLException if an error occurs
1491
*/
1492
protected boolean internalNext() throws SQLException {
1493
boolean ret = false;
1494
1495
do {
1496
if (cursorPos < numRows) {
1497
++cursorPos;
1498
ret = true;
1499
} else if (cursorPos == numRows) {
1500
// increment to after last
1501
++cursorPos;
1502
ret = false;
1503
break;
1504
}
1505
} while ((getShowDeleted() == false) && (rowDeleted() == true));
1506
1507
/* each call to internalNext may increment cursorPos multiple
1508
* times however, the absolutePos only increments once per call.
1509
*/
1510
if (ret == true)
1511
absolutePos++;
1512
else
1513
absolutePos = 0;
1514
1515
return ret;
1516
}
1517
1518
/**
1519
* Closes this <code>CachedRowSetImpl</code> objecy and releases any resources
1520
* it was using.
1521
*
1522
* @throws SQLException if an error occurs when releasing any resources in use
1523
* by this <code>CachedRowSetImpl</code> object
1524
*/
1525
public void close() throws SQLException {
1526
1527
// close all data structures holding
1528
// the disconnected rowset
1529
1530
cursorPos = 0;
1531
absolutePos = 0;
1532
numRows = 0;
1533
numDeleted = 0;
1534
1535
// set all insert(s), update(s) & delete(s),
1536
// if at all, to their initial values.
1537
initProperties();
1538
1539
// clear the vector of it's present contents
1540
rvh.clear();
1541
1542
// this will make it eligible for gc
1543
// rvh = null;
1544
}
1545
1546
/**
1547
* Reports whether the last column read was SQL <code>NULL</code>.
1548
* Note that you must first call the method <code>getXXX</code>
1549
* on a column to try to read its value and then call the method
1550
* <code>wasNull</code> to determine whether the value was
1551
* SQL <code>NULL</code>.
1552
*
1553
* @return <code>true</code> if the value in the last column read
1554
* was SQL <code>NULL</code>; <code>false</code> otherwise
1555
* @throws SQLException if an error occurs
1556
*/
1557
public boolean wasNull() throws SQLException {
1558
return lastValueNull;
1559
}
1560
1561
/**
1562
* Sets the field <code>lastValueNull</code> to the given
1563
* <code>boolean</code> value.
1564
*
1565
* @param value <code>true</code> to indicate that the value of
1566
* the last column read was SQL <code>NULL</code>;
1567
* <code>false</code> to indicate that it was not
1568
*/
1569
private void setLastValueNull(boolean value) {
1570
lastValueNull = value;
1571
}
1572
1573
// Methods for accessing results by column index
1574
1575
/**
1576
* Checks to see whether the given index is a valid column number
1577
* in this <code>CachedRowSetImpl</code> object and throws
1578
* an <code>SQLException</code> if it is not. The index is out of bounds
1579
* if it is less than <code>1</code> or greater than the number of
1580
* columns in this rowset.
1581
* <P>
1582
* This method is called internally by the <code>getXXX</code> and
1583
* <code>updateXXX</code> methods.
1584
*
1585
* @param idx the number of a column in this <code>CachedRowSetImpl</code>
1586
* object; must be between <code>1</code> and the number of
1587
* rows in this rowset
1588
* @throws SQLException if the given index is out of bounds
1589
*/
1590
private void checkIndex(int idx) throws SQLException {
1591
if (idx < 1 || idx > RowSetMD.getColumnCount()) {
1592
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcol").toString());
1593
}
1594
}
1595
1596
/**
1597
* Checks to see whether the cursor for this <code>CachedRowSetImpl</code>
1598
* object is on a row in the rowset and throws an
1599
* <code>SQLException</code> if it is not.
1600
* <P>
1601
* This method is called internally by <code>getXXX</code> methods, by
1602
* <code>updateXXX</code> methods, and by methods that update, insert,
1603
* or delete a row or that cancel a row update, insert, or delete.
1604
*
1605
* @throws SQLException if the cursor for this <code>CachedRowSetImpl</code>
1606
* object is not on a valid row
1607
*/
1608
private void checkCursor() throws SQLException {
1609
if (isAfterLast() == true || isBeforeFirst() == true) {
1610
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
1611
}
1612
}
1613
1614
/**
1615
* Returns the column number of the column with the given name in this
1616
* <code>CachedRowSetImpl</code> object. This method throws an
1617
* <code>SQLException</code> if the given name is not the name of
1618
* one of the columns in this rowset.
1619
*
1620
* @param name a <code>String</code> object that is the name of a column in
1621
* this <code>CachedRowSetImpl</code> object
1622
* @throws SQLException if the given name does not match the name of one of
1623
* the columns in this rowset
1624
*/
1625
private int getColIdxByName(String name) throws SQLException {
1626
RowSetMD = (RowSetMetaDataImpl)this.getMetaData();
1627
int cols = RowSetMD.getColumnCount();
1628
1629
for (int i=1; i <= cols; ++i) {
1630
String colName = RowSetMD.getColumnName(i);
1631
if (colName != null)
1632
if (name.equalsIgnoreCase(colName))
1633
return (i);
1634
else
1635
continue;
1636
}
1637
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalcolnm").toString());
1638
1639
}
1640
1641
/**
1642
* Returns the insert row or the current row of this
1643
* <code>CachedRowSetImpl</code>object.
1644
*
1645
* @return the <code>Row</code> object on which this <code>CachedRowSetImpl</code>
1646
* objects's cursor is positioned
1647
*/
1648
protected BaseRow getCurrentRow() {
1649
if (onInsertRow == true) {
1650
return (BaseRow)insertRow;
1651
} else {
1652
return (BaseRow)(rvh.get(cursorPos - 1));
1653
}
1654
}
1655
1656
/**
1657
* Removes the row on which the cursor is positioned.
1658
* <p>
1659
* This is a implementation only method and is not required as a standard
1660
* implementation of the <code>CachedRowSet</code> interface.
1661
*
1662
* @throws SQLException if the cursor is positioned on the insert
1663
* row
1664
*/
1665
protected void removeCurrentRow() {
1666
((Row)getCurrentRow()).setDeleted();
1667
rvh.remove(cursorPos - 1);
1668
--numRows;
1669
}
1670
1671
1672
/**
1673
* Retrieves the value of the designated column in the current row
1674
* of this <code>CachedRowSetImpl</code> object as a
1675
* <code>String</code> object.
1676
*
1677
* @param columnIndex the first column is <code>1</code>, the second
1678
* is <code>2</code>, and so on; must be <code>1</code> or larger
1679
* and equal to or less than the number of columns in the rowset
1680
* @return the column value; if the value is SQL <code>NULL</code>, the
1681
* result is <code>null</code>
1682
* @throws SQLException if (1) the given column index is out of bounds,
1683
* (2) the cursor is not on one of this rowset's rows or its
1684
* insert row, or (3) the designated column does not store an
1685
* SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
1686
* FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, <b>CHAR</b>, <b>VARCHAR</b></code>
1687
* or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1688
* recommended return type.
1689
*/
1690
public String getString(int columnIndex) throws SQLException {
1691
Object value;
1692
1693
// sanity check.
1694
checkIndex(columnIndex);
1695
// make sure the cursor is on a valid row
1696
checkCursor();
1697
1698
setLastValueNull(false);
1699
value = getCurrentRow().getColumnObject(columnIndex);
1700
1701
// check for SQL NULL
1702
if (value == null) {
1703
setLastValueNull(true);
1704
return null;
1705
}
1706
1707
return value.toString();
1708
}
1709
1710
/**
1711
* Retrieves the value of the designated column in the current row
1712
* of this <code>CachedRowSetImpl</code> object as a
1713
* <code>boolean</code> value.
1714
*
1715
* @param columnIndex the first column is <code>1</code>, the second
1716
* is <code>2</code>, and so on; must be <code>1</code> or larger
1717
* and equal to or less than the number of columns in the rowset
1718
* @return the column value as a <code>boolean</code> in the Java progamming language;
1719
* if the value is SQL <code>NULL</code>, the result is <code>false</code>
1720
* @throws SQLException if (1) the given column index is out of bounds,
1721
* (2) the cursor is not on one of this rowset's rows or its
1722
* insert row, or (3) the designated column does not store an
1723
* SQL <code>BOOLEAN</code> value
1724
* @see #getBoolean(String)
1725
*/
1726
public boolean getBoolean(int columnIndex) throws SQLException {
1727
Object value;
1728
1729
// sanity check.
1730
checkIndex(columnIndex);
1731
// make sure the cursor is on a valid row
1732
checkCursor();
1733
1734
setLastValueNull(false);
1735
value = getCurrentRow().getColumnObject(columnIndex);
1736
1737
// check for SQL NULL
1738
if (value == null) {
1739
setLastValueNull(true);
1740
return false;
1741
}
1742
1743
// check for Boolean...
1744
if (value instanceof Boolean) {
1745
return ((Boolean)value).booleanValue();
1746
}
1747
1748
// convert to a Double and compare to zero
1749
try {
1750
return Double.compare(Double.parseDouble(value.toString()), 0) != 0;
1751
} catch (NumberFormatException ex) {
1752
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.boolfail").toString(),
1753
new Object[] {value.toString().trim(), columnIndex}));
1754
}
1755
}
1756
1757
/**
1758
* Retrieves the value of the designated column in the current row
1759
* of this <code>CachedRowSetImpl</code> object as a
1760
* <code>byte</code> value.
1761
*
1762
* @param columnIndex the first column is <code>1</code>, the second
1763
* is <code>2</code>, and so on; must be <code>1</code> or larger
1764
* and equal to or less than the number of columns in the rowset
1765
* @return the column value as a <code>byte</code> in the Java programming
1766
* language; if the value is SQL <code>NULL</code>, the result is <code>0</code>
1767
* @throws SQLException if (1) the given column index is out of bounds,
1768
* (2) the cursor is not on one of this rowset's rows or its
1769
* insert row, or (3) the designated column does not store an
1770
* SQL <code><b>TINYINT</b>, SMALLINT, INTEGER, BIGINT, REAL,
1771
* FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1772
* or <code>LONGVARCHAR</code> value. The bold SQL type
1773
* designates the recommended return type.
1774
* @see #getByte(String)
1775
*/
1776
public byte getByte(int columnIndex) throws SQLException {
1777
Object value;
1778
1779
// sanity check.
1780
checkIndex(columnIndex);
1781
// make sure the cursor is on a valid row
1782
checkCursor();
1783
1784
setLastValueNull(false);
1785
value = getCurrentRow().getColumnObject(columnIndex);
1786
1787
// check for SQL NULL
1788
if (value == null) {
1789
setLastValueNull(true);
1790
return (byte)0;
1791
}
1792
try {
1793
return ((Byte.valueOf(value.toString())).byteValue());
1794
} catch (NumberFormatException ex) {
1795
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.bytefail").toString(),
1796
new Object[] {value.toString().trim(), columnIndex}));
1797
}
1798
}
1799
1800
/**
1801
* Retrieves the value of the designated column in the current row
1802
* of this <code>CachedRowSetImpl</code> object as a
1803
* <code>short</code> value.
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 the column value; if the value is SQL <code>NULL</code>, the
1809
* result is <code>0</code>
1810
* @throws SQLException if (1) the given column index is out of bounds,
1811
* (2) the cursor is not on one of this rowset's rows or its
1812
* insert row, or (3) the designated column does not store an
1813
* SQL <code>TINYINT, <b>SMALLINT</b>, INTEGER, BIGINT, REAL
1814
* FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1815
* or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1816
* recommended return type.
1817
* @see #getShort(String)
1818
*/
1819
public short getShort(int columnIndex) throws SQLException {
1820
Object value;
1821
1822
// sanity check.
1823
checkIndex(columnIndex);
1824
// make sure the cursor is on a valid row
1825
checkCursor();
1826
1827
setLastValueNull(false);
1828
value = getCurrentRow().getColumnObject(columnIndex);
1829
1830
// check for SQL NULL
1831
if (value == null) {
1832
setLastValueNull(true);
1833
return (short)0;
1834
}
1835
1836
try {
1837
return ((Short.valueOf(value.toString().trim())).shortValue());
1838
} catch (NumberFormatException ex) {
1839
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.shortfail").toString(),
1840
new Object[] {value.toString().trim(), columnIndex}));
1841
}
1842
}
1843
1844
/**
1845
* Retrieves the value of the designated column in the current row
1846
* of this <code>CachedRowSetImpl</code> object as an
1847
* <code>int</code> value.
1848
*
1849
* @param columnIndex the first column is <code>1</code>, the second
1850
* is <code>2</code>, and so on; must be <code>1</code> or larger
1851
* and equal to or less than the number of columns in the rowset
1852
* @return the column value; if the value is SQL <code>NULL</code>, the
1853
* result is <code>0</code>
1854
* @throws SQLException if (1) the given column index is out of bounds,
1855
* (2) the cursor is not on one of this rowset's rows or its
1856
* insert row, or (3) the designated column does not store an
1857
* SQL <code>TINYINT, SMALLINT, <b>INTEGER</b>, BIGINT, REAL
1858
* FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1859
* or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1860
* recommended return type.
1861
*/
1862
public int getInt(int columnIndex) throws SQLException {
1863
Object value;
1864
1865
// sanity check.
1866
checkIndex(columnIndex);
1867
// make sure the cursor is on a valid row
1868
checkCursor();
1869
1870
setLastValueNull(false);
1871
value = getCurrentRow().getColumnObject(columnIndex);
1872
1873
// check for SQL NULL
1874
if (value == null) {
1875
setLastValueNull(true);
1876
return 0;
1877
}
1878
1879
try {
1880
return ((Integer.valueOf(value.toString().trim())).intValue());
1881
} catch (NumberFormatException ex) {
1882
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.intfail").toString(),
1883
new Object[] {value.toString().trim(), columnIndex}));
1884
}
1885
}
1886
1887
/**
1888
* Retrieves the value of the designated column in the current row
1889
* of this <code>CachedRowSetImpl</code> object as a
1890
* <code>long</code> value.
1891
*
1892
* @param columnIndex the first column is <code>1</code>, the second
1893
* is <code>2</code>, and so on; must be <code>1</code> or larger
1894
* and equal to or less than the number of columns in the rowset
1895
* @return the column value; if the value is SQL <code>NULL</code>, the
1896
* result is <code>0</code>
1897
* @throws SQLException if (1) the given column index is out of bounds,
1898
* (2) the cursor is not on one of this rowset's rows or its
1899
* insert row, or (3) the designated column does not store an
1900
* SQL <code>TINYINT, SMALLINT, INTEGER, <b>BIGINT</b>, REAL
1901
* FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1902
* or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1903
* recommended return type.
1904
* @see #getLong(String)
1905
*/
1906
public long getLong(int columnIndex) throws SQLException {
1907
Object value;
1908
1909
// sanity check.
1910
checkIndex(columnIndex);
1911
// make sure the cursor is on a valid row
1912
checkCursor();
1913
1914
setLastValueNull(false);
1915
value = getCurrentRow().getColumnObject(columnIndex);
1916
1917
// check for SQL NULL
1918
if (value == null) {
1919
setLastValueNull(true);
1920
return (long)0;
1921
}
1922
try {
1923
return ((Long.valueOf(value.toString().trim())).longValue());
1924
} catch (NumberFormatException ex) {
1925
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.longfail").toString(),
1926
new Object[] {value.toString().trim(), columnIndex}));
1927
}
1928
}
1929
1930
/**
1931
* Retrieves the value of the designated column in the current row
1932
* of this <code>CachedRowSetImpl</code> object as a
1933
* <code>float</code> value.
1934
*
1935
* @param columnIndex the first column is <code>1</code>, the second
1936
* is <code>2</code>, and so on; must be <code>1</code> or larger
1937
* and equal to or less than the number of columns in the rowset
1938
* @return the column value; if the value is SQL <code>NULL</code>, the
1939
* result is <code>0</code>
1940
* @throws SQLException if (1) the given column index is out of bounds,
1941
* (2) the cursor is not on one of this rowset's rows or its
1942
* insert row, or (3) the designated column does not store an
1943
* SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, <b>REAL</b>,
1944
* FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1945
* or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1946
* recommended return type.
1947
* @see #getFloat(String)
1948
*/
1949
public float getFloat(int columnIndex) throws SQLException {
1950
Object value;
1951
1952
// sanity check.
1953
checkIndex(columnIndex);
1954
// make sure the cursor is on a valid row
1955
checkCursor();
1956
1957
setLastValueNull(false);
1958
value = getCurrentRow().getColumnObject(columnIndex);
1959
1960
// check for SQL NULL
1961
if (value == null) {
1962
setLastValueNull(true);
1963
return (float)0;
1964
}
1965
try {
1966
return ((new Float(value.toString())).floatValue());
1967
} catch (NumberFormatException ex) {
1968
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.floatfail").toString(),
1969
new Object[] {value.toString().trim(), columnIndex}));
1970
}
1971
}
1972
1973
/**
1974
* Retrieves the value of the designated column in the current row
1975
* of this <code>CachedRowSetImpl</code> object as a
1976
* <code>double</code> value.
1977
*
1978
* @param columnIndex the first column is <code>1</code>, the second
1979
* is <code>2</code>, and so on; must be <code>1</code> or larger
1980
* and equal to or less than the number of columns in the rowset
1981
* @return the column value; if the value is SQL <code>NULL</code>, the
1982
* result is <code>0</code>
1983
* @throws SQLException if (1) the given column index is out of bounds,
1984
* (2) the cursor is not on one of this rowset's rows or its
1985
* insert row, or (3) the designated column does not store an
1986
* SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
1987
* <b>FLOAT</b>, <b>DOUBLE</b>, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
1988
* or <code>LONGVARCHAR</code> value. The bold SQL type designates the
1989
* recommended return type.
1990
* @see #getDouble(String)
1991
*
1992
*/
1993
public double getDouble(int columnIndex) throws SQLException {
1994
Object value;
1995
1996
// sanity check.
1997
checkIndex(columnIndex);
1998
// make sure the cursor is on a valid row
1999
checkCursor();
2000
2001
setLastValueNull(false);
2002
value = getCurrentRow().getColumnObject(columnIndex);
2003
2004
// check for SQL NULL
2005
if (value == null) {
2006
setLastValueNull(true);
2007
return (double)0;
2008
}
2009
try {
2010
return ((new Double(value.toString().trim())).doubleValue());
2011
} catch (NumberFormatException ex) {
2012
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.doublefail").toString(),
2013
new Object[] {value.toString().trim(), columnIndex}));
2014
}
2015
}
2016
2017
/**
2018
* Retrieves the value of the designated column in the current row
2019
* of this <code>CachedRowSetImpl</code> object as a
2020
* <code>java.math.BigDecimal</code> object.
2021
* <P>
2022
* This method is deprecated; use the version of <code>getBigDecimal</code>
2023
* that does not take a scale parameter and returns a value with full
2024
* precision.
2025
*
2026
* @param columnIndex the first column is <code>1</code>, the second
2027
* is <code>2</code>, and so on; must be <code>1</code> or larger
2028
* and equal to or less than the number of columns in the rowset
2029
* @param scale the number of digits to the right of the decimal point in the
2030
* value returned
2031
* @return the column value with the specified number of digits to the right
2032
* of the decimal point; if the value is SQL <code>NULL</code>, the
2033
* result is <code>null</code>
2034
* @throws SQLException if the given column index is out of bounds,
2035
* the cursor is not on a valid row, or this method fails
2036
* @deprecated
2037
*/
2038
@Deprecated
2039
public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
2040
Object value;
2041
BigDecimal bDecimal, retVal;
2042
2043
// sanity check.
2044
checkIndex(columnIndex);
2045
// make sure the cursor is on a valid row
2046
checkCursor();
2047
2048
setLastValueNull(false);
2049
value = getCurrentRow().getColumnObject(columnIndex);
2050
2051
// check for SQL NULL
2052
if (value == null) {
2053
setLastValueNull(true);
2054
return (new BigDecimal(0));
2055
}
2056
2057
bDecimal = this.getBigDecimal(columnIndex);
2058
2059
retVal = bDecimal.setScale(scale);
2060
2061
return retVal;
2062
}
2063
2064
/**
2065
* Retrieves the value of the designated column in the current row
2066
* of this <code>CachedRowSetImpl</code> object as a
2067
* <code>byte</code> array value.
2068
*
2069
* @param columnIndex the first column is <code>1</code>, the second
2070
* is <code>2</code>, and so on; must be <code>1</code> or larger
2071
* and equal to or less than the number of columns in the rowset
2072
* @return the column value as a <code>byte</code> array in the Java programming
2073
* language; if the value is SQL <code>NULL</code>, the
2074
* result is <code>null</code>
2075
*
2076
* @throws SQLException if (1) the given column index is out of bounds,
2077
* (2) the cursor is not on one of this rowset's rows or its
2078
* insert row, or (3) the designated column does not store an
2079
* SQL <code><b>BINARY</b>, <b>VARBINARY</b> or
2080
* LONGVARBINARY</code> value.
2081
* The bold SQL type designates the recommended return type.
2082
* @see #getBytes(String)
2083
*/
2084
public byte[] getBytes(int columnIndex) throws SQLException {
2085
// sanity check.
2086
checkIndex(columnIndex);
2087
// make sure the cursor is on a valid row
2088
checkCursor();
2089
2090
if (isBinary(RowSetMD.getColumnType(columnIndex)) == false) {
2091
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
2092
}
2093
2094
return (byte[])(getCurrentRow().getColumnObject(columnIndex));
2095
}
2096
2097
/**
2098
* Retrieves the value of the designated column in the current row
2099
* of this <code>CachedRowSetImpl</code> object as a
2100
* <code>java.sql.Date</code> object.
2101
*
2102
* @param columnIndex the first column is <code>1</code>, the second
2103
* is <code>2</code>, and so on; must be <code>1</code> or larger
2104
* and equal to or less than the number of columns in the rowset
2105
* @return the column value as a <code>java.sql.Data</code> object; if
2106
* the value is SQL <code>NULL</code>, the
2107
* result is <code>null</code>
2108
* @throws SQLException if the given column index is out of bounds,
2109
* the cursor is not on a valid row, or this method fails
2110
*/
2111
public java.sql.Date getDate(int columnIndex) throws SQLException {
2112
Object value;
2113
2114
// sanity check.
2115
checkIndex(columnIndex);
2116
// make sure the cursor is on a valid row
2117
checkCursor();
2118
2119
setLastValueNull(false);
2120
value = getCurrentRow().getColumnObject(columnIndex);
2121
2122
// check for SQL NULL
2123
if (value == null) {
2124
setLastValueNull(true);
2125
return null;
2126
}
2127
2128
/*
2129
* The object coming back from the db could be
2130
* a date, a timestamp, or a char field variety.
2131
* If it's a date type return it, a timestamp
2132
* we turn into a long and then into a date,
2133
* char strings we try to parse. Yuck.
2134
*/
2135
switch (RowSetMD.getColumnType(columnIndex)) {
2136
case java.sql.Types.DATE: {
2137
long sec = ((java.sql.Date)value).getTime();
2138
return new java.sql.Date(sec);
2139
}
2140
case java.sql.Types.TIMESTAMP: {
2141
long sec = ((java.sql.Timestamp)value).getTime();
2142
return new java.sql.Date(sec);
2143
}
2144
case java.sql.Types.CHAR:
2145
case java.sql.Types.VARCHAR:
2146
case java.sql.Types.LONGVARCHAR: {
2147
try {
2148
DateFormat df = DateFormat.getDateInstance();
2149
return ((java.sql.Date)(df.parse(value.toString())));
2150
} catch (ParseException ex) {
2151
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.datefail").toString(),
2152
new Object[] {value.toString().trim(), columnIndex}));
2153
}
2154
}
2155
default: {
2156
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.datefail").toString(),
2157
new Object[] {value.toString().trim(), columnIndex}));
2158
}
2159
}
2160
}
2161
2162
/**
2163
* Retrieves the value of the designated column in the current row
2164
* of this <code>CachedRowSetImpl</code> object as a
2165
* <code>java.sql.Time</code> object.
2166
*
2167
* @param columnIndex the first column is <code>1</code>, the second
2168
* is <code>2</code>, and so on; must be <code>1</code> or larger
2169
* and equal to or less than the number of columns in the rowset
2170
* @return the column value; if the value is SQL <code>NULL</code>, the
2171
* result is <code>null</code>
2172
* @throws SQLException if the given column index is out of bounds,
2173
* the cursor is not on a valid row, or this method fails
2174
*/
2175
public java.sql.Time getTime(int columnIndex) throws SQLException {
2176
Object value;
2177
2178
// sanity check.
2179
checkIndex(columnIndex);
2180
// make sure the cursor is on a valid row
2181
checkCursor();
2182
2183
setLastValueNull(false);
2184
value = getCurrentRow().getColumnObject(columnIndex);
2185
2186
// check for SQL NULL
2187
if (value == null) {
2188
setLastValueNull(true);
2189
return null;
2190
}
2191
2192
/*
2193
* The object coming back from the db could be
2194
* a date, a timestamp, or a char field variety.
2195
* If it's a date type return it, a timestamp
2196
* we turn into a long and then into a date,
2197
* char strings we try to parse. Yuck.
2198
*/
2199
switch (RowSetMD.getColumnType(columnIndex)) {
2200
case java.sql.Types.TIME: {
2201
return (java.sql.Time)value;
2202
}
2203
case java.sql.Types.TIMESTAMP: {
2204
long sec = ((java.sql.Timestamp)value).getTime();
2205
return new java.sql.Time(sec);
2206
}
2207
case java.sql.Types.CHAR:
2208
case java.sql.Types.VARCHAR:
2209
case java.sql.Types.LONGVARCHAR: {
2210
try {
2211
DateFormat tf = DateFormat.getTimeInstance();
2212
return ((java.sql.Time)(tf.parse(value.toString())));
2213
} catch (ParseException ex) {
2214
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.timefail").toString(),
2215
new Object[] {value.toString().trim(), columnIndex}));
2216
}
2217
}
2218
default: {
2219
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.timefail").toString(),
2220
new Object[] {value.toString().trim(), columnIndex}));
2221
}
2222
}
2223
}
2224
2225
/**
2226
* Retrieves the value of the designated column in the current row
2227
* of this <code>CachedRowSetImpl</code> object as a
2228
* <code>java.sql.Timestamp</code> object.
2229
*
2230
* @param columnIndex the first column is <code>1</code>, the second
2231
* is <code>2</code>, and so on; must be <code>1</code> or larger
2232
* and equal to or less than the number of columns in the rowset
2233
* @return the column value; if the value is SQL <code>NULL</code>, the
2234
* result is <code>null</code>
2235
* @throws SQLException if the given column index is out of bounds,
2236
* the cursor is not on a valid row, or this method fails
2237
*/
2238
public java.sql.Timestamp getTimestamp(int columnIndex) throws SQLException {
2239
Object value;
2240
2241
// sanity check.
2242
checkIndex(columnIndex);
2243
// make sure the cursor is on a valid row
2244
checkCursor();
2245
2246
setLastValueNull(false);
2247
value = getCurrentRow().getColumnObject(columnIndex);
2248
2249
// check for SQL NULL
2250
if (value == null) {
2251
setLastValueNull(true);
2252
return null;
2253
}
2254
2255
/*
2256
* The object coming back from the db could be
2257
* a date, a timestamp, or a char field variety.
2258
* If it's a date type return it; a timestamp
2259
* we turn into a long and then into a date;
2260
* char strings we try to parse. Yuck.
2261
*/
2262
switch (RowSetMD.getColumnType(columnIndex)) {
2263
case java.sql.Types.TIMESTAMP: {
2264
return (java.sql.Timestamp)value;
2265
}
2266
case java.sql.Types.TIME: {
2267
long sec = ((java.sql.Time)value).getTime();
2268
return new java.sql.Timestamp(sec);
2269
}
2270
case java.sql.Types.DATE: {
2271
long sec = ((java.sql.Date)value).getTime();
2272
return new java.sql.Timestamp(sec);
2273
}
2274
case java.sql.Types.CHAR:
2275
case java.sql.Types.VARCHAR:
2276
case java.sql.Types.LONGVARCHAR: {
2277
try {
2278
DateFormat tf = DateFormat.getTimeInstance();
2279
return ((java.sql.Timestamp)(tf.parse(value.toString())));
2280
} catch (ParseException ex) {
2281
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.timefail").toString(),
2282
new Object[] {value.toString().trim(), columnIndex}));
2283
}
2284
}
2285
default: {
2286
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.timefail").toString(),
2287
new Object[] {value.toString().trim(), columnIndex}));
2288
}
2289
}
2290
}
2291
2292
/**
2293
* Retrieves the value of the designated column in the current row of this
2294
* <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
2295
* object.
2296
*
2297
* A column value can be retrieved as a stream of ASCII characters
2298
* and then read in chunks from the stream. This method is particularly
2299
* suitable for retrieving large <code>LONGVARCHAR</code> values. The JDBC
2300
* driver will do any necessary conversion from the database format into ASCII.
2301
*
2302
* <P><B>Note:</B> All the data in the returned stream must be
2303
* read prior to getting the value of any other column. The next
2304
* call to a get method implicitly closes the stream. . Also, a
2305
* stream may return <code>0</code> for <code>CachedRowSetImpl.available()</code>
2306
* whether there is data available or not.
2307
*
2308
* @param columnIndex the first column is <code>1</code>, the second
2309
* is <code>2</code>, and so on; must be <code>1</code> or larger
2310
* and equal to or less than the number of columns in this rowset
2311
* @return a Java input stream that delivers the database column value
2312
* as a stream of one-byte ASCII characters. If the value is SQL
2313
* <code>NULL</code>, the result is <code>null</code>.
2314
* @throws SQLException if (1) the given column index is out of bounds,
2315
* (2) the cursor is not on one of this rowset's rows or its
2316
* insert row, or (3) the designated column does not store an
2317
* SQL <code>CHAR, VARCHAR</code>, <code><b>LONGVARCHAR</b></code>
2318
* <code>BINARY, VARBINARY</code> or <code>LONGVARBINARY</code> value. The
2319
* bold SQL type designates the recommended return types that this method is
2320
* used to retrieve.
2321
* @see #getAsciiStream(String)
2322
*/
2323
public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException {
2324
Object value;
2325
2326
// always free an old stream
2327
asciiStream = null;
2328
2329
// sanity check
2330
checkIndex(columnIndex);
2331
//make sure the cursor is on a vlid row
2332
checkCursor();
2333
2334
value = getCurrentRow().getColumnObject(columnIndex);
2335
if (value == null) {
2336
lastValueNull = true;
2337
return null;
2338
}
2339
2340
try {
2341
if (isString(RowSetMD.getColumnType(columnIndex))) {
2342
asciiStream = new ByteArrayInputStream(((String)value).getBytes("ASCII"));
2343
} else {
2344
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
2345
}
2346
} catch (java.io.UnsupportedEncodingException ex) {
2347
throw new SQLException(ex.getMessage());
2348
}
2349
2350
return asciiStream;
2351
}
2352
2353
/**
2354
* A column value can be retrieved as a stream of Unicode characters
2355
* and then read in chunks from the stream. This method is particularly
2356
* suitable for retrieving large LONGVARCHAR values. The JDBC driver will
2357
* do any necessary conversion from the database format into Unicode.
2358
*
2359
* <P><B>Note:</B> All the data in the returned stream must be
2360
* read prior to getting the value of any other column. The next
2361
* call to a get method implicitly closes the stream. . Also, a
2362
* stream may return 0 for available() whether there is data
2363
* available or not.
2364
*
2365
* @param columnIndex the first column is <code>1</code>, the second
2366
* is <code>2</code>, and so on; must be <code>1</code> or larger
2367
* and equal to or less than the number of columns in this rowset
2368
* @return a Java input stream that delivers the database column value
2369
* as a stream of two byte Unicode characters. If the value is SQL NULL
2370
* then the result is null.
2371
* @throws SQLException if an error occurs
2372
* @deprecated
2373
*/
2374
@Deprecated
2375
public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException {
2376
// always free an old stream
2377
unicodeStream = null;
2378
2379
// sanity check.
2380
checkIndex(columnIndex);
2381
// make sure the cursor is on a valid row
2382
checkCursor();
2383
2384
if (isBinary(RowSetMD.getColumnType(columnIndex)) == false &&
2385
isString(RowSetMD.getColumnType(columnIndex)) == false) {
2386
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
2387
}
2388
2389
Object value = getCurrentRow().getColumnObject(columnIndex);
2390
if (value == null) {
2391
lastValueNull = true;
2392
return null;
2393
}
2394
2395
unicodeStream = new StringBufferInputStream(value.toString());
2396
2397
return unicodeStream;
2398
}
2399
2400
/**
2401
* Retrieves the value of the designated column in the current row of this
2402
* <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
2403
* object.
2404
* <P>
2405
* A column value can be retrieved as a stream of uninterpreted bytes
2406
* and then read in chunks from the stream. This method is particularly
2407
* suitable for retrieving large <code>LONGVARBINARY</code> values.
2408
*
2409
* <P><B>Note:</B> All the data in the returned stream must be
2410
* read prior to getting the value of any other column. The next
2411
* call to a get method implicitly closes the stream. Also, a
2412
* stream may return <code>0</code> for
2413
* <code>CachedRowSetImpl.available()</code> whether there is data
2414
* available or not.
2415
*
2416
* @param columnIndex the first column is <code>1</code>, the second
2417
* is <code>2</code>, and so on; must be <code>1</code> or larger
2418
* and equal to or less than the number of columns in the rowset
2419
* @return a Java input stream that delivers the database column value
2420
* as a stream of uninterpreted bytes. If the value is SQL <code>NULL</code>
2421
* then the result is <code>null</code>.
2422
* @throws SQLException if (1) the given column index is out of bounds,
2423
* (2) the cursor is not on one of this rowset's rows or its
2424
* insert row, or (3) the designated column does not store an
2425
* SQL <code>BINARY, VARBINARY</code> or <code><b>LONGVARBINARY</b></code>
2426
* The bold type indicates the SQL type that this method is recommened
2427
* to retrieve.
2428
* @see #getBinaryStream(String)
2429
*/
2430
public java.io.InputStream getBinaryStream(int columnIndex) throws SQLException {
2431
2432
// always free an old stream
2433
binaryStream = null;
2434
2435
// sanity check.
2436
checkIndex(columnIndex);
2437
// make sure the cursor is on a valid row
2438
checkCursor();
2439
2440
if (isBinary(RowSetMD.getColumnType(columnIndex)) == false) {
2441
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
2442
}
2443
2444
Object value = getCurrentRow().getColumnObject(columnIndex);
2445
if (value == null) {
2446
lastValueNull = true;
2447
return null;
2448
}
2449
2450
binaryStream = new ByteArrayInputStream((byte[])value);
2451
2452
return binaryStream;
2453
2454
}
2455
2456
2457
// Methods for accessing results by column name
2458
2459
/**
2460
* Retrieves the value stored in the designated column
2461
* of the current row as a <code>String</code> object.
2462
*
2463
* @param columnName a <code>String</code> object giving the SQL name of
2464
* a column in this <code>CachedRowSetImpl</code> object
2465
* @return the column value; if the value is SQL <code>NULL</code>,
2466
* the result is <code>null</code>
2467
* @throws SQLException if (1) the given column name is not the name of
2468
* a column in this rowset, (2) the cursor is not on one of
2469
* this rowset's rows or its insert row, or (3) the designated
2470
* column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
2471
* BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, <b>CHAR</b>,
2472
* <b>VARCHAR</b></code> or <code>LONGVARCHAR<</code> value. The bold SQL type
2473
* designates the recommended return type.
2474
*/
2475
public String getString(String columnName) throws SQLException {
2476
return getString(getColIdxByName(columnName));
2477
}
2478
2479
/**
2480
* Retrieves the value stored in the designated column
2481
* of the current row as a <code>boolean</code> value.
2482
*
2483
* @param columnName a <code>String</code> object giving the SQL name of
2484
* a column in this <code>CachedRowSetImpl</code> object
2485
* @return the column value as a <code>boolean</code> in the Java programming
2486
* language; if the value is SQL <code>NULL</code>,
2487
* the result is <code>false</code>
2488
* @throws SQLException if (1) the given column name is not the name of
2489
* a column in this rowset, (2) the cursor is not on one of
2490
* this rowset's rows or its insert row, or (3) the designated
2491
* column does not store an SQL <code>BOOLEAN</code> value
2492
* @see #getBoolean(int)
2493
*/
2494
public boolean getBoolean(String columnName) throws SQLException {
2495
return getBoolean(getColIdxByName(columnName));
2496
}
2497
2498
/**
2499
* Retrieves the value stored in the designated column
2500
* of the current row as a <code>byte</code> value.
2501
*
2502
* @param columnName a <code>String</code> object giving the SQL name of
2503
* a column in this <code>CachedRowSetImpl</code> object
2504
* @return the column value as a <code>byte</code> in the Java programming
2505
* language; if the value is SQL <code>NULL</code>, the result is <code>0</code>
2506
* @throws SQLException if (1) the given column name is not the name of
2507
* a column in this rowset, (2) the cursor is not on one of
2508
* this rowset's rows or its insert row, or (3) the designated
2509
* column does not store an SQL <code><B>TINYINT</B>, SMALLINT, INTEGER,
2510
* BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
2511
* VARCHAR</code> or <code>LONGVARCHAR</code> value. The
2512
* bold type designates the recommended return type
2513
*/
2514
public byte getByte(String columnName) throws SQLException {
2515
return getByte(getColIdxByName(columnName));
2516
}
2517
2518
/**
2519
* Retrieves the value stored in the designated column
2520
* of the current row as a <code>short</code> value.
2521
*
2522
* @param columnName a <code>String</code> object giving the SQL name of
2523
* a column in this <code>CachedRowSetImpl</code> object
2524
* @return the column value; if the value is SQL <code>NULL</code>,
2525
* the result is <code>0</code>
2526
* @throws SQLException if (1) the given column name is not the name of
2527
* a column in this rowset, (2) the cursor is not on one of
2528
* this rowset's rows or its insert row, or (3) the designated
2529
* column does not store an SQL <code>TINYINT, <b>SMALLINT</b>, INTEGER
2530
* BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
2531
* VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
2532
* designates the recommended return type.
2533
* @see #getShort(int)
2534
*/
2535
public short getShort(String columnName) throws SQLException {
2536
return getShort(getColIdxByName(columnName));
2537
}
2538
2539
/**
2540
* Retrieves the value stored in the designated column
2541
* of the current row as an <code>int</code> value.
2542
*
2543
* @param columnName a <code>String</code> object giving the SQL name of
2544
* a column in this <code>CachedRowSetImpl</code> object
2545
* @return the column value; if the value is SQL <code>NULL</code>,
2546
* the result is <code>0</code>
2547
* @throws SQLException if (1) the given column name is not the name
2548
* of a column in this rowset,
2549
* (2) the cursor is not on one of this rowset's rows or its
2550
* insert row, or (3) the designated column does not store an
2551
* SQL <code>TINYINT, SMALLINT, <b>INTEGER</b>, BIGINT, REAL
2552
* FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
2553
* or <code>LONGVARCHAR</code> value. The bold SQL type designates the
2554
* recommended return type.
2555
*/
2556
public int getInt(String columnName) throws SQLException {
2557
return getInt(getColIdxByName(columnName));
2558
}
2559
2560
/**
2561
* Retrieves the value stored in the designated column
2562
* of the current row as a <code>long</code> value.
2563
*
2564
* @param columnName a <code>String</code> object giving the SQL name of
2565
* a column in this <code>CachedRowSetImpl</code> object
2566
* @return the column value; if the value is SQL <code>NULL</code>,
2567
* the result is <code>0</code>
2568
* @throws SQLException if (1) the given column name is not the name of
2569
* a column in this rowset, (2) the cursor is not on one of
2570
* this rowset's rows or its insert row, or (3) the designated
2571
* column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
2572
* <b>BIGINT</b>, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
2573
* VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
2574
* designates the recommended return type.
2575
* @see #getLong(int)
2576
*/
2577
public long getLong(String columnName) throws SQLException {
2578
return getLong(getColIdxByName(columnName));
2579
}
2580
2581
/**
2582
* Retrieves the value stored in the designated column
2583
* of the current row as a <code>float</code> value.
2584
*
2585
* @param columnName a <code>String</code> object giving the SQL name of
2586
* a column in this <code>CachedRowSetImpl</code> object
2587
* @return the column value; if the value is SQL <code>NULL</code>,
2588
* the result is <code>0</code>
2589
* @throws SQLException if (1) the given column name is not the name of
2590
* a column in this rowset, (2) the cursor is not on one of
2591
* this rowset's rows or its insert row, or (3) the designated
2592
* column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
2593
* BIGINT, <b>REAL</b>, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
2594
* VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
2595
* designates the recommended return type.
2596
* @see #getFloat(String)
2597
*/
2598
public float getFloat(String columnName) throws SQLException {
2599
return getFloat(getColIdxByName(columnName));
2600
}
2601
2602
/**
2603
* Retrieves the value stored in the designated column
2604
* of the current row of this <code>CachedRowSetImpl</code> object
2605
* as a <code>double</code> value.
2606
*
2607
* @param columnName a <code>String</code> object giving the SQL name of
2608
* a column in this <code>CachedRowSetImpl</code> object
2609
* @return the column value; if the value is SQL <code>NULL</code>,
2610
* the result is <code>0</code>
2611
* @throws SQLException if (1) the given column name is not the name of
2612
* a column in this rowset, (2) the cursor is not on one of
2613
* this rowset's rows or its insert row, or (3) the designated
2614
* column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
2615
* BIGINT, REAL, <b>FLOAT</b>, <b>DOUBLE</b>, DECIMAL, NUMERIC, BIT, CHAR,
2616
* VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
2617
* designates the recommended return types.
2618
* @see #getDouble(int)
2619
*/
2620
public double getDouble(String columnName) throws SQLException {
2621
return getDouble(getColIdxByName(columnName));
2622
}
2623
2624
/**
2625
* Retrieves the value stored in the designated column
2626
* of the current row as a <code>java.math.BigDecimal</code> object.
2627
*
2628
* @param columnName a <code>String</code> object giving the SQL name of
2629
* a column in this <code>CachedRowSetImpl</code> object
2630
* @param scale the number of digits to the right of the decimal point
2631
* @return a java.math.BugDecimal object with <code><i>scale</i></code>
2632
* number of digits to the right of the decimal point.
2633
* @throws SQLException if (1) the given column name is not the name of
2634
* a column in this rowset, (2) the cursor is not on one of
2635
* this rowset's rows or its insert row, or (3) the designated
2636
* column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
2637
* BIGINT, REAL, FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT CHAR,
2638
* VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
2639
* designates the recommended return type that this method is used to
2640
* retrieve.
2641
* @deprecated Use the <code>getBigDecimal(String columnName)</code>
2642
* method instead
2643
*/
2644
@Deprecated
2645
public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException {
2646
return getBigDecimal(getColIdxByName(columnName), scale);
2647
}
2648
2649
/**
2650
* Retrieves the value stored in the designated column
2651
* of the current row as a <code>byte</code> array.
2652
* The bytes represent the raw values returned by the driver.
2653
*
2654
* @param columnName a <code>String</code> object giving the SQL name of
2655
* a column in this <code>CachedRowSetImpl</code> object
2656
* @return the column value as a <code>byte</code> array in the Java programming
2657
* language; if the value is SQL <code>NULL</code>, the result is <code>null</code>
2658
* @throws SQLException if (1) the given column name is not the name of
2659
* a column in this rowset, (2) the cursor is not on one of
2660
* this rowset's rows or its insert row, or (3) the designated
2661
* column does not store an SQL <code><b>BINARY</b>, <b>VARBINARY</b>
2662
* </code> or <code>LONGVARBINARY</code> values
2663
* The bold SQL type designates the recommended return type.
2664
* @see #getBytes(int)
2665
*/
2666
public byte[] getBytes(String columnName) throws SQLException {
2667
return getBytes(getColIdxByName(columnName));
2668
}
2669
2670
/**
2671
* Retrieves the value stored in the designated column
2672
* of the current row as a <code>java.sql.Date</code> object.
2673
*
2674
* @param columnName a <code>String</code> object giving the SQL name of
2675
* a column in this <code>CachedRowSetImpl</code> object
2676
* @return the column value; if the value is SQL <code>NULL</code>,
2677
* the result is <code>null</code>
2678
* @throws SQLException if (1) the given column name is not the name of
2679
* a column in this rowset, (2) the cursor is not on one of
2680
* this rowset's rows or its insert row, or (3) the designated
2681
* column does not store an SQL <code>DATE</code> or
2682
* <code>TIMESTAMP</code> value
2683
*/
2684
public java.sql.Date getDate(String columnName) throws SQLException {
2685
return getDate(getColIdxByName(columnName));
2686
}
2687
2688
/**
2689
* Retrieves the value stored in the designated column
2690
* of the current row as a <code>java.sql.Time</code> object.
2691
*
2692
* @param columnName a <code>String</code> object giving the SQL name of
2693
* a column in this <code>CachedRowSetImpl</code> object
2694
* @return the column value; if the value is SQL <code>NULL</code>,
2695
* the result is <code>null</code>
2696
* @throws SQLException if the given column name does not match one of
2697
* this rowset's column names or the cursor is not on one of
2698
* this rowset's rows or its insert row
2699
*/
2700
public java.sql.Time getTime(String columnName) throws SQLException {
2701
return getTime(getColIdxByName(columnName));
2702
}
2703
2704
/**
2705
* Retrieves the value stored in the designated column
2706
* of the current row as a <code>java.sql.Timestamp</code> object.
2707
*
2708
* @param columnName a <code>String</code> object giving the SQL name of
2709
* a column in this <code>CachedRowSetImpl</code> object
2710
* @return the column value; if the value is SQL <code>NULL</code>,
2711
* the result is <code>null</code>
2712
* @throws SQLException if the given column name does not match one of
2713
* this rowset's column names or the cursor is not on one of
2714
* this rowset's rows or its insert row
2715
*/
2716
public java.sql.Timestamp getTimestamp(String columnName) throws SQLException {
2717
return getTimestamp(getColIdxByName(columnName));
2718
}
2719
2720
/**
2721
* Retrieves the value of the designated column in the current row of this
2722
* <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
2723
* object.
2724
*
2725
* A column value can be retrieved as a stream of ASCII characters
2726
* and then read in chunks from the stream. This method is particularly
2727
* suitable for retrieving large <code>LONGVARCHAR</code> values. The
2728
* <code>SyncProvider</code> will rely on the JDBC driver to do any necessary
2729
* conversion from the database format into ASCII format.
2730
*
2731
* <P><B>Note:</B> All the data in the returned stream must
2732
* be read prior to getting the value of any other column. The
2733
* next call to a <code>getXXX</code> method implicitly closes the stream.
2734
*
2735
* @param columnName a <code>String</code> object giving the SQL name of
2736
* a column in this <code>CachedRowSetImpl</code> object
2737
* @return a Java input stream that delivers the database column value
2738
* as a stream of one-byte ASCII characters. If the value is SQL
2739
* <code>NULL</code>, the result is <code>null</code>.
2740
* @throws SQLException if (1) the given column name is not the name of
2741
* a column in this rowset
2742
* (2) the cursor is not on one of this rowset's rows or its
2743
* insert row, or (3) the designated column does not store an
2744
* SQL <code>CHAR, VARCHAR</code>, <code><b>LONGVARCHAR</b></code>
2745
* <code>BINARY, VARBINARY</code> or <code>LONGVARBINARY</code> value. The
2746
* bold SQL type designates the recommended return types that this method is
2747
* used to retrieve.
2748
* @see #getAsciiStream(int)
2749
*/
2750
public java.io.InputStream getAsciiStream(String columnName) throws SQLException {
2751
return getAsciiStream(getColIdxByName(columnName));
2752
2753
}
2754
2755
/**
2756
* A column value can be retrieved as a stream of Unicode characters
2757
* and then read in chunks from the stream. This method is particularly
2758
* suitable for retrieving large <code>LONGVARCHAR</code> values.
2759
* The JDBC driver will do any necessary conversion from the database
2760
* format into Unicode.
2761
*
2762
* <P><B>Note:</B> All the data in the returned stream must
2763
* be read prior to getting the value of any other column. The
2764
* next call to a <code>getXXX</code> method implicitly closes the stream.
2765
*
2766
* @param columnName a <code>String</code> object giving the SQL name of
2767
* a column in this <code>CachedRowSetImpl</code> object
2768
* @return a Java input stream that delivers the database column value
2769
* as a stream of two-byte Unicode characters. If the value is
2770
* SQL <code>NULL</code>, the result is <code>null</code>.
2771
* @throws SQLException if the given column name does not match one of
2772
* this rowset's column names or the cursor is not on one of
2773
* this rowset's rows or its insert row
2774
* @deprecated use the method <code>getCharacterStream</code> instead
2775
*/
2776
@Deprecated
2777
public java.io.InputStream getUnicodeStream(String columnName) throws SQLException {
2778
return getUnicodeStream(getColIdxByName(columnName));
2779
}
2780
2781
/**
2782
* Retrieves the value of the designated column in the current row of this
2783
* <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
2784
* object.
2785
* <P>
2786
* A column value can be retrieved as a stream of uninterpreted bytes
2787
* and then read in chunks from the stream. This method is particularly
2788
* suitable for retrieving large <code>LONGVARBINARY</code> values.
2789
*
2790
* <P><B>Note:</B> All the data in the returned stream must be
2791
* read prior to getting the value of any other column. The next
2792
* call to a get method implicitly closes the stream. Also, a
2793
* stream may return <code>0</code> for <code>CachedRowSetImpl.available()</code>
2794
* whether there is data available or not.
2795
*
2796
* @param columnName a <code>String</code> object giving the SQL name of
2797
* a column in this <code>CachedRowSetImpl</code> object
2798
* @return a Java input stream that delivers the database column value
2799
* as a stream of uninterpreted bytes. If the value is SQL
2800
* <code>NULL</code>, the result is <code>null</code>.
2801
* @throws SQLException if (1) the given column name is unknown,
2802
* (2) the cursor is not on one of this rowset's rows or its
2803
* insert row, or (3) the designated column does not store an
2804
* SQL <code>BINARY, VARBINARY</code> or <code><b>LONGVARBINARY</b></code>
2805
* The bold type indicates the SQL type that this method is recommened
2806
* to retrieve.
2807
* @see #getBinaryStream(int)
2808
*
2809
*/
2810
public java.io.InputStream getBinaryStream(String columnName) throws SQLException {
2811
return getBinaryStream(getColIdxByName(columnName));
2812
}
2813
2814
2815
// Advanced features:
2816
2817
/**
2818
* The first warning reported by calls on this <code>CachedRowSetImpl</code>
2819
* object is returned. Subsequent <code>CachedRowSetImpl</code> warnings will
2820
* be chained to this <code>SQLWarning</code>.
2821
*
2822
* <P>The warning chain is automatically cleared each time a new
2823
* row is read.
2824
*
2825
* <P><B>Note:</B> This warning chain only covers warnings caused
2826
* by <code>ResultSet</code> methods. Any warning caused by statement
2827
* methods (such as reading OUT parameters) will be chained on the
2828
* <code>Statement</code> object.
2829
*
2830
* @return the first SQLWarning or null
2831
*/
2832
public SQLWarning getWarnings() {
2833
return sqlwarn;
2834
}
2835
2836
/**
2837
* Clears all the warnings reporeted for the <code>CachedRowSetImpl</code>
2838
* object. After a call to this method, the <code>getWarnings</code> method
2839
* returns <code>null</code> until a new warning is reported for this
2840
* <code>CachedRowSetImpl</code> object.
2841
*/
2842
public void clearWarnings() {
2843
sqlwarn = null;
2844
}
2845
2846
/**
2847
* Retrieves the name of the SQL cursor used by this
2848
* <code>CachedRowSetImpl</code> object.
2849
*
2850
* <P>In SQL, a result table is retrieved through a cursor that is
2851
* named. The current row of a <code>ResultSet</code> can be updated or deleted
2852
* using a positioned update/delete statement that references the
2853
* cursor name. To ensure that the cursor has the proper isolation
2854
* level to support an update operation, the cursor's <code>SELECT</code>
2855
* statement should be of the form <code>select for update</code>.
2856
* If the <code>for update</code> clause
2857
* is omitted, positioned updates may fail.
2858
*
2859
* <P>JDBC supports this SQL feature by providing the name of the
2860
* SQL cursor used by a <code>ResultSet</code> object. The current row
2861
* of a result set is also the current row of this SQL cursor.
2862
*
2863
* <P><B>Note:</B> If positioned updates are not supported, an
2864
* <code>SQLException</code> is thrown.
2865
*
2866
* @return the SQL cursor name for this <code>CachedRowSetImpl</code> object's
2867
* cursor
2868
* @throws SQLException if an error occurs
2869
*/
2870
public String getCursorName() throws SQLException {
2871
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.posupdate").toString());
2872
}
2873
2874
/**
2875
* Retrieves a <code>ResultSetMetaData</code> object instance that
2876
* contains information about the <code>CachedRowSet</code> object.
2877
* However, applications should cast the returned object to a
2878
* <code>RowSetMetaData</code> interface implementation. In the
2879
* reference implementation, this cast can be done on the
2880
* <code>RowSetMetaDataImpl</code> class.
2881
* <P>
2882
* For example:
2883
* <pre>
2884
* CachedRowSet crs = new CachedRowSetImpl();
2885
* RowSetMetaDataImpl metaData =
2886
* (RowSetMetaDataImpl)crs.getMetaData();
2887
* // Set the number of columns in the RowSet object for
2888
* // which this RowSetMetaDataImpl object was created to the
2889
* // given number.
2890
* metaData.setColumnCount(3);
2891
* crs.setMetaData(metaData);
2892
* </pre>
2893
*
2894
* @return the <code>ResultSetMetaData</code> object that describes this
2895
* <code>CachedRowSetImpl</code> object's columns
2896
* @throws SQLException if an error occurs in generating the RowSet
2897
* meta data; or if the <code>CachedRowSetImpl</code> is empty.
2898
* @see javax.sql.RowSetMetaData
2899
*/
2900
public ResultSetMetaData getMetaData() throws SQLException {
2901
return (ResultSetMetaData)RowSetMD;
2902
}
2903
2904
2905
/**
2906
* Retrieves the value of the designated column in the current row
2907
* of this <code>CachedRowSetImpl</code> object as an
2908
* <code>Object</code> value.
2909
* <P>
2910
* The type of the <code>Object</code> will be the default
2911
* Java object type corresponding to the column's SQL type,
2912
* following the mapping for built-in types specified in the JDBC 3.0
2913
* specification.
2914
* <P>
2915
* This method may also be used to read datatabase-specific
2916
* abstract data types.
2917
* <P>
2918
* This implementation of the method <code>getObject</code> extends its
2919
* behavior so that it gets the attributes of an SQL structured type
2920
* as an array of <code>Object</code> values. This method also custom
2921
* maps SQL user-defined types to classes in the Java programming language.
2922
* When the specified column contains
2923
* a structured or distinct value, the behavior of this method is as
2924
* if it were a call to the method <code>getObject(columnIndex,
2925
* this.getStatement().getConnection().getTypeMap())</code>.
2926
*
2927
* @param columnIndex the first column is <code>1</code>, the second
2928
* is <code>2</code>, and so on; must be <code>1</code> or larger
2929
* and equal to or less than the number of columns in the rowset
2930
* @return a <code>java.lang.Object</code> holding the column value;
2931
* if the value is SQL <code>NULL</code>, the result is <code>null</code>
2932
* @throws SQLException if the given column index is out of bounds,
2933
* the cursor is not on a valid row, or there is a problem getting
2934
* the <code>Class</code> object for a custom mapping
2935
* @see #getObject(String)
2936
*/
2937
public Object getObject(int columnIndex) throws SQLException {
2938
Object value;
2939
Map<String, Class<?>> map;
2940
2941
// sanity check.
2942
checkIndex(columnIndex);
2943
// make sure the cursor is on a valid row
2944
checkCursor();
2945
2946
setLastValueNull(false);
2947
value = getCurrentRow().getColumnObject(columnIndex);
2948
2949
// check for SQL NULL
2950
if (value == null) {
2951
setLastValueNull(true);
2952
return null;
2953
}
2954
if (value instanceof Struct) {
2955
Struct s = (Struct)value;
2956
map = getTypeMap();
2957
// look up the class in the map
2958
Class<?> c = map.get(s.getSQLTypeName());
2959
if (c != null) {
2960
// create new instance of the class
2961
SQLData obj = null;
2962
try {
2963
obj = (SQLData) ReflectUtil.newInstance(c);
2964
} catch(Exception ex) {
2965
throw new SQLException("Unable to Instantiate: ", ex);
2966
}
2967
// get the attributes from the struct
2968
Object attribs[] = s.getAttributes(map);
2969
// create the SQLInput "stream"
2970
SQLInputImpl sqlInput = new SQLInputImpl(attribs, map);
2971
// read the values...
2972
obj.readSQL(sqlInput, s.getSQLTypeName());
2973
return (Object)obj;
2974
}
2975
}
2976
return value;
2977
}
2978
2979
/**
2980
* Retrieves the value of the designated column in the current row
2981
* of this <code>CachedRowSetImpl</code> object as an
2982
* <code>Object</code> value.
2983
* <P>
2984
* The type of the <code>Object</code> will be the default
2985
* Java object type corresponding to the column's SQL type,
2986
* following the mapping for built-in types specified in the JDBC 3.0
2987
* specification.
2988
* <P>
2989
* This method may also be used to read datatabase-specific
2990
* abstract data types.
2991
* <P>
2992
* This implementation of the method <code>getObject</code> extends its
2993
* behavior so that it gets the attributes of an SQL structured type
2994
* as an array of <code>Object</code> values. This method also custom
2995
* maps SQL user-defined types to classes
2996
* in the Java programming language. When the specified column contains
2997
* a structured or distinct value, the behavior of this method is as
2998
* if it were a call to the method <code>getObject(columnIndex,
2999
* this.getStatement().getConnection().getTypeMap())</code>.
3000
*
3001
* @param columnName a <code>String</code> object that must match the
3002
* SQL name of a column in this rowset, ignoring case
3003
* @return a <code>java.lang.Object</code> holding the column value;
3004
* if the value is SQL <code>NULL</code>, the result is <code>null</code>
3005
* @throws SQLException if (1) the given column name does not match one of
3006
* this rowset's column names, (2) the cursor is not
3007
* on a valid row, or (3) there is a problem getting
3008
* the <code>Class</code> object for a custom mapping
3009
* @see #getObject(int)
3010
*/
3011
public Object getObject(String columnName) throws SQLException {
3012
return getObject(getColIdxByName(columnName));
3013
}
3014
3015
//----------------------------------------------------------------
3016
3017
/**
3018
* Maps the given column name for one of this <code>CachedRowSetImpl</code>
3019
* object's columns to its column number.
3020
*
3021
* @param columnName a <code>String</code> object that must match the
3022
* SQL name of a column in this rowset, ignoring case
3023
* @return the column index of the given column name
3024
* @throws SQLException if the given column name does not match one
3025
* of this rowset's column names
3026
*/
3027
public int findColumn(String columnName) throws SQLException {
3028
return getColIdxByName(columnName);
3029
}
3030
3031
3032
//--------------------------JDBC 2.0-----------------------------------
3033
3034
//---------------------------------------------------------------------
3035
// Getter's and Setter's
3036
//---------------------------------------------------------------------
3037
3038
/**
3039
* Retrieves the value stored in the designated column
3040
* of the current row as a <code>java.io.Reader</code> object.
3041
*
3042
* <P><B>Note:</B> All the data in the returned stream must
3043
* be read prior to getting the value of any other column. The
3044
* next call to a <code>getXXX</code> method implicitly closes the stream.
3045
*
3046
* @param columnIndex the first column is <code>1</code>, the second
3047
* is <code>2</code>, and so on; must be <code>1</code> or larger
3048
* and equal to or less than the number of columns in the rowset
3049
* @return a Java character stream that delivers the database column value
3050
* as a stream of two-byte unicode characters in a
3051
* <code>java.io.Reader</code> object. If the value is
3052
* SQL <code>NULL</code>, the result is <code>null</code>.
3053
* @throws SQLException if (1) the given column index is out of bounds,
3054
* (2) the cursor is not on one of this rowset's rows or its
3055
* insert row, or (3) the designated column does not store an
3056
* SQL <code>CHAR, VARCHAR, <b>LONGVARCHAR</b>, BINARY, VARBINARY</code> or
3057
* <code>LONGVARBINARY</code> value.
3058
* The bold SQL type designates the recommended return type.
3059
* @see #getCharacterStream(String)
3060
*/
3061
public java.io.Reader getCharacterStream(int columnIndex) throws SQLException{
3062
3063
// sanity check.
3064
checkIndex(columnIndex);
3065
// make sure the cursor is on a valid row
3066
checkCursor();
3067
3068
if (isBinary(RowSetMD.getColumnType(columnIndex))) {
3069
Object value = getCurrentRow().getColumnObject(columnIndex);
3070
if (value == null) {
3071
lastValueNull = true;
3072
return null;
3073
}
3074
charStream = new InputStreamReader
3075
(new ByteArrayInputStream((byte[])value));
3076
} else if (isString(RowSetMD.getColumnType(columnIndex))) {
3077
Object value = getCurrentRow().getColumnObject(columnIndex);
3078
if (value == null) {
3079
lastValueNull = true;
3080
return null;
3081
}
3082
charStream = new StringReader(value.toString());
3083
} else {
3084
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
3085
}
3086
3087
return charStream;
3088
}
3089
3090
/**
3091
* Retrieves the value stored in the designated column
3092
* of the current row as a <code>java.io.Reader</code> object.
3093
*
3094
* <P><B>Note:</B> All the data in the returned stream must
3095
* be read prior to getting the value of any other column. The
3096
* next call to a <code>getXXX</code> method implicitly closes the stream.
3097
*
3098
* @param columnName a <code>String</code> object giving the SQL name of
3099
* a column in this <code>CachedRowSetImpl</code> object
3100
* @return a Java input stream that delivers the database column value
3101
* as a stream of two-byte Unicode characters. If the value is
3102
* SQL <code>NULL</code>, the result is <code>null</code>.
3103
* @throws SQLException if (1) the given column name is not the name of
3104
* a column in this rowset, (2) the cursor is not on one of
3105
* this rowset's rows or its insert row, or (3) the designated
3106
* column does not store an SQL <code>CHAR, VARCHAR, <b>LONGVARCHAR</b>,
3107
* BINARY, VARYBINARY</code> or <code>LONGVARBINARY</code> value.
3108
* The bold SQL type designates the recommended return type.
3109
*/
3110
public java.io.Reader getCharacterStream(String columnName) throws SQLException {
3111
return getCharacterStream(getColIdxByName(columnName));
3112
}
3113
3114
/**
3115
* Retrieves the value of the designated column in the current row
3116
* of this <code>CachedRowSetImpl</code> object as a
3117
* <code>java.math.BigDecimal</code> object.
3118
*
3119
* @param columnIndex the first column is <code>1</code>, the second
3120
* is <code>2</code>, and so on; must be <code>1</code> or larger
3121
* and equal to or less than the number of columns in the rowset
3122
* @return a <code>java.math.BigDecimal</code> value with full precision;
3123
* if the value is SQL <code>NULL</code>, the result is <code>null</code>
3124
* @throws SQLException if (1) the given column index is out of bounds,
3125
* (2) the cursor is not on one of this rowset's rows or its
3126
* insert row, or (3) the designated column does not store an
3127
* SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
3128
* FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT, CHAR, VARCHAR</code>
3129
* or <code>LONGVARCHAR</code> value. The bold SQL type designates the
3130
* recommended return types that this method is used to retrieve.
3131
* @see #getBigDecimal(String)
3132
*/
3133
public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
3134
Object value;
3135
3136
// sanity check.
3137
checkIndex(columnIndex);
3138
// make sure the cursor is on a valid row
3139
checkCursor();
3140
3141
setLastValueNull(false);
3142
value = getCurrentRow().getColumnObject(columnIndex);
3143
3144
// check for SQL NULL
3145
if (value == null) {
3146
setLastValueNull(true);
3147
return null;
3148
}
3149
try {
3150
return (new BigDecimal(value.toString().trim()));
3151
} catch (NumberFormatException ex) {
3152
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.doublefail").toString(),
3153
new Object[] {value.toString().trim(), columnIndex}));
3154
}
3155
}
3156
3157
/**
3158
* Retrieves the value of the designated column in the current row
3159
* of this <code>CachedRowSetImpl</code> object as a
3160
* <code>java.math.BigDecimal</code> object.
3161
*
3162
* @param columnName a <code>String</code> object that must match the
3163
* SQL name of a column in this rowset, ignoring case
3164
* @return a <code>java.math.BigDecimal</code> value with full precision;
3165
* if the value is SQL <code>NULL</code>, the result is <code>null</code>
3166
* @throws SQLException if (1) the given column name is not the name of
3167
* a column in this rowset, (2) the cursor is not on one of
3168
* this rowset's rows or its insert row, or (3) the designated
3169
* column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
3170
* BIGINT, REAL, FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT CHAR,
3171
* VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
3172
* designates the recommended return type that this method is used to
3173
* retrieve
3174
* @see #getBigDecimal(int)
3175
*/
3176
public BigDecimal getBigDecimal(String columnName) throws SQLException {
3177
return getBigDecimal(getColIdxByName(columnName));
3178
}
3179
3180
//---------------------------------------------------------------------
3181
// Traversal/Positioning
3182
//---------------------------------------------------------------------
3183
3184
/**
3185
* Returns the number of rows in this <code>CachedRowSetImpl</code> object.
3186
*
3187
* @return number of rows in the rowset
3188
*/
3189
public int size() {
3190
return numRows;
3191
}
3192
3193
/**
3194
* Indicates whether the cursor is before the first row in this
3195
* <code>CachedRowSetImpl</code> object.
3196
*
3197
* @return <code>true</code> if the cursor is before the first row;
3198
* <code>false</code> otherwise or if the rowset contains no rows
3199
* @throws SQLException if an error occurs
3200
*/
3201
public boolean isBeforeFirst() throws SQLException {
3202
if (cursorPos == 0 && numRows > 0) {
3203
return true;
3204
} else {
3205
return false;
3206
}
3207
}
3208
3209
/**
3210
* Indicates whether the cursor is after the last row in this
3211
* <code>CachedRowSetImpl</code> object.
3212
*
3213
* @return <code>true</code> if the cursor is after the last row;
3214
* <code>false</code> otherwise or if the rowset contains no rows
3215
* @throws SQLException if an error occurs
3216
*/
3217
public boolean isAfterLast() throws SQLException {
3218
if (cursorPos == numRows+1 && numRows > 0) {
3219
return true;
3220
} else {
3221
return false;
3222
}
3223
}
3224
3225
/**
3226
* Indicates whether the cursor is on the first row in this
3227
* <code>CachedRowSetImpl</code> object.
3228
*
3229
* @return <code>true</code> if the cursor is on the first row;
3230
* <code>false</code> otherwise or if the rowset contains no rows
3231
* @throws SQLException if an error occurs
3232
*/
3233
public boolean isFirst() throws SQLException {
3234
// this becomes nasty because of deletes.
3235
int saveCursorPos = cursorPos;
3236
int saveAbsoluteCursorPos = absolutePos;
3237
internalFirst();
3238
if (cursorPos == saveCursorPos) {
3239
return true;
3240
} else {
3241
cursorPos = saveCursorPos;
3242
absolutePos = saveAbsoluteCursorPos;
3243
return false;
3244
}
3245
}
3246
3247
/**
3248
* Indicates whether the cursor is on the last row in this
3249
* <code>CachedRowSetImpl</code> object.
3250
* <P>
3251
* Note: Calling the method <code>isLast</code> may be expensive
3252
* because the JDBC driver might need to fetch ahead one row in order
3253
* to determine whether the current row is the last row in this rowset.
3254
*
3255
* @return <code>true</code> if the cursor is on the last row;
3256
* <code>false</code> otherwise or if this rowset contains no rows
3257
* @throws SQLException if an error occurs
3258
*/
3259
public boolean isLast() throws SQLException {
3260
int saveCursorPos = cursorPos;
3261
int saveAbsoluteCursorPos = absolutePos;
3262
boolean saveShowDeleted = getShowDeleted();
3263
setShowDeleted(true);
3264
internalLast();
3265
if (cursorPos == saveCursorPos) {
3266
setShowDeleted(saveShowDeleted);
3267
return true;
3268
} else {
3269
setShowDeleted(saveShowDeleted);
3270
cursorPos = saveCursorPos;
3271
absolutePos = saveAbsoluteCursorPos;
3272
return false;
3273
}
3274
}
3275
3276
/**
3277
* Moves this <code>CachedRowSetImpl</code> object's cursor to the front of
3278
* the rowset, just before the first row. This method has no effect if
3279
* this rowset contains no rows.
3280
*
3281
* @throws SQLException if an error occurs or the type of this rowset
3282
* is <code>ResultSet.TYPE_FORWARD_ONLY</code>
3283
*/
3284
public void beforeFirst() throws SQLException {
3285
if (getType() == ResultSet.TYPE_FORWARD_ONLY) {
3286
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.beforefirst").toString());
3287
}
3288
cursorPos = 0;
3289
absolutePos = 0;
3290
notifyCursorMoved();
3291
}
3292
3293
/**
3294
* Moves this <code>CachedRowSetImpl</code> object's cursor to the end of
3295
* the rowset, just after the last row. This method has no effect if
3296
* this rowset contains no rows.
3297
*
3298
* @throws SQLException if an error occurs
3299
*/
3300
public void afterLast() throws SQLException {
3301
if (numRows > 0) {
3302
cursorPos = numRows + 1;
3303
absolutePos = 0;
3304
notifyCursorMoved();
3305
}
3306
}
3307
3308
/**
3309
* Moves this <code>CachedRowSetImpl</code> object's cursor to the first row
3310
* and returns <code>true</code> if the operation was successful. This
3311
* method also notifies registered listeners that the cursor has moved.
3312
*
3313
* @return <code>true</code> if the cursor is on a valid row;
3314
* <code>false</code> otherwise or if there are no rows in this
3315
* <code>CachedRowSetImpl</code> object
3316
* @throws SQLException if the type of this rowset
3317
* is <code>ResultSet.TYPE_FORWARD_ONLY</code>
3318
*/
3319
public boolean first() throws SQLException {
3320
if(getType() == ResultSet.TYPE_FORWARD_ONLY) {
3321
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.first").toString());
3322
}
3323
3324
// move and notify
3325
boolean ret = this.internalFirst();
3326
notifyCursorMoved();
3327
3328
return ret;
3329
}
3330
3331
/**
3332
* Moves this <code>CachedRowSetImpl</code> object's cursor to the first
3333
* row and returns <code>true</code> if the operation is successful.
3334
* <P>
3335
* This method is called internally by the methods <code>first</code>,
3336
* <code>isFirst</code>, and <code>absolute</code>.
3337
* It in turn calls the method <code>internalNext</code> in order to
3338
* handle the case where the first row is a deleted row that is not visible.
3339
* <p>
3340
* This is a implementation only method and is not required as a standard
3341
* implementation of the <code>CachedRowSet</code> interface.
3342
*
3343
* @return <code>true</code> if the cursor moved to the first row;
3344
* <code>false</code> otherwise
3345
* @throws SQLException if an error occurs
3346
*/
3347
protected boolean internalFirst() throws SQLException {
3348
boolean ret = false;
3349
3350
if (numRows > 0) {
3351
cursorPos = 1;
3352
if ((getShowDeleted() == false) && (rowDeleted() == true)) {
3353
ret = internalNext();
3354
} else {
3355
ret = true;
3356
}
3357
}
3358
3359
if (ret == true)
3360
absolutePos = 1;
3361
else
3362
absolutePos = 0;
3363
3364
return ret;
3365
}
3366
3367
/**
3368
* Moves this <code>CachedRowSetImpl</code> object's cursor to the last row
3369
* and returns <code>true</code> if the operation was successful. This
3370
* method also notifies registered listeners that the cursor has moved.
3371
*
3372
* @return <code>true</code> if the cursor is on a valid row;
3373
* <code>false</code> otherwise or if there are no rows in this
3374
* <code>CachedRowSetImpl</code> object
3375
* @throws SQLException if the type of this rowset
3376
* is <code>ResultSet.TYPE_FORWARD_ONLY</code>
3377
*/
3378
public boolean last() throws SQLException {
3379
if (getType() == ResultSet.TYPE_FORWARD_ONLY) {
3380
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.last").toString());
3381
}
3382
3383
// move and notify
3384
boolean ret = this.internalLast();
3385
notifyCursorMoved();
3386
3387
return ret;
3388
}
3389
3390
/**
3391
* Moves this <code>CachedRowSetImpl</code> object's cursor to the last
3392
* row and returns <code>true</code> if the operation is successful.
3393
* <P>
3394
* This method is called internally by the method <code>last</code>
3395
* when rows have been deleted and the deletions are not visible.
3396
* The method <code>internalLast</code> handles the case where the
3397
* last row is a deleted row that is not visible by in turn calling
3398
* the method <code>internalPrevious</code>.
3399
* <p>
3400
* This is a implementation only method and is not required as a standard
3401
* implementation of the <code>CachedRowSet</code> interface.
3402
*
3403
* @return <code>true</code> if the cursor moved to the last row;
3404
* <code>false</code> otherwise
3405
* @throws SQLException if an error occurs
3406
*/
3407
protected boolean internalLast() throws SQLException {
3408
boolean ret = false;
3409
3410
if (numRows > 0) {
3411
cursorPos = numRows;
3412
if ((getShowDeleted() == false) && (rowDeleted() == true)) {
3413
ret = internalPrevious();
3414
} else {
3415
ret = true;
3416
}
3417
}
3418
if (ret == true)
3419
absolutePos = numRows - numDeleted;
3420
else
3421
absolutePos = 0;
3422
return ret;
3423
}
3424
3425
/**
3426
* Returns the number of the current row in this <code>CachedRowSetImpl</code>
3427
* object. The first row is number 1, the second number 2, and so on.
3428
*
3429
* @return the number of the current row; <code>0</code> if there is no
3430
* current row
3431
* @throws SQLException if an error occurs; or if the <code>CacheRowSetImpl</code>
3432
* is empty
3433
*/
3434
public int getRow() throws SQLException {
3435
// are we on a valid row? Valid rows are between first and last
3436
if (numRows > 0 &&
3437
cursorPos > 0 &&
3438
cursorPos < (numRows + 1) &&
3439
(getShowDeleted() == false && rowDeleted() == false)) {
3440
return absolutePos;
3441
} else if (getShowDeleted() == true) {
3442
return cursorPos;
3443
} else {
3444
return 0;
3445
}
3446
}
3447
3448
/**
3449
* Moves this <code>CachedRowSetImpl</code> object's cursor to the row number
3450
* specified.
3451
*
3452
* <p>If the number is positive, the cursor moves to an absolute row with
3453
* respect to the beginning of the rowset. The first row is row 1, the second
3454
* is row 2, and so on. For example, the following command, in which
3455
* <code>crs</code> is a <code>CachedRowSetImpl</code> object, moves the cursor
3456
* to the fourth row, starting from the beginning of the rowset.
3457
* <PRE><code>
3458
*
3459
* crs.absolute(4);
3460
*
3461
* </code> </PRE>
3462
* <P>
3463
* If the number is negative, the cursor moves to an absolute row position
3464
* with respect to the end of the rowset. For example, calling
3465
* <code>absolute(-1)</code> positions the cursor on the last row,
3466
* <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
3467
* If the <code>CachedRowSetImpl</code> object <code>crs</code> has five rows,
3468
* the following command moves the cursor to the fourth-to-last row, which
3469
* in the case of a rowset with five rows, is also the second row, counting
3470
* from the beginning.
3471
* <PRE><code>
3472
*
3473
* crs.absolute(-4);
3474
*
3475
* </code> </PRE>
3476
*
3477
* If the number specified is larger than the number of rows, the cursor
3478
* will move to the position after the last row. If the number specified
3479
* would move the cursor one or more rows before the first row, the cursor
3480
* moves to the position before the first row.
3481
* <P>
3482
* Note: Calling <code>absolute(1)</code> is the same as calling the
3483
* method <code>first()</code>. Calling <code>absolute(-1)</code> is the
3484
* same as calling <code>last()</code>.
3485
*
3486
* @param row a positive number to indicate the row, starting row numbering from
3487
* the first row, which is <code>1</code>; a negative number to indicate
3488
* the row, starting row numbering from the last row, which is
3489
* <code>-1</code>; it must not be <code>0</code>
3490
* @return <code>true</code> if the cursor is on the rowset; <code>false</code>
3491
* otherwise
3492
* @throws SQLException if the given cursor position is <code>0</code> or the
3493
* type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
3494
*/
3495
public boolean absolute( int row ) throws SQLException {
3496
if (row == 0 || getType() == ResultSet.TYPE_FORWARD_ONLY) {
3497
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.absolute").toString());
3498
}
3499
3500
if (row > 0) { // we are moving foward
3501
if (row > numRows) {
3502
// fell off the end
3503
afterLast();
3504
return false;
3505
} else {
3506
if (absolutePos <= 0)
3507
internalFirst();
3508
}
3509
} else { // we are moving backward
3510
if (cursorPos + row < 0) {
3511
// fell off the front
3512
beforeFirst();
3513
return false;
3514
} else {
3515
if (absolutePos >= 0)
3516
internalLast();
3517
}
3518
}
3519
3520
// Now move towards the absolute row that we're looking for
3521
while (absolutePos != row) {
3522
if (absolutePos < row) {
3523
if (!internalNext())
3524
break;
3525
}
3526
else {
3527
if (!internalPrevious())
3528
break;
3529
}
3530
}
3531
3532
notifyCursorMoved();
3533
3534
if (isAfterLast() || isBeforeFirst()) {
3535
return false;
3536
} else {
3537
return true;
3538
}
3539
}
3540
3541
/**
3542
* Moves the cursor the specified number of rows from the current
3543
* position, with a positive number moving it forward and a
3544
* negative number moving it backward.
3545
* <P>
3546
* If the number is positive, the cursor moves the specified number of
3547
* rows toward the end of the rowset, starting at the current row.
3548
* For example, the following command, in which
3549
* <code>crs</code> is a <code>CachedRowSetImpl</code> object with 100 rows,
3550
* moves the cursor forward four rows from the current row. If the
3551
* current row is 50, the cursor would move to row 54.
3552
* <PRE><code>
3553
*
3554
* crs.relative(4);
3555
*
3556
* </code> </PRE>
3557
* <P>
3558
* If the number is negative, the cursor moves back toward the beginning
3559
* the specified number of rows, starting at the current row.
3560
* For example, calling the method
3561
* <code>absolute(-1)</code> positions the cursor on the last row,
3562
* <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
3563
* If the <code>CachedRowSetImpl</code> object <code>crs</code> has five rows,
3564
* the following command moves the cursor to the fourth-to-last row, which
3565
* in the case of a rowset with five rows, is also the second row
3566
* from the beginning.
3567
* <PRE><code>
3568
*
3569
* crs.absolute(-4);
3570
*
3571
* </code> </PRE>
3572
*
3573
* If the number specified is larger than the number of rows, the cursor
3574
* will move to the position after the last row. If the number specified
3575
* would move the cursor one or more rows before the first row, the cursor
3576
* moves to the position before the first row. In both cases, this method
3577
* throws an <code>SQLException</code>.
3578
* <P>
3579
* Note: Calling <code>absolute(1)</code> is the same as calling the
3580
* method <code>first()</code>. Calling <code>absolute(-1)</code> is the
3581
* same as calling <code>last()</code>. Calling <code>relative(0)</code>
3582
* is valid, but it does not change the cursor position.
3583
*
3584
* @param rows an <code>int</code> indicating the number of rows to move
3585
* the cursor, starting at the current row; a positive number
3586
* moves the cursor forward; a negative number moves the cursor
3587
* backward; must not move the cursor past the valid
3588
* rows
3589
* @return <code>true</code> if the cursor is on a row in this
3590
* <code>CachedRowSetImpl</code> object; <code>false</code>
3591
* otherwise
3592
* @throws SQLException if there are no rows in this rowset, the cursor is
3593
* positioned either before the first row or after the last row, or
3594
* the rowset is type <code>ResultSet.TYPE_FORWARD_ONLY</code>
3595
*/
3596
public boolean relative(int rows) throws SQLException {
3597
if (numRows == 0 || isBeforeFirst() ||
3598
isAfterLast() || getType() == ResultSet.TYPE_FORWARD_ONLY) {
3599
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.relative").toString());
3600
}
3601
3602
if (rows == 0) {
3603
return true;
3604
}
3605
3606
if (rows > 0) { // we are moving forward
3607
if (cursorPos + rows > numRows) {
3608
// fell off the end
3609
afterLast();
3610
} else {
3611
for (int i=0; i < rows; i++) {
3612
if (!internalNext())
3613
break;
3614
}
3615
}
3616
} else { // we are moving backward
3617
if (cursorPos + rows < 0) {
3618
// fell off the front
3619
beforeFirst();
3620
} else {
3621
for (int i=rows; i < 0; i++) {
3622
if (!internalPrevious())
3623
break;
3624
}
3625
}
3626
}
3627
notifyCursorMoved();
3628
3629
if (isAfterLast() || isBeforeFirst()) {
3630
return false;
3631
} else {
3632
return true;
3633
}
3634
}
3635
3636
/**
3637
* Moves this <code>CachedRowSetImpl</code> object's cursor to the
3638
* previous row and returns <code>true</code> if the cursor is on
3639
* a valid row or <code>false</code> if it is not.
3640
* This method also notifies all listeners registered with this
3641
* <code>CachedRowSetImpl</code> object that its cursor has moved.
3642
* <P>
3643
* Note: calling the method <code>previous()</code> is not the same
3644
* as calling the method <code>relative(-1)</code>. This is true
3645
* because it is possible to call <code>previous()</code> from the insert
3646
* row, from after the last row, or from the current row, whereas
3647
* <code>relative</code> may only be called from the current row.
3648
* <P>
3649
* The method <code>previous</code> may used in a <code>while</code>
3650
* loop to iterate through a rowset starting after the last row
3651
* and moving toward the beginning. The loop ends when <code>previous</code>
3652
* returns <code>false</code>, meaning that there are no more rows.
3653
* For example, the following code fragment retrieves all the data in
3654
* the <code>CachedRowSetImpl</code> object <code>crs</code>, which has
3655
* three columns. Note that the cursor must initially be positioned
3656
* after the last row so that the first call to the method
3657
* <code>previous</code> places the cursor on the last line.
3658
* <PRE> <code>
3659
*
3660
* crs.afterLast();
3661
* while (previous()) {
3662
* String name = crs.getString(1);
3663
* int age = crs.getInt(2);
3664
* short ssn = crs.getShort(3);
3665
* System.out.println(name + " " + age + " " + ssn);
3666
* }
3667
*
3668
* </code> </PRE>
3669
* This method throws an <code>SQLException</code> if the cursor is not
3670
* on a row in the rowset, before the first row, or after the last row.
3671
*
3672
* @return <code>true</code> if the cursor is on a valid row;
3673
* <code>false</code> if it is before the first row or after the
3674
* last row
3675
* @throws SQLException if the cursor is not on a valid position or the
3676
* type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
3677
*/
3678
public boolean previous() throws SQLException {
3679
if (getType() == ResultSet.TYPE_FORWARD_ONLY) {
3680
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.last").toString());
3681
}
3682
/*
3683
* make sure things look sane. The cursor must be
3684
* positioned in the rowset or before first (0) or
3685
* after last (numRows + 1)
3686
*/
3687
if (cursorPos < 0 || cursorPos > numRows + 1) {
3688
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
3689
}
3690
// move and notify
3691
boolean ret = this.internalPrevious();
3692
notifyCursorMoved();
3693
3694
return ret;
3695
}
3696
3697
/**
3698
* Moves the cursor to the previous row in this <code>CachedRowSetImpl</code>
3699
* object, skipping past deleted rows that are not visible; returns
3700
* <code>true</code> if the cursor is on a row in this rowset and
3701
* <code>false</code> when the cursor goes before the first row.
3702
* <P>
3703
* This method is called internally by the method <code>previous</code>.
3704
* <P>
3705
* This is a implementation only method and is not required as a standard
3706
* implementation of the <code>CachedRowSet</code> interface.
3707
*
3708
* @return <code>true</code> if the cursor is on a row in this rowset;
3709
* <code>false</code> when the cursor reaches the position before
3710
* the first row
3711
* @throws SQLException if an error occurs
3712
*/
3713
protected boolean internalPrevious() throws SQLException {
3714
boolean ret = false;
3715
3716
do {
3717
if (cursorPos > 1) {
3718
--cursorPos;
3719
ret = true;
3720
} else if (cursorPos == 1) {
3721
// decrement to before first
3722
--cursorPos;
3723
ret = false;
3724
break;
3725
}
3726
} while ((getShowDeleted() == false) && (rowDeleted() == true));
3727
3728
/*
3729
* Each call to internalPrevious may move the cursor
3730
* over multiple rows, the absolute position moves one one row
3731
*/
3732
if (ret == true)
3733
--absolutePos;
3734
else
3735
absolutePos = 0;
3736
3737
return ret;
3738
}
3739
3740
3741
//---------------------------------------------------------------------
3742
// Updates
3743
//---------------------------------------------------------------------
3744
3745
/**
3746
* Indicates whether the current row of this <code>CachedRowSetImpl</code>
3747
* object has been updated. The value returned
3748
* depends on whether this rowset can detect updates: <code>false</code>
3749
* will always be returned if it does not detect updates.
3750
*
3751
* @return <code>true</code> if the row has been visibly updated
3752
* by the owner or another and updates are detected;
3753
* <code>false</code> otherwise
3754
* @throws SQLException if the cursor is on the insert row or not
3755
* not on a valid row
3756
*
3757
* @see DatabaseMetaData#updatesAreDetected
3758
*/
3759
public boolean rowUpdated() throws SQLException {
3760
// make sure the cursor is on a valid row
3761
checkCursor();
3762
if (onInsertRow == true) {
3763
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidop").toString());
3764
}
3765
return(((Row)getCurrentRow()).getUpdated());
3766
}
3767
3768
/**
3769
* Indicates whether the designated column of the current row of
3770
* this <code>CachedRowSetImpl</code> object has been updated. The
3771
* value returned depends on whether this rowset can detcted updates:
3772
* <code>false</code> will always be returned if it does not detect updates.
3773
*
3774
* @param idx the index identifier of the column that may be have been updated.
3775
* @return <code>true</code> is the designated column has been updated
3776
* and the rowset detects updates; <code>false</code> if the rowset has not
3777
* been updated or the rowset does not detect updates
3778
* @throws SQLException if the cursor is on the insert row or not
3779
* on a valid row
3780
* @see DatabaseMetaData#updatesAreDetected
3781
*/
3782
public boolean columnUpdated(int idx) throws SQLException {
3783
// make sure the cursor is on a valid row
3784
checkCursor();
3785
if (onInsertRow == true) {
3786
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidop").toString());
3787
}
3788
return (((Row)getCurrentRow()).getColUpdated(idx - 1));
3789
}
3790
3791
/**
3792
* Indicates whether the designated column of the current row of
3793
* this <code>CachedRowSetImpl</code> object has been updated. The
3794
* value returned depends on whether this rowset can detcted updates:
3795
* <code>false</code> will always be returned if it does not detect updates.
3796
*
3797
* @param columnName the <code>String</code> column name column that may be have
3798
* been updated.
3799
* @return <code>true</code> is the designated column has been updated
3800
* and the rowset detects updates; <code>false</code> if the rowset has not
3801
* been updated or the rowset does not detect updates
3802
* @throws SQLException if the cursor is on the insert row or not
3803
* on a valid row
3804
* @see DatabaseMetaData#updatesAreDetected
3805
*/
3806
public boolean columnUpdated(String columnName) throws SQLException {
3807
return columnUpdated(getColIdxByName(columnName));
3808
}
3809
3810
/**
3811
* Indicates whether the current row has been inserted. The value returned
3812
* depends on whether or not the rowset can detect visible inserts.
3813
*
3814
* @return <code>true</code> if a row has been inserted and inserts are detected;
3815
* <code>false</code> otherwise
3816
* @throws SQLException if the cursor is on the insert row or not
3817
* not on a valid row
3818
*
3819
* @see DatabaseMetaData#insertsAreDetected
3820
*/
3821
public boolean rowInserted() throws SQLException {
3822
// make sure the cursor is on a valid row
3823
checkCursor();
3824
if (onInsertRow == true) {
3825
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidop").toString());
3826
}
3827
return(((Row)getCurrentRow()).getInserted());
3828
}
3829
3830
/**
3831
* Indicates whether the current row has been deleted. A deleted row
3832
* may leave a visible "hole" in a rowset. This method can be used to
3833
* detect such holes if the rowset can detect deletions. This method
3834
* will always return <code>false</code> if this rowset cannot detect
3835
* deletions.
3836
*
3837
* @return <code>true</code> if (1)the current row is blank, indicating that
3838
* the row has been deleted, and (2)deletions are detected;
3839
* <code>false</code> otherwise
3840
* @throws SQLException if the cursor is on a valid row in this rowset
3841
* @see DatabaseMetaData#deletesAreDetected
3842
*/
3843
public boolean rowDeleted() throws SQLException {
3844
// make sure the cursor is on a valid row
3845
3846
if (isAfterLast() == true ||
3847
isBeforeFirst() == true ||
3848
onInsertRow == true) {
3849
3850
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
3851
}
3852
return(((Row)getCurrentRow()).getDeleted());
3853
}
3854
3855
/**
3856
* Indicates whether the given SQL data type is a numberic type.
3857
*
3858
* @param type one of the constants from <code>java.sql.Types</code>
3859
* @return <code>true</code> if the given type is <code>NUMERIC</code>,'
3860
* <code>DECIMAL</code>, <code>BIT</code>, <code>TINYINT</code>,
3861
* <code>SMALLINT</code>, <code>INTEGER</code>, <code>BIGINT</code>,
3862
* <code>REAL</code>, <code>DOUBLE</code>, or <code>FLOAT</code>;
3863
* <code>false</code> otherwise
3864
*/
3865
private boolean isNumeric(int type) {
3866
switch (type) {
3867
case java.sql.Types.NUMERIC:
3868
case java.sql.Types.DECIMAL:
3869
case java.sql.Types.BIT:
3870
case java.sql.Types.TINYINT:
3871
case java.sql.Types.SMALLINT:
3872
case java.sql.Types.INTEGER:
3873
case java.sql.Types.BIGINT:
3874
case java.sql.Types.REAL:
3875
case java.sql.Types.DOUBLE:
3876
case java.sql.Types.FLOAT:
3877
return true;
3878
default:
3879
return false;
3880
}
3881
}
3882
3883
/**
3884
* Indicates whether the given SQL data type is a string type.
3885
*
3886
* @param type one of the constants from <code>java.sql.Types</code>
3887
* @return <code>true</code> if the given type is <code>CHAR</code>,'
3888
* <code>VARCHAR</code>, or <code>LONGVARCHAR</code>;
3889
* <code>false</code> otherwise
3890
*/
3891
private boolean isString(int type) {
3892
switch (type) {
3893
case java.sql.Types.CHAR:
3894
case java.sql.Types.VARCHAR:
3895
case java.sql.Types.LONGVARCHAR:
3896
return true;
3897
default:
3898
return false;
3899
}
3900
}
3901
3902
/**
3903
* Indicates whether the given SQL data type is a binary type.
3904
*
3905
* @param type one of the constants from <code>java.sql.Types</code>
3906
* @return <code>true</code> if the given type is <code>BINARY</code>,'
3907
* <code>VARBINARY</code>, or <code>LONGVARBINARY</code>;
3908
* <code>false</code> otherwise
3909
*/
3910
private boolean isBinary(int type) {
3911
switch (type) {
3912
case java.sql.Types.BINARY:
3913
case java.sql.Types.VARBINARY:
3914
case java.sql.Types.LONGVARBINARY:
3915
return true;
3916
default:
3917
return false;
3918
}
3919
}
3920
3921
/**
3922
* Indicates whether the given SQL data type is a temporal type.
3923
* This method is called internally by the conversion methods
3924
* <code>convertNumeric</code> and <code>convertTemporal</code>.
3925
*
3926
* @param type one of the constants from <code>java.sql.Types</code>
3927
* @return <code>true</code> if the given type is <code>DATE</code>,
3928
* <code>TIME</code>, or <code>TIMESTAMP</code>;
3929
* <code>false</code> otherwise
3930
*/
3931
private boolean isTemporal(int type) {
3932
switch (type) {
3933
case java.sql.Types.DATE:
3934
case java.sql.Types.TIME:
3935
case java.sql.Types.TIMESTAMP:
3936
return true;
3937
default:
3938
return false;
3939
}
3940
}
3941
3942
/**
3943
* Indicates whether the given SQL data type is a boolean type.
3944
* This method is called internally by the conversion methods
3945
* <code>convertNumeric</code> and <code>convertBoolean</code>.
3946
*
3947
* @param type one of the constants from <code>java.sql.Types</code>
3948
* @return <code>true</code> if the given type is <code>BIT</code>,
3949
* , or <code>BOOLEAN</code>;
3950
* <code>false</code> otherwise
3951
*/
3952
private boolean isBoolean(int type) {
3953
switch (type) {
3954
case java.sql.Types.BIT:
3955
case java.sql.Types.BOOLEAN:
3956
return true;
3957
default:
3958
return false;
3959
}
3960
}
3961
3962
3963
/**
3964
* Converts the given <code>Object</code> in the Java programming language
3965
* to the standard mapping for the specified SQL target data type.
3966
* The conversion must be to a string or numeric type, but there are no
3967
* restrictions on the type to be converted. If the source type and target
3968
* type are the same, the given object is simply returned.
3969
*
3970
* @param srcObj the <code>Object</code> in the Java programming language
3971
* that is to be converted to the target type
3972
* @param srcType the data type that is the standard mapping in SQL of the
3973
* object to be converted; must be one of the constants in
3974
* <code>java.sql.Types</code>
3975
* @param trgType the SQL data type to which to convert the given object;
3976
* must be one of the following constants in
3977
* <code>java.sql.Types</code>: <code>NUMERIC</code>,
3978
* <code>DECIMAL</code>, <code>BIT</code>, <code>TINYINT</code>,
3979
* <code>SMALLINT</code>, <code>INTEGER</code>, <code>BIGINT</code>,
3980
* <code>REAL</code>, <code>DOUBLE</code>, <code>FLOAT</code>,
3981
* <code>VARCHAR</code>, <code>LONGVARCHAR</code>, or <code>CHAR</code>
3982
* @return an <code>Object</code> value.that is
3983
* the standard object mapping for the target SQL type
3984
* @throws SQLException if the given target type is not one of the string or
3985
* numeric types in <code>java.sql.Types</code>
3986
*/
3987
private Object convertNumeric(Object srcObj, int srcType,
3988
int trgType) throws SQLException {
3989
3990
if (srcType == trgType) {
3991
return srcObj;
3992
}
3993
3994
if (isNumeric(trgType) == false && isString(trgType) == false) {
3995
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString() + trgType);
3996
}
3997
3998
try {
3999
switch (trgType) {
4000
case java.sql.Types.BIT:
4001
Integer i = Integer.valueOf(srcObj.toString().trim());
4002
return i.equals(0) ?
4003
Boolean.valueOf(false) :
4004
Boolean.valueOf(true);
4005
case java.sql.Types.TINYINT:
4006
return Byte.valueOf(srcObj.toString().trim());
4007
case java.sql.Types.SMALLINT:
4008
return Short.valueOf(srcObj.toString().trim());
4009
case java.sql.Types.INTEGER:
4010
return Integer.valueOf(srcObj.toString().trim());
4011
case java.sql.Types.BIGINT:
4012
return Long.valueOf(srcObj.toString().trim());
4013
case java.sql.Types.NUMERIC:
4014
case java.sql.Types.DECIMAL:
4015
return new BigDecimal(srcObj.toString().trim());
4016
case java.sql.Types.REAL:
4017
case java.sql.Types.FLOAT:
4018
return new Float(srcObj.toString().trim());
4019
case java.sql.Types.DOUBLE:
4020
return new Double(srcObj.toString().trim());
4021
case java.sql.Types.CHAR:
4022
case java.sql.Types.VARCHAR:
4023
case java.sql.Types.LONGVARCHAR:
4024
return srcObj.toString();
4025
default:
4026
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()+ trgType);
4027
}
4028
} catch (NumberFormatException ex) {
4029
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString() + trgType);
4030
}
4031
}
4032
4033
/**
4034
* Converts the given <code>Object</code> in the Java programming language
4035
* to the standard object mapping for the specified SQL target data type.
4036
* The conversion must be to a string or temporal type, and there are also
4037
* restrictions on the type to be converted.
4038
* <P>
4039
* <TABLE ALIGN="CENTER" BORDER CELLPADDING=10 BORDERCOLOR="#0000FF"
4040
* <CAPTION ALIGN="CENTER"><B>Parameters and Return Values</B></CAPTION>
4041
* <TR>
4042
* <TD><B>Source SQL Type</B>
4043
* <TD><B>Target SQL Type</B>
4044
* <TD><B>Object Returned</B>
4045
* </TR>
4046
* <TR>
4047
* <TD><code>TIMESTAMP</code>
4048
* <TD><code>DATE</code>
4049
* <TD><code>java.sql.Date</code>
4050
* </TR>
4051
* <TR>
4052
* <TD><code>TIMESTAMP</code>
4053
* <TD><code>TIME</code>
4054
* <TD><code>java.sql.Time</code>
4055
* </TR>
4056
* <TR>
4057
* <TD><code>TIME</code>
4058
* <TD><code>TIMESTAMP</code>
4059
* <TD><code>java.sql.Timestamp</code>
4060
* </TR>
4061
* <TR>
4062
* <TD><code>DATE</code>, <code>TIME</code>, or <code>TIMESTAMP</code>
4063
* <TD><code>CHAR</code>, <code>VARCHAR</code>, or <code>LONGVARCHAR</code>
4064
* <TD><code>java.lang.String</code>
4065
* </TR>
4066
* </TABLE>
4067
* <P>
4068
* If the source type and target type are the same,
4069
* the given object is simply returned.
4070
*
4071
* @param srcObj the <code>Object</code> in the Java programming language
4072
* that is to be converted to the target type
4073
* @param srcType the data type that is the standard mapping in SQL of the
4074
* object to be converted; must be one of the constants in
4075
* <code>java.sql.Types</code>
4076
* @param trgType the SQL data type to which to convert the given object;
4077
* must be one of the following constants in
4078
* <code>java.sql.Types</code>: <code>DATE</code>,
4079
* <code>TIME</code>, <code>TIMESTAMP</code>, <code>CHAR</code>,
4080
* <code>VARCHAR</code>, or <code>LONGVARCHAR</code>
4081
* @return an <code>Object</code> value.that is
4082
* the standard object mapping for the target SQL type
4083
* @throws SQLException if the given target type is not one of the string or
4084
* temporal types in <code>java.sql.Types</code>
4085
*/
4086
private Object convertTemporal(Object srcObj,
4087
int srcType, int trgType) throws SQLException {
4088
4089
if (srcType == trgType) {
4090
return srcObj;
4091
}
4092
4093
if (isNumeric(trgType) == true ||
4094
(isString(trgType) == false && isTemporal(trgType) == false)) {
4095
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4096
}
4097
4098
try {
4099
switch (trgType) {
4100
case java.sql.Types.DATE:
4101
if (srcType == java.sql.Types.TIMESTAMP) {
4102
return new java.sql.Date(((java.sql.Timestamp)srcObj).getTime());
4103
} else {
4104
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4105
}
4106
case java.sql.Types.TIMESTAMP:
4107
if (srcType == java.sql.Types.TIME) {
4108
return new Timestamp(((java.sql.Time)srcObj).getTime());
4109
} else {
4110
return new Timestamp(((java.sql.Date)srcObj).getTime());
4111
}
4112
case java.sql.Types.TIME:
4113
if (srcType == java.sql.Types.TIMESTAMP) {
4114
return new Time(((java.sql.Timestamp)srcObj).getTime());
4115
} else {
4116
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4117
}
4118
case java.sql.Types.CHAR:
4119
case java.sql.Types.VARCHAR:
4120
case java.sql.Types.LONGVARCHAR:
4121
return srcObj.toString();
4122
default:
4123
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4124
}
4125
} catch (NumberFormatException ex) {
4126
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4127
}
4128
4129
}
4130
4131
/**
4132
* Converts the given <code>Object</code> in the Java programming language
4133
* to the standard mapping for the specified SQL target data type.
4134
* The conversion must be to a string or numeric type, but there are no
4135
* restrictions on the type to be converted. If the source type and target
4136
* type are the same, the given object is simply returned.
4137
*
4138
* @param srcObj the <code>Object</code> in the Java programming language
4139
* that is to be converted to the target type
4140
* @param srcType the data type that is the standard mapping in SQL of the
4141
* object to be converted; must be one of the constants in
4142
* <code>java.sql.Types</code>
4143
* @param trgType the SQL data type to which to convert the given object;
4144
* must be one of the following constants in
4145
* <code>java.sql.Types</code>: <code>BIT</code>,
4146
* or <code>BOOLEAN</code>
4147
* @return an <code>Object</code> value.that is
4148
* the standard object mapping for the target SQL type
4149
* @throws SQLException if the given target type is not one of the Boolean
4150
* types in <code>java.sql.Types</code>
4151
*/
4152
private Object convertBoolean(Object srcObj, int srcType,
4153
int trgType) throws SQLException {
4154
4155
if (srcType == trgType) {
4156
return srcObj;
4157
}
4158
4159
if (isNumeric(trgType) == true ||
4160
(isString(trgType) == false && isBoolean(trgType) == false)) {
4161
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4162
}
4163
4164
4165
try {
4166
switch (trgType) {
4167
case java.sql.Types.BIT:
4168
Integer i = Integer.valueOf(srcObj.toString().trim());
4169
return i.equals(0) ?
4170
Boolean.valueOf(false) :
4171
Boolean.valueOf(true);
4172
case java.sql.Types.BOOLEAN:
4173
return Boolean.valueOf(srcObj.toString().trim());
4174
default:
4175
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()+ trgType);
4176
}
4177
} catch (NumberFormatException ex) {
4178
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString() + trgType);
4179
}
4180
}
4181
4182
/**
4183
* Sets the designated nullable column in the current row or the
4184
* insert row of this <code>CachedRowSetImpl</code> object with
4185
* <code>null</code> value.
4186
* <P>
4187
* This method updates a column value in the current row or the insert
4188
* row of this rowset; however, another method must be called to complete
4189
* the update process. If the cursor is on a row in the rowset, the
4190
* method {@link #updateRow} must be called to mark the row as updated
4191
* and to notify listeners that the row has changed.
4192
* If the cursor is on the insert row, the method {@link #insertRow}
4193
* must be called to insert the new row into this rowset and to notify
4194
* listeners that a row has changed.
4195
* <P>
4196
* In order to propagate updates in this rowset to the underlying
4197
* data source, an application must call the method {@link #acceptChanges}
4198
* after it calls either <code>updateRow</code> or <code>insertRow</code>.
4199
*
4200
* @param columnIndex the first column is <code>1</code>, the second
4201
* is <code>2</code>, and so on; must be <code>1</code> or larger
4202
* and equal to or less than the number of columns in this rowset
4203
* @throws SQLException if (1) the given column index is out of bounds,
4204
* (2) the cursor is not on one of this rowset's rows or its
4205
* insert row, or (3) this rowset is
4206
* <code>ResultSet.CONCUR_READ_ONLY</code>
4207
*/
4208
public void updateNull(int columnIndex) throws SQLException {
4209
// sanity check.
4210
checkIndex(columnIndex);
4211
// make sure the cursor is on a valid row
4212
checkCursor();
4213
4214
BaseRow row = getCurrentRow();
4215
row.setColumnObject(columnIndex, null);
4216
4217
}
4218
4219
/**
4220
* Sets the designated column in either the current row or the insert
4221
* row of this <code>CachedRowSetImpl</code> object with the given
4222
* <code>boolean</code> value.
4223
* <P>
4224
* This method updates a column value in the current row or the insert
4225
* row of this rowset, but it does not update the database.
4226
* If the cursor is on a row in the rowset, the
4227
* method {@link #updateRow} must be called to update the database.
4228
* If the cursor is on the insert row, the method {@link #insertRow}
4229
* must be called, which will insert the new row into both this rowset
4230
* and the database. Both of these methods must be called before the
4231
* cursor moves to another row.
4232
*
4233
* @param columnIndex the first column is <code>1</code>, the second
4234
* is <code>2</code>, and so on; must be <code>1</code> or larger
4235
* and equal to or less than the number of columns in this rowset
4236
* @param x the new column value
4237
* @throws SQLException if (1) the given column index is out of bounds,
4238
* (2) the cursor is not on one of this rowset's rows or its
4239
* insert row, or (3) this rowset is
4240
* <code>ResultSet.CONCUR_READ_ONLY</code>
4241
*/
4242
public void updateBoolean(int columnIndex, boolean x) throws SQLException {
4243
// sanity check.
4244
checkIndex(columnIndex);
4245
// make sure the cursor is on a valid row
4246
checkCursor();
4247
Object obj = convertBoolean(Boolean.valueOf(x),
4248
java.sql.Types.BIT,
4249
RowSetMD.getColumnType(columnIndex));
4250
4251
getCurrentRow().setColumnObject(columnIndex, obj);
4252
}
4253
4254
/**
4255
* Sets the designated column in either the current row or the insert
4256
* row of this <code>CachedRowSetImpl</code> object with the given
4257
* <code>byte</code> value.
4258
* <P>
4259
* This method updates a column value in the current row or the insert
4260
* row of this rowset, but it does not update the database.
4261
* If the cursor is on a row in the rowset, the
4262
* method {@link #updateRow} must be called to update the database.
4263
* If the cursor is on the insert row, the method {@link #insertRow}
4264
* must be called, which will insert the new row into both this rowset
4265
* and the database. Both of these methods must be called before the
4266
* cursor moves to another row.
4267
*
4268
* @param columnIndex the first column is <code>1</code>, the second
4269
* is <code>2</code>, and so on; must be <code>1</code> or larger
4270
* and equal to or less than the number of columns in this rowset
4271
* @param x the new column value
4272
* @throws SQLException if (1) the given column index is out of bounds,
4273
* (2) the cursor is not on one of this rowset's rows or its
4274
* insert row, or (3) this rowset is
4275
* <code>ResultSet.CONCUR_READ_ONLY</code>
4276
*/
4277
public void updateByte(int columnIndex, byte x) throws SQLException {
4278
// sanity check.
4279
checkIndex(columnIndex);
4280
// make sure the cursor is on a valid row
4281
checkCursor();
4282
4283
Object obj = convertNumeric(Byte.valueOf(x),
4284
java.sql.Types.TINYINT,
4285
RowSetMD.getColumnType(columnIndex));
4286
4287
getCurrentRow().setColumnObject(columnIndex, obj);
4288
}
4289
4290
/**
4291
* Sets the designated column in either the current row or the insert
4292
* row of this <code>CachedRowSetImpl</code> object with the given
4293
* <code>short</code> value.
4294
* <P>
4295
* This method updates a column value in the current row or the insert
4296
* row of this rowset, but it does not update the database.
4297
* If the cursor is on a row in the rowset, the
4298
* method {@link #updateRow} must be called to update the database.
4299
* If the cursor is on the insert row, the method {@link #insertRow}
4300
* must be called, which will insert the new row into both this rowset
4301
* and the database. Both of these methods must be called before the
4302
* cursor moves to another row.
4303
*
4304
* @param columnIndex the first column is <code>1</code>, the second
4305
* is <code>2</code>, and so on; must be <code>1</code> or larger
4306
* and equal to or less than the number of columns in this rowset
4307
* @param x the new column value
4308
* @throws SQLException if (1) the given column index is out of bounds,
4309
* (2) the cursor is not on one of this rowset's rows or its
4310
* insert row, or (3) this rowset is
4311
* <code>ResultSet.CONCUR_READ_ONLY</code>
4312
*/
4313
public void updateShort(int columnIndex, short x) throws SQLException {
4314
// sanity check.
4315
checkIndex(columnIndex);
4316
// make sure the cursor is on a valid row
4317
checkCursor();
4318
4319
Object obj = convertNumeric(Short.valueOf(x),
4320
java.sql.Types.SMALLINT,
4321
RowSetMD.getColumnType(columnIndex));
4322
4323
getCurrentRow().setColumnObject(columnIndex, obj);
4324
}
4325
4326
/**
4327
* Sets the designated column in either the current row or the insert
4328
* row of this <code>CachedRowSetImpl</code> object with the given
4329
* <code>int</code> value.
4330
* <P>
4331
* This method updates a column value in the current row or the insert
4332
* row of this rowset, but it does not update the database.
4333
* If the cursor is on a row in the rowset, the
4334
* method {@link #updateRow} must be called to update the database.
4335
* If the cursor is on the insert row, the method {@link #insertRow}
4336
* must be called, which will insert the new row into both this rowset
4337
* and the database. Both of these methods must be called before the
4338
* cursor moves to another row.
4339
*
4340
* @param columnIndex the first column is <code>1</code>, the second
4341
* is <code>2</code>, and so on; must be <code>1</code> or larger
4342
* and equal to or less than the number of columns in this rowset
4343
* @param x the new column value
4344
* @throws SQLException if (1) the given column index is out of bounds,
4345
* (2) the cursor is not on one of this rowset's rows or its
4346
* insert row, or (3) this rowset is
4347
* <code>ResultSet.CONCUR_READ_ONLY</code>
4348
*/
4349
public void updateInt(int columnIndex, int x) throws SQLException {
4350
// sanity check.
4351
checkIndex(columnIndex);
4352
// make sure the cursor is on a valid row
4353
checkCursor();
4354
Object obj = convertNumeric(x,
4355
java.sql.Types.INTEGER,
4356
RowSetMD.getColumnType(columnIndex));
4357
4358
getCurrentRow().setColumnObject(columnIndex, obj);
4359
}
4360
4361
/**
4362
* Sets the designated column in either the current row or the insert
4363
* row of this <code>CachedRowSetImpl</code> object with the given
4364
* <code>long</code> value.
4365
* <P>
4366
* This method updates a column value in the current row or the insert
4367
* row of this rowset, but it does not update the database.
4368
* If the cursor is on a row in the rowset, the
4369
* method {@link #updateRow} must be called to update the database.
4370
* If the cursor is on the insert row, the method {@link #insertRow}
4371
* must be called, which will insert the new row into both this rowset
4372
* and the database. Both of these methods must be called before the
4373
* cursor moves to another row.
4374
*
4375
* @param columnIndex the first column is <code>1</code>, the second
4376
* is <code>2</code>, and so on; must be <code>1</code> or larger
4377
* and equal to or less than the number of columns in this rowset
4378
* @param x the new column value
4379
* @throws SQLException if (1) the given column index is out of bounds,
4380
* (2) the cursor is not on one of this rowset's rows or its
4381
* insert row, or (3) this rowset is
4382
* <code>ResultSet.CONCUR_READ_ONLY</code>
4383
*/
4384
public void updateLong(int columnIndex, long x) throws SQLException {
4385
// sanity check.
4386
checkIndex(columnIndex);
4387
// make sure the cursor is on a valid row
4388
checkCursor();
4389
4390
Object obj = convertNumeric(Long.valueOf(x),
4391
java.sql.Types.BIGINT,
4392
RowSetMD.getColumnType(columnIndex));
4393
4394
getCurrentRow().setColumnObject(columnIndex, obj);
4395
4396
}
4397
4398
/**
4399
* Sets the designated column in either the current row or the insert
4400
* row of this <code>CachedRowSetImpl</code> object with the given
4401
* <code>float</code> value.
4402
* <P>
4403
* This method updates a column value in the current row or the insert
4404
* row of this rowset, but it does not update the database.
4405
* If the cursor is on a row in the rowset, the
4406
* method {@link #updateRow} must be called to update the database.
4407
* If the cursor is on the insert row, the method {@link #insertRow}
4408
* must be called, which will insert the new row into both this rowset
4409
* and the database. Both of these methods must be called before the
4410
* cursor moves to another row.
4411
*
4412
* @param columnIndex the first column is <code>1</code>, the second
4413
* is <code>2</code>, and so on; must be <code>1</code> or larger
4414
* and equal to or less than the number of columns in this rowset
4415
* @param x the new column value
4416
* @throws SQLException if (1) the given column index is out of bounds,
4417
* (2) the cursor is not on one of this rowset's rows or its
4418
* insert row, or (3) this rowset is
4419
* <code>ResultSet.CONCUR_READ_ONLY</code>
4420
*/
4421
public void updateFloat(int columnIndex, float x) throws SQLException {
4422
// sanity check.
4423
checkIndex(columnIndex);
4424
// make sure the cursor is on a valid row
4425
checkCursor();
4426
4427
Object obj = convertNumeric(Float.valueOf(x),
4428
java.sql.Types.REAL,
4429
RowSetMD.getColumnType(columnIndex));
4430
4431
getCurrentRow().setColumnObject(columnIndex, obj);
4432
}
4433
4434
/**
4435
* Sets the designated column in either the current row or the insert
4436
* row of this <code>CachedRowSetImpl</code> object with the given
4437
* <code>double</code> value.
4438
*
4439
* This method updates a column value in either the current row or
4440
* the insert row of this rowset, but it does not update the
4441
* database. If the cursor is on a row in the rowset, the
4442
* method {@link #updateRow} must be called to update the database.
4443
* If the cursor is on the insert row, the method {@link #insertRow}
4444
* must be called, which will insert the new row into both this rowset
4445
* and the database. Both of these methods must be called before the
4446
* cursor moves to another row.
4447
*
4448
* @param columnIndex the first column is <code>1</code>, the second
4449
* is <code>2</code>, and so on; must be <code>1</code> or larger
4450
* and equal to or less than the number of columns in this rowset
4451
* @param x the new column value
4452
* @throws SQLException if (1) the given column index is out of bounds,
4453
* (2) the cursor is not on one of this rowset's rows or its
4454
* insert row, or (3) this rowset is
4455
* <code>ResultSet.CONCUR_READ_ONLY</code>
4456
*/
4457
public void updateDouble(int columnIndex, double x) throws SQLException {
4458
// sanity check.
4459
checkIndex(columnIndex);
4460
// make sure the cursor is on a valid row
4461
checkCursor();
4462
Object obj = convertNumeric(Double.valueOf(x),
4463
java.sql.Types.DOUBLE,
4464
RowSetMD.getColumnType(columnIndex));
4465
4466
getCurrentRow().setColumnObject(columnIndex, obj);
4467
}
4468
4469
/**
4470
* Sets the designated column in either the current row or the insert
4471
* row of this <code>CachedRowSetImpl</code> object with the given
4472
* <code>java.math.BigDecimal</code> object.
4473
* <P>
4474
* This method updates a column value in the current row or the insert
4475
* row of this rowset, but it does not update the database.
4476
* If the cursor is on a row in the rowset, the
4477
* method {@link #updateRow} must be called to update the database.
4478
* If the cursor is on the insert row, the method {@link #insertRow}
4479
* must be called, which will insert the new row into both this rowset
4480
* and the database. Both of these methods must be called before the
4481
* cursor moves to another row.
4482
*
4483
* @param columnIndex the first column is <code>1</code>, the second
4484
* is <code>2</code>, and so on; must be <code>1</code> or larger
4485
* and equal to or less than the number of columns in this rowset
4486
* @param x the new column value
4487
* @throws SQLException if (1) the given column index is out of bounds,
4488
* (2) the cursor is not on one of this rowset's rows or its
4489
* insert row, or (3) this rowset is
4490
* <code>ResultSet.CONCUR_READ_ONLY</code>
4491
*/
4492
public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
4493
// sanity check.
4494
checkIndex(columnIndex);
4495
// make sure the cursor is on a valid row
4496
checkCursor();
4497
4498
Object obj = convertNumeric(x,
4499
java.sql.Types.NUMERIC,
4500
RowSetMD.getColumnType(columnIndex));
4501
4502
getCurrentRow().setColumnObject(columnIndex, obj);
4503
}
4504
4505
/**
4506
* Sets the designated column in either the current row or the insert
4507
* row of this <code>CachedRowSetImpl</code> object with the given
4508
* <code>String</code> object.
4509
* <P>
4510
* This method updates a column value in either the current row or
4511
* the insert row of this rowset, but it does not update the
4512
* database. If the cursor is on a row in the rowset, the
4513
* method {@link #updateRow} must be called to mark the row as updated.
4514
* If the cursor is on the insert row, the method {@link #insertRow}
4515
* must be called to insert the new row into this rowset and mark it
4516
* as inserted. Both of these methods must be called before the
4517
* cursor moves to another row.
4518
* <P>
4519
* The method <code>acceptChanges</code> must be called if the
4520
* updated values are to be written back to the underlying database.
4521
*
4522
* @param columnIndex the first column is <code>1</code>, the second
4523
* is <code>2</code>, and so on; must be <code>1</code> or larger
4524
* and equal to or less than the number of columns in this rowset
4525
* @param x the new column value
4526
* @throws SQLException if (1) the given column index is out of bounds,
4527
* (2) the cursor is not on one of this rowset's rows or its
4528
* insert row, or (3) this rowset is
4529
* <code>ResultSet.CONCUR_READ_ONLY</code>
4530
*/
4531
public void updateString(int columnIndex, String x) throws SQLException {
4532
// sanity check.
4533
checkIndex(columnIndex);
4534
// make sure the cursor is on a valid row
4535
checkCursor();
4536
4537
getCurrentRow().setColumnObject(columnIndex, x);
4538
}
4539
4540
/**
4541
* Sets the designated column in either the current row or the insert
4542
* row of this <code>CachedRowSetImpl</code> object with the given
4543
* <code>byte</code> array.
4544
*
4545
* This method updates a column value in either the current row or
4546
* the insert row of this rowset, but it does not update the
4547
* database. If the cursor is on a row in the rowset, the
4548
* method {@link #updateRow} must be called to update the database.
4549
* If the cursor is on the insert row, the method {@link #insertRow}
4550
* must be called, which will insert the new row into both this rowset
4551
* and the database. Both of these methods must be called before the
4552
* cursor moves to another row.
4553
*
4554
* @param columnIndex the first column is <code>1</code>, the second
4555
* is <code>2</code>, and so on; must be <code>1</code> or larger
4556
* and equal to or less than the number of columns in this rowset
4557
* @param x the new column value
4558
* @throws SQLException if (1) the given column index is out of bounds,
4559
* (2) the cursor is not on one of this rowset's rows or its
4560
* insert row, or (3) this rowset is
4561
* <code>ResultSet.CONCUR_READ_ONLY</code>
4562
*/
4563
public void updateBytes(int columnIndex, byte x[]) throws SQLException {
4564
// sanity check.
4565
checkIndex(columnIndex);
4566
// make sure the cursor is on a valid row
4567
checkCursor();
4568
4569
if (isBinary(RowSetMD.getColumnType(columnIndex)) == false) {
4570
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4571
}
4572
4573
getCurrentRow().setColumnObject(columnIndex, x);
4574
}
4575
4576
/**
4577
* Sets the designated column in either the current row or the insert
4578
* row of this <code>CachedRowSetImpl</code> object with the given
4579
* <code>Date</code> object.
4580
*
4581
* This method updates a column value in either the current row or
4582
* the insert row of this rowset, but it does not update the
4583
* database. If the cursor is on a row in the rowset, the
4584
* method {@link #updateRow} must be called to update the database.
4585
* If the cursor is on the insert row, the method {@link #insertRow}
4586
* must be called, which will insert the new row into both this rowset
4587
* and the database. Both of these methods must be called before the
4588
* cursor moves to another row.
4589
*
4590
* @param columnIndex the first column is <code>1</code>, the second
4591
* is <code>2</code>, and so on; must be <code>1</code> or larger
4592
* and equal to or less than the number of columns in this rowset
4593
* @param x the new column value
4594
* @throws SQLException if (1) the given column index is out of bounds,
4595
* (2) the cursor is not on one of this rowset's rows or its
4596
* insert row, (3) the type of the designated column is not
4597
* an SQL <code>DATE</code> or <code>TIMESTAMP</code>, or
4598
* (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4599
*/
4600
public void updateDate(int columnIndex, java.sql.Date x) throws SQLException {
4601
// sanity check.
4602
checkIndex(columnIndex);
4603
// make sure the cursor is on a valid row
4604
checkCursor();
4605
4606
Object obj = convertTemporal(x,
4607
java.sql.Types.DATE,
4608
RowSetMD.getColumnType(columnIndex));
4609
4610
getCurrentRow().setColumnObject(columnIndex, obj);
4611
}
4612
4613
/**
4614
* Sets the designated column in either the current row or the insert
4615
* row of this <code>CachedRowSetImpl</code> object with the given
4616
* <code>Time</code> object.
4617
*
4618
* This method updates a column value in either the current row or
4619
* the insert row of this rowset, but it does not update the
4620
* database. If the cursor is on a row in the rowset, the
4621
* method {@link #updateRow} must be called to update the database.
4622
* If the cursor is on the insert row, the method {@link #insertRow}
4623
* must be called, which will insert the new row into both this rowset
4624
* and the database. Both of these methods must be called before the
4625
* cursor moves to another row.
4626
*
4627
* @param columnIndex the first column is <code>1</code>, the second
4628
* is <code>2</code>, and so on; must be <code>1</code> or larger
4629
* and equal to or less than the number of columns in this rowset
4630
* @param x the new column value
4631
* @throws SQLException if (1) the given column index is out of bounds,
4632
* (2) the cursor is not on one of this rowset's rows or its
4633
* insert row, (3) the type of the designated column is not
4634
* an SQL <code>TIME</code> or <code>TIMESTAMP</code>, or
4635
* (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4636
*/
4637
public void updateTime(int columnIndex, java.sql.Time x) throws SQLException {
4638
// sanity check.
4639
checkIndex(columnIndex);
4640
// make sure the cursor is on a valid row
4641
checkCursor();
4642
4643
Object obj = convertTemporal(x,
4644
java.sql.Types.TIME,
4645
RowSetMD.getColumnType(columnIndex));
4646
4647
getCurrentRow().setColumnObject(columnIndex, obj);
4648
}
4649
4650
/**
4651
* Sets the designated column in either the current row or the insert
4652
* row of this <code>CachedRowSetImpl</code> object with the given
4653
* <code>Timestamp</code> object.
4654
*
4655
* This method updates a column value in either the current row or
4656
* the insert row of this rowset, but it does not update the
4657
* database. If the cursor is on a row in the rowset, the
4658
* method {@link #updateRow} must be called to update the database.
4659
* If the cursor is on the insert row, the method {@link #insertRow}
4660
* must be called, which will insert the new row into both this rowset
4661
* and the database. Both of these methods must be called before the
4662
* cursor moves to another row.
4663
*
4664
* @param columnIndex the first column is <code>1</code>, the second
4665
* is <code>2</code>, and so on; must be <code>1</code> or larger
4666
* and equal to or less than the number of columns in this rowset
4667
* @param x the new column value
4668
* @throws SQLException if (1) the given column index is out of bounds,
4669
* (2) the cursor is not on one of this rowset's rows or its
4670
* insert row, (3) the type of the designated column is not
4671
* an SQL <code>DATE</code>, <code>TIME</code>, or
4672
* <code>TIMESTAMP</code>, or (4) this rowset is
4673
* <code>ResultSet.CONCUR_READ_ONLY</code>
4674
*/
4675
public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException {
4676
// sanity check.
4677
checkIndex(columnIndex);
4678
// make sure the cursor is on a valid row
4679
checkCursor();
4680
4681
Object obj = convertTemporal(x,
4682
java.sql.Types.TIMESTAMP,
4683
RowSetMD.getColumnType(columnIndex));
4684
4685
getCurrentRow().setColumnObject(columnIndex, obj);
4686
}
4687
4688
/**
4689
* Sets the designated column in either the current row or the insert
4690
* row of this <code>CachedRowSetImpl</code> object with the given
4691
* ASCII stream value.
4692
* <P>
4693
* This method updates a column value in either the current row or
4694
* the insert row of this rowset, but it does not update the
4695
* database. If the cursor is on a row in the rowset, the
4696
* method {@link #updateRow} must be called to update the database.
4697
* If the cursor is on the insert row, the method {@link #insertRow}
4698
* must be called, which will insert the new row into both this rowset
4699
* and the database. Both of these methods must be called before the
4700
* cursor moves to another row.
4701
*
4702
* @param columnIndex the first column is <code>1</code>, the second
4703
* is <code>2</code>, and so on; must be <code>1</code> or larger
4704
* and equal to or less than the number of columns in this rowset
4705
* @param x the new column value
4706
* @param length the number of one-byte ASCII characters in the stream
4707
* @throws SQLException if this method is invoked
4708
*/
4709
public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException {
4710
// sanity Check
4711
checkIndex(columnIndex);
4712
// make sure the cursor is on a valid row
4713
checkCursor();
4714
4715
4716
if (isString(RowSetMD.getColumnType(columnIndex)) == false &&
4717
isBinary(RowSetMD.getColumnType(columnIndex)) == false) {
4718
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4719
}
4720
4721
byte buf[] = new byte[length];
4722
try {
4723
int charsRead = 0;
4724
do {
4725
charsRead += x.read(buf, charsRead, length - charsRead);
4726
} while (charsRead != length);
4727
//Changed the condition check to check for length instead of -1
4728
} catch (java.io.IOException ex) {
4729
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.asciistream").toString());
4730
}
4731
String str = new String(buf);
4732
4733
getCurrentRow().setColumnObject(columnIndex, str);
4734
4735
}
4736
4737
/**
4738
* Sets the designated column in either the current row or the insert
4739
* row of this <code>CachedRowSetImpl</code> object with the given
4740
* <code>java.io.InputStream</code> object.
4741
* <P>
4742
* This method updates a column value in either the current row or
4743
* the insert row of this rowset, but it does not update the
4744
* database. If the cursor is on a row in the rowset, the
4745
* method {@link #updateRow} must be called to update the database.
4746
* If the cursor is on the insert row, the method {@link #insertRow}
4747
* must be called, which will insert the new row into both this rowset
4748
* and the database. Both of these methods must be called before the
4749
* cursor moves to another row.
4750
*
4751
* @param columnIndex the first column is <code>1</code>, the second
4752
* is <code>2</code>, and so on; must be <code>1</code> or larger
4753
* and equal to or less than the number of columns in this rowset
4754
* @param x the new column value; must be a <code>java.io.InputStream</code>
4755
* containing <code>BINARY</code>, <code>VARBINARY</code>, or
4756
* <code>LONGVARBINARY</code> data
4757
* @param length the length of the stream in bytes
4758
* @throws SQLException if (1) the given column index is out of bounds,
4759
* (2) the cursor is not on one of this rowset's rows or its
4760
* insert row, (3) the data in the stream is not binary, or
4761
* (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4762
*/
4763
public void updateBinaryStream(int columnIndex, java.io.InputStream x,int length) throws SQLException {
4764
// sanity Check
4765
checkIndex(columnIndex);
4766
// make sure the cursor is on a valid row
4767
checkCursor();
4768
4769
if (isBinary(RowSetMD.getColumnType(columnIndex)) == false) {
4770
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4771
}
4772
4773
byte buf[] = new byte[length];
4774
try {
4775
int bytesRead = 0;
4776
do {
4777
bytesRead += x.read(buf, bytesRead, length - bytesRead);
4778
} while (bytesRead != -1);
4779
} catch (java.io.IOException ex) {
4780
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.binstream").toString());
4781
}
4782
4783
getCurrentRow().setColumnObject(columnIndex, buf);
4784
}
4785
4786
/**
4787
* Sets the designated column in either the current row or the insert
4788
* row of this <code>CachedRowSetImpl</code> object with the given
4789
* <code>java.io.Reader</code> object.
4790
* <P>
4791
* This method updates a column value in either the current row or
4792
* the insert row of this rowset, but it does not update the
4793
* database. If the cursor is on a row in the rowset, the
4794
* method {@link #updateRow} must be called to update the database.
4795
* If the cursor is on the insert row, the method {@link #insertRow}
4796
* must be called, which will insert the new row into both this rowset
4797
* and the database. Both of these methods must be called before the
4798
* cursor moves to another row.
4799
*
4800
* @param columnIndex the first column is <code>1</code>, the second
4801
* is <code>2</code>, and so on; must be <code>1</code> or larger
4802
* and equal to or less than the number of columns in this rowset
4803
* @param x the new column value; must be a <code>java.io.Reader</code>
4804
* containing <code>BINARY</code>, <code>VARBINARY</code>,
4805
* <code>LONGVARBINARY</code>, <code>CHAR</code>, <code>VARCHAR</code>,
4806
* or <code>LONGVARCHAR</code> data
4807
* @param length the length of the stream in characters
4808
* @throws SQLException if (1) the given column index is out of bounds,
4809
* (2) the cursor is not on one of this rowset's rows or its
4810
* insert row, (3) the data in the stream is not a binary or
4811
* character type, or (4) this rowset is
4812
* <code>ResultSet.CONCUR_READ_ONLY</code>
4813
*/
4814
public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException {
4815
// sanity Check
4816
checkIndex(columnIndex);
4817
// make sure the cursor is on a valid row
4818
checkCursor();
4819
4820
if (isString(RowSetMD.getColumnType(columnIndex)) == false &&
4821
isBinary(RowSetMD.getColumnType(columnIndex)) == false) {
4822
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
4823
}
4824
4825
char buf[] = new char[length];
4826
try {
4827
int charsRead = 0;
4828
do {
4829
charsRead += x.read(buf, charsRead, length - charsRead);
4830
} while (charsRead != length);
4831
//Changed the condition checking to check for length instead of -1
4832
} catch (java.io.IOException ex) {
4833
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.binstream").toString());
4834
}
4835
String str = new String(buf);
4836
4837
getCurrentRow().setColumnObject(columnIndex, str);
4838
}
4839
4840
/**
4841
* Sets the designated column in either the current row or the insert
4842
* row of this <code>CachedRowSetImpl</code> object with the given
4843
* <code>Object</code> value. The <code>scale</code> parameter indicates
4844
* the number of digits to the right of the decimal point and is ignored
4845
* if the new column value is not a type that will be mapped to an SQL
4846
* <code>DECIMAL</code> or <code>NUMERIC</code> value.
4847
* <P>
4848
* This method updates a column value in either the current row or
4849
* the insert row of this rowset, but it does not update the
4850
* database. If the cursor is on a row in the rowset, the
4851
* method {@link #updateRow} must be called to update the database.
4852
* If the cursor is on the insert row, the method {@link #insertRow}
4853
* must be called, which will insert the new row into both this rowset
4854
* and the database. Both of these methods must be called before the
4855
* cursor moves to another row.
4856
*
4857
* @param columnIndex the first column is <code>1</code>, the second
4858
* is <code>2</code>, and so on; must be <code>1</code> or larger
4859
* and equal to or less than the number of columns in this rowset
4860
* @param x the new column value
4861
* @param scale the number of digits to the right of the decimal point (for
4862
* <code>DECIMAL</code> and <code>NUMERIC</code> types only)
4863
* @throws SQLException if (1) the given column index is out of bounds,
4864
* (2) the cursor is not on one of this rowset's rows or its
4865
* insert row, or (3) this rowset is
4866
* <code>ResultSet.CONCUR_READ_ONLY</code>
4867
*/
4868
public void updateObject(int columnIndex, Object x, int scale) throws SQLException {
4869
// sanity check.
4870
checkIndex(columnIndex);
4871
// make sure the cursor is on a valid row
4872
checkCursor();
4873
4874
int type = RowSetMD.getColumnType(columnIndex);
4875
if (type == Types.DECIMAL || type == Types.NUMERIC) {
4876
((java.math.BigDecimal)x).setScale(scale);
4877
}
4878
getCurrentRow().setColumnObject(columnIndex, x);
4879
}
4880
4881
/**
4882
* Sets the designated column in either the current row or the insert
4883
* row of this <code>CachedRowSetImpl</code> object with the given
4884
* <code>Object</code> value.
4885
* <P>
4886
* This method updates a column value in either the current row or
4887
* the insert row of this rowset, but it does not update the
4888
* database. If the cursor is on a row in the rowset, the
4889
* method {@link #updateRow} must be called to update the database.
4890
* If the cursor is on the insert row, the method {@link #insertRow}
4891
* must be called, which will insert the new row into both this rowset
4892
* and the database. Both of these methods must be called before the
4893
* cursor moves to another row.
4894
*
4895
* @param columnIndex the first column is <code>1</code>, the second
4896
* is <code>2</code>, and so on; must be <code>1</code> or larger
4897
* and equal to or less than the number of columns in this rowset
4898
* @param x the new column value
4899
* @throws SQLException if (1) the given column index is out of bounds,
4900
* (2) the cursor is not on one of this rowset's rows or its
4901
* insert row, or (3) this rowset is
4902
* <code>ResultSet.CONCUR_READ_ONLY</code>
4903
*/
4904
public void updateObject(int columnIndex, Object x) throws SQLException {
4905
// sanity check.
4906
checkIndex(columnIndex);
4907
// make sure the cursor is on a valid row
4908
checkCursor();
4909
4910
getCurrentRow().setColumnObject(columnIndex, x);
4911
}
4912
4913
/**
4914
* Sets the designated nullable column in the current row or the
4915
* insert row of this <code>CachedRowSetImpl</code> object with
4916
* <code>null</code> value.
4917
* <P>
4918
* This method updates a column value in the current row or the insert
4919
* row of this rowset, but it does not update the database.
4920
* If the cursor is on a row in the rowset, the
4921
* method {@link #updateRow} must be called to update the database.
4922
* If the cursor is on the insert row, the method {@link #insertRow}
4923
* must be called, which will insert the new row into both this rowset
4924
* and the database.
4925
*
4926
* @param columnName a <code>String</code> object that must match the
4927
* SQL name of a column in this rowset, ignoring case
4928
* @throws SQLException if (1) the given column name does not match the
4929
* name of a column in this rowset, (2) the cursor is not on
4930
* one of this rowset's rows or its insert row, or (3) this
4931
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4932
*/
4933
public void updateNull(String columnName) throws SQLException {
4934
updateNull(getColIdxByName(columnName));
4935
}
4936
4937
/**
4938
* Sets the designated column in either the current row or the insert
4939
* row of this <code>CachedRowSetImpl</code> object with the given
4940
* <code>boolean</code> value.
4941
* <P>
4942
* This method updates a column value in the current row or the insert
4943
* row of this rowset, but it does not update the database.
4944
* If the cursor is on a row in the rowset, the
4945
* method {@link #updateRow} must be called to update the database.
4946
* If the cursor is on the insert row, the method {@link #insertRow}
4947
* must be called, which will insert the new row into both this rowset
4948
* and the database. Both of these methods must be called before the
4949
* cursor moves to another row.
4950
*
4951
* @param columnName a <code>String</code> object that must match the
4952
* SQL name of a column in this rowset, ignoring case
4953
* @param x the new column value
4954
* @throws SQLException if (1) the given column name does not match the
4955
* name of a column in this rowset, (2) the cursor is not on
4956
* one of this rowset's rows or its insert row, or (3) this
4957
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4958
*/
4959
public void updateBoolean(String columnName, boolean x) throws SQLException {
4960
updateBoolean(getColIdxByName(columnName), x);
4961
}
4962
4963
/**
4964
* Sets the designated column in either the current row or the insert
4965
* row of this <code>CachedRowSetImpl</code> object with the given
4966
* <code>byte</code> value.
4967
* <P>
4968
* This method updates a column value in the current row or the insert
4969
* row of this rowset, but it does not update the database.
4970
* If the cursor is on a row in the rowset, the
4971
* method {@link #updateRow} must be called to update the database.
4972
* If the cursor is on the insert row, the method {@link #insertRow}
4973
* must be called, which will insert the new row into both this rowset
4974
* and the database. Both of these methods must be called before the
4975
* cursor moves to another row.
4976
*
4977
* @param columnName a <code>String</code> object that must match the
4978
* SQL name of a column in this rowset, ignoring case
4979
* @param x the new column value
4980
* @throws SQLException if (1) the given column name does not match the
4981
* name of a column in this rowset, (2) the cursor is not on
4982
* one of this rowset's rows or its insert row, or (3) this
4983
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
4984
*/
4985
public void updateByte(String columnName, byte x) throws SQLException {
4986
updateByte(getColIdxByName(columnName), x);
4987
}
4988
4989
/**
4990
* Sets the designated column in either the current row or the insert
4991
* row of this <code>CachedRowSetImpl</code> object with the given
4992
* <code>short</code> value.
4993
* <P>
4994
* This method updates a column value in the current row or the insert
4995
* row of this rowset, but it does not update the database.
4996
* If the cursor is on a row in the rowset, the
4997
* method {@link #updateRow} must be called to update the database.
4998
* If the cursor is on the insert row, the method {@link #insertRow}
4999
* must be called, which will insert the new row into both this rowset
5000
* and the database. Both of these methods must be called before the
5001
* cursor moves to another row.
5002
*
5003
* @param columnName a <code>String</code> object that must match the
5004
* SQL name of a column in this rowset, ignoring case
5005
* @param x the new column value
5006
* @throws SQLException if (1) the given column name does not match the
5007
* name of a column in this rowset, (2) the cursor is not on
5008
* one of this rowset's rows or its insert row, or (3) this
5009
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5010
*/
5011
public void updateShort(String columnName, short x) throws SQLException {
5012
updateShort(getColIdxByName(columnName), x);
5013
}
5014
5015
/**
5016
* Sets the designated column in either the current row or the insert
5017
* row of this <code>CachedRowSetImpl</code> object with the given
5018
* <code>int</code> value.
5019
* <P>
5020
* This method updates a column value in the current row or the insert
5021
* row of this rowset, but it does not update the database.
5022
* If the cursor is on a row in the rowset, the
5023
* method {@link #updateRow} must be called to update the database.
5024
* If the cursor is on the insert row, the method {@link #insertRow}
5025
* must be called, which will insert the new row into both this rowset
5026
* and the database. Both of these methods must be called before the
5027
* cursor moves to another row.
5028
*
5029
* @param columnName a <code>String</code> object that must match the
5030
* SQL name of a column in this rowset, ignoring case
5031
* @param x the new column value
5032
* @throws SQLException if (1) the given column name does not match the
5033
* name of a column in this rowset, (2) the cursor is not on
5034
* one of this rowset's rows or its insert row, or (3) this
5035
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5036
*/
5037
public void updateInt(String columnName, int x) throws SQLException {
5038
updateInt(getColIdxByName(columnName), x);
5039
}
5040
5041
/**
5042
* Sets the designated column in either the current row or the insert
5043
* row of this <code>CachedRowSetImpl</code> object with the given
5044
* <code>long</code> value.
5045
* <P>
5046
* This method updates a column value in the current row or the insert
5047
* row of this rowset, but it does not update the database.
5048
* If the cursor is on a row in the rowset, the
5049
* method {@link #updateRow} must be called to update the database.
5050
* If the cursor is on the insert row, the method {@link #insertRow}
5051
* must be called, which will insert the new row into both this rowset
5052
* and the database. Both of these methods must be called before the
5053
* cursor moves to another row.
5054
*
5055
* @param columnName a <code>String</code> object that must match the
5056
* SQL name of a column in this rowset, ignoring case
5057
* @param x the new column value
5058
* @throws SQLException if (1) the given column name does not match the
5059
* name of a column in this rowset, (2) the cursor is not on
5060
* one of this rowset's rows or its insert row, or (3) this
5061
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5062
*/
5063
public void updateLong(String columnName, long x) throws SQLException {
5064
updateLong(getColIdxByName(columnName), x);
5065
}
5066
5067
/**
5068
* Sets the designated column in either the current row or the insert
5069
* row of this <code>CachedRowSetImpl</code> object with the given
5070
* <code>float</code> value.
5071
* <P>
5072
* This method updates a column value in the current row or the insert
5073
* row of this rowset, but it does not update the database.
5074
* If the cursor is on a row in the rowset, the
5075
* method {@link #updateRow} must be called to update the database.
5076
* If the cursor is on the insert row, the method {@link #insertRow}
5077
* must be called, which will insert the new row into both this rowset
5078
* and the database. Both of these methods must be called before the
5079
* cursor moves to another row.
5080
*
5081
* @param columnName a <code>String</code> object that must match the
5082
* SQL name of a column in this rowset, ignoring case
5083
* @param x the new column value
5084
* @throws SQLException if (1) the given column name does not match the
5085
* name of a column in this rowset, (2) the cursor is not on
5086
* one of this rowset's rows or its insert row, or (3) this
5087
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5088
*/
5089
public void updateFloat(String columnName, float x) throws SQLException {
5090
updateFloat(getColIdxByName(columnName), x);
5091
}
5092
5093
/**
5094
* Sets the designated column in either the current row or the insert
5095
* row of this <code>CachedRowSetImpl</code> object with the given
5096
* <code>double</code> value.
5097
*
5098
* This method updates a column value in either the current row or
5099
* the insert row of this rowset, but it does not update the
5100
* database. If the cursor is on a row in the rowset, the
5101
* method {@link #updateRow} must be called to update the database.
5102
* If the cursor is on the insert row, the method {@link #insertRow}
5103
* must be called, which will insert the new row into both this rowset
5104
* and the database. Both of these methods must be called before the
5105
* cursor moves to another row.
5106
*
5107
* @param columnName a <code>String</code> object that must match the
5108
* SQL name of a column in this rowset, ignoring case
5109
* @param x the new column value
5110
* @throws SQLException if (1) the given column name does not match the
5111
* name of a column in this rowset, (2) the cursor is not on
5112
* one of this rowset's rows or its insert row, or (3) this
5113
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5114
*/
5115
public void updateDouble(String columnName, double x) throws SQLException {
5116
updateDouble(getColIdxByName(columnName), x);
5117
}
5118
5119
/**
5120
* Sets the designated column in either the current row or the insert
5121
* row of this <code>CachedRowSetImpl</code> object with the given
5122
* <code>java.math.BigDecimal</code> object.
5123
* <P>
5124
* This method updates a column value in the current row or the insert
5125
* row of this rowset, but it does not update the database.
5126
* If the cursor is on a row in the rowset, the
5127
* method {@link #updateRow} must be called to update the database.
5128
* If the cursor is on the insert row, the method {@link #insertRow}
5129
* must be called, which will insert the new row into both this rowset
5130
* and the database. Both of these methods must be called before the
5131
* cursor moves to another row.
5132
*
5133
* @param columnName a <code>String</code> object that must match the
5134
* SQL name of a column in this rowset, ignoring case
5135
* @param x the new column value
5136
* @throws SQLException if (1) the given column name does not match the
5137
* name of a column in this rowset, (2) the cursor is not on
5138
* one of this rowset's rows or its insert row, or (3) this
5139
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5140
*/
5141
public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException {
5142
updateBigDecimal(getColIdxByName(columnName), x);
5143
}
5144
5145
/**
5146
* Sets the designated column in either the current row or the insert
5147
* row of this <code>CachedRowSetImpl</code> object with the given
5148
* <code>String</code> object.
5149
*
5150
* This method updates a column value in either the current row or
5151
* the insert row of this rowset, but it does not update the
5152
* database. If the cursor is on a row in the rowset, the
5153
* method {@link #updateRow} must be called to update the database.
5154
* If the cursor is on the insert row, the method {@link #insertRow}
5155
* must be called, which will insert the new row into both this rowset
5156
* and the database. Both of these methods must be called before the
5157
* cursor moves to another row.
5158
*
5159
* @param columnName a <code>String</code> object that must match the
5160
* SQL name of a column in this rowset, ignoring case
5161
* @param x the new column value
5162
* @throws SQLException if (1) the given column name does not match the
5163
* name of a column in this rowset, (2) the cursor is not on
5164
* one of this rowset's rows or its insert row, or (3) this
5165
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5166
*/
5167
public void updateString(String columnName, String x) throws SQLException {
5168
updateString(getColIdxByName(columnName), x);
5169
}
5170
5171
/**
5172
* Sets the designated column in either the current row or the insert
5173
* row of this <code>CachedRowSetImpl</code> object with the given
5174
* <code>byte</code> array.
5175
*
5176
* This method updates a column value in either the current row or
5177
* the insert row of this rowset, but it does not update the
5178
* database. If the cursor is on a row in the rowset, the
5179
* method {@link #updateRow} must be called to update the database.
5180
* If the cursor is on the insert row, the method {@link #insertRow}
5181
* must be called, which will insert the new row into both this rowset
5182
* and the database. Both of these methods must be called before the
5183
* cursor moves to another row.
5184
*
5185
* @param columnName a <code>String</code> object that must match the
5186
* SQL name of a column in this rowset, ignoring case
5187
* @param x the new column value
5188
* @throws SQLException if (1) the given column name does not match the
5189
* name of a column in this rowset, (2) the cursor is not on
5190
* one of this rowset's rows or its insert row, or (3) this
5191
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5192
*/
5193
public void updateBytes(String columnName, byte x[]) throws SQLException {
5194
updateBytes(getColIdxByName(columnName), x);
5195
}
5196
5197
/**
5198
* Sets the designated column in either the current row or the insert
5199
* row of this <code>CachedRowSetImpl</code> object with the given
5200
* <code>Date</code> object.
5201
*
5202
* This method updates a column value in either the current row or
5203
* the insert row of this rowset, but it does not update the
5204
* database. If the cursor is on a row in the rowset, the
5205
* method {@link #updateRow} must be called to update the database.
5206
* If the cursor is on the insert row, the method {@link #insertRow}
5207
* must be called, which will insert the new row into both this rowset
5208
* and the database. Both of these methods must be called before the
5209
* cursor moves to another row.
5210
*
5211
* @param columnName a <code>String</code> object that must match the
5212
* SQL name of a column in this rowset, ignoring case
5213
* @param x the new column value
5214
* @throws SQLException if (1) the given column name does not match the
5215
* name of a column in this rowset, (2) the cursor is not on
5216
* one of this rowset's rows or its insert row, (3) the type
5217
* of the designated column is not an SQL <code>DATE</code> or
5218
* <code>TIMESTAMP</code>, or (4) this rowset is
5219
* <code>ResultSet.CONCUR_READ_ONLY</code>
5220
*/
5221
public void updateDate(String columnName, java.sql.Date x) throws SQLException {
5222
updateDate(getColIdxByName(columnName), x);
5223
}
5224
5225
/**
5226
* Sets the designated column in either the current row or the insert
5227
* row of this <code>CachedRowSetImpl</code> object with the given
5228
* <code>Time</code> object.
5229
*
5230
* This method updates a column value in either the current row or
5231
* the insert row of this rowset, but it does not update the
5232
* database. If the cursor is on a row in the rowset, the
5233
* method {@link #updateRow} must be called to update the database.
5234
* If the cursor is on the insert row, the method {@link #insertRow}
5235
* must be called, which will insert the new row into both this rowset
5236
* and the database. Both of these methods must be called before the
5237
* cursor moves to another row.
5238
*
5239
* @param columnName a <code>String</code> object that must match the
5240
* SQL name of a column in this rowset, ignoring case
5241
* @param x the new column value
5242
* @throws SQLException if (1) the given column name does not match the
5243
* name of a column in this rowset, (2) the cursor is not on
5244
* one of this rowset's rows or its insert row, (3) the type
5245
* of the designated column is not an SQL <code>TIME</code> or
5246
* <code>TIMESTAMP</code>, or (4) this rowset is
5247
* <code>ResultSet.CONCUR_READ_ONLY</code>
5248
*/
5249
public void updateTime(String columnName, java.sql.Time x) throws SQLException {
5250
updateTime(getColIdxByName(columnName), x);
5251
}
5252
5253
/**
5254
* Sets the designated column in either the current row or the insert
5255
* row of this <code>CachedRowSetImpl</code> object with the given
5256
* <code>Timestamp</code> object.
5257
*
5258
* This method updates a column value in either the current row or
5259
* the insert row of this rowset, but it does not update the
5260
* database. If the cursor is on a row in the rowset, the
5261
* method {@link #updateRow} must be called to update the database.
5262
* If the cursor is on the insert row, the method {@link #insertRow}
5263
* must be called, which will insert the new row into both this rowset
5264
* and the database. Both of these methods must be called before the
5265
* cursor moves to another row.
5266
*
5267
* @param columnName a <code>String</code> object that must match the
5268
* SQL name of a column in this rowset, ignoring case
5269
* @param x the new column value
5270
* @throws SQLException if the given column index is out of bounds or
5271
* the cursor is not on one of this rowset's rows or its
5272
* insert row
5273
* @throws SQLException if (1) the given column name does not match the
5274
* name of a column in this rowset, (2) the cursor is not on
5275
* one of this rowset's rows or its insert row, (3) the type
5276
* of the designated column is not an SQL <code>DATE</code>,
5277
* <code>TIME</code>, or <code>TIMESTAMP</code>, or (4) this
5278
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5279
*/
5280
public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException {
5281
updateTimestamp(getColIdxByName(columnName), x);
5282
}
5283
5284
/**
5285
* Sets the designated column in either the current row or the insert
5286
* row of this <code>CachedRowSetImpl</code> object with the given
5287
* ASCII stream value.
5288
* <P>
5289
* This method updates a column value in either the current row or
5290
* the insert row of this rowset, but it does not update the
5291
* database. If the cursor is on a row in the rowset, the
5292
* method {@link #updateRow} must be called to update the database.
5293
* If the cursor is on the insert row, the method {@link #insertRow}
5294
* must be called, which will insert the new row into both this rowset
5295
* and the database. Both of these methods must be called before the
5296
* cursor moves to another row.
5297
*
5298
* @param columnName a <code>String</code> object that must match the
5299
* SQL name of a column in this rowset, ignoring case
5300
* @param x the new column value
5301
* @param length the number of one-byte ASCII characters in the stream
5302
*/
5303
public void updateAsciiStream(String columnName,
5304
java.io.InputStream x,
5305
int length) throws SQLException {
5306
updateAsciiStream(getColIdxByName(columnName), x, length);
5307
}
5308
5309
/**
5310
* Sets the designated column in either the current row or the insert
5311
* row of this <code>CachedRowSetImpl</code> object with the given
5312
* <code>java.io.InputStream</code> object.
5313
* <P>
5314
* This method updates a column value in either the current row or
5315
* the insert row of this rowset, but it does not update the
5316
* database. If the cursor is on a row in the rowset, the
5317
* method {@link #updateRow} must be called to update the database.
5318
* If the cursor is on the insert row, the method {@link #insertRow}
5319
* must be called, which will insert the new row into both this rowset
5320
* and the database. Both of these methods must be called before the
5321
* cursor moves to another row.
5322
*
5323
* @param columnName a <code>String</code> object that must match the
5324
* SQL name of a column in this rowset, ignoring case
5325
* @param x the new column value; must be a <code>java.io.InputStream</code>
5326
* containing <code>BINARY</code>, <code>VARBINARY</code>, or
5327
* <code>LONGVARBINARY</code> data
5328
* @param length the length of the stream in bytes
5329
* @throws SQLException if (1) the given column name does not match the
5330
* name of a column in this rowset, (2) the cursor is not on
5331
* one of this rowset's rows or its insert row, (3) the data
5332
* in the stream is not binary, or (4) this rowset is
5333
* <code>ResultSet.CONCUR_READ_ONLY</code>
5334
*/
5335
public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException {
5336
updateBinaryStream(getColIdxByName(columnName), x, length);
5337
}
5338
5339
/**
5340
* Sets the designated column in either the current row or the insert
5341
* row of this <code>CachedRowSetImpl</code> object with the given
5342
* <code>java.io.Reader</code> object.
5343
* <P>
5344
* This method updates a column value in either the current row or
5345
* the insert row of this rowset, but it does not update the
5346
* database. If the cursor is on a row in the rowset, the
5347
* method {@link #updateRow} must be called to update the database.
5348
* If the cursor is on the insert row, the method {@link #insertRow}
5349
* must be called, which will insert the new row into both this rowset
5350
* and the database. Both of these methods must be called before the
5351
* cursor moves to another row.
5352
*
5353
* @param columnName a <code>String</code> object that must match the
5354
* SQL name of a column in this rowset, ignoring case
5355
* @param reader the new column value; must be a
5356
* <code>java.io.Reader</code> containing <code>BINARY</code>,
5357
* <code>VARBINARY</code>, <code>LONGVARBINARY</code>, <code>CHAR</code>,
5358
* <code>VARCHAR</code>, or <code>LONGVARCHAR</code> data
5359
* @param length the length of the stream in characters
5360
* @throws SQLException if (1) the given column name does not match the
5361
* name of a column in this rowset, (2) the cursor is not on
5362
* one of this rowset's rows or its insert row, (3) the data
5363
* in the stream is not a binary or character type, or (4) this
5364
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5365
*/
5366
public void updateCharacterStream(String columnName,
5367
java.io.Reader reader,
5368
int length) throws SQLException {
5369
updateCharacterStream(getColIdxByName(columnName), reader, length);
5370
}
5371
5372
/**
5373
* Sets the designated column in either the current row or the insert
5374
* row of this <code>CachedRowSetImpl</code> object with the given
5375
* <code>Object</code> value. The <code>scale</code> parameter
5376
* indicates the number of digits to the right of the decimal point
5377
* and is ignored if the new column value is not a type that will be
5378
* mapped to an SQL <code>DECIMAL</code> or <code>NUMERIC</code> value.
5379
* <P>
5380
* This method updates a column value in either the current row or
5381
* the insert row of this rowset, but it does not update the
5382
* database. If the cursor is on a row in the rowset, the
5383
* method {@link #updateRow} must be called to update the database.
5384
* If the cursor is on the insert row, the method {@link #insertRow}
5385
* must be called, which will insert the new row into both this rowset
5386
* and the database. Both of these methods must be called before the
5387
* cursor moves to another row.
5388
*
5389
* @param columnName a <code>String</code> object that must match the
5390
* SQL name of a column in this rowset, ignoring case
5391
* @param x the new column value
5392
* @param scale the number of digits to the right of the decimal point (for
5393
* <code>DECIMAL</code> and <code>NUMERIC</code> types only)
5394
* @throws SQLException if (1) the given column name does not match the
5395
* name of a column in this rowset, (2) the cursor is not on
5396
* one of this rowset's rows or its insert row, or (3) this
5397
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5398
*/
5399
public void updateObject(String columnName, Object x, int scale) throws SQLException {
5400
updateObject(getColIdxByName(columnName), x, scale);
5401
}
5402
5403
/**
5404
* Sets the designated column in either the current row or the insert
5405
* row of this <code>CachedRowSetImpl</code> object with the given
5406
* <code>Object</code> value.
5407
* <P>
5408
* This method updates a column value in either the current row or
5409
* the insert row of this rowset, but it does not update the
5410
* database. If the cursor is on a row in the rowset, the
5411
* method {@link #updateRow} must be called to update the database.
5412
* If the cursor is on the insert row, the method {@link #insertRow}
5413
* must be called, which will insert the new row into both this rowset
5414
* and the database. Both of these methods must be called before the
5415
* cursor moves to another row.
5416
*
5417
* @param columnName a <code>String</code> object that must match the
5418
* SQL name of a column in this rowset, ignoring case
5419
* @param x the new column value
5420
* @throws SQLException if (1) the given column name does not match the
5421
* name of a column in this rowset, (2) the cursor is not on
5422
* one of this rowset's rows or its insert row, or (3) this
5423
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5424
*/
5425
public void updateObject(String columnName, Object x) throws SQLException {
5426
updateObject(getColIdxByName(columnName), x);
5427
}
5428
5429
/**
5430
* Inserts the contents of this <code>CachedRowSetImpl</code> object's insert
5431
* row into this rowset immediately following the current row.
5432
* If the current row is the
5433
* position after the last row or before the first row, the new row will
5434
* be inserted at the end of the rowset. This method also notifies
5435
* listeners registered with this rowset that the row has changed.
5436
* <P>
5437
* The cursor must be on the insert row when this method is called.
5438
*
5439
* @throws SQLException if (1) the cursor is not on the insert row,
5440
* (2) one or more of the non-nullable columns in the insert
5441
* row has not been given a value, or (3) this rowset is
5442
* <code>ResultSet.CONCUR_READ_ONLY</code>
5443
*/
5444
public void insertRow() throws SQLException {
5445
int pos;
5446
5447
if (onInsertRow == false ||
5448
insertRow.isCompleteRow(RowSetMD) == false) {
5449
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.failedins").toString());
5450
}
5451
// Added the setting of parameters that are passed
5452
// to setXXX methods after an empty CRS Object is
5453
// created through RowSetMetaData object
5454
Object [] toInsert = getParams();
5455
5456
for(int i = 0;i < toInsert.length; i++) {
5457
insertRow.setColumnObject(i+1,toInsert[i]);
5458
}
5459
5460
Row insRow = new Row(RowSetMD.getColumnCount(),
5461
insertRow.getOrigRow());
5462
insRow.setInserted();
5463
/*
5464
* The new row is inserted into the RowSet
5465
* immediately following the current row.
5466
*
5467
* If we are afterlast then the rows are
5468
* inserted at the end.
5469
*/
5470
if (currentRow >= numRows || currentRow < 0) {
5471
pos = numRows;
5472
} else {
5473
pos = currentRow;
5474
}
5475
5476
rvh.add(pos, insRow);
5477
++numRows;
5478
// notify the listeners that the row changed.
5479
notifyRowChanged();
5480
}
5481
5482
/**
5483
* Marks the current row of this <code>CachedRowSetImpl</code> object as
5484
* updated and notifies listeners registered with this rowset that the
5485
* row has changed.
5486
* <P>
5487
* This method cannot be called when the cursor is on the insert row, and
5488
* it should be called before the cursor moves to another row. If it is
5489
* called after the cursor moves to another row, this method has no effect,
5490
* and the updates made before the cursor moved will be lost.
5491
*
5492
* @throws SQLException if the cursor is on the insert row or this
5493
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
5494
*/
5495
public void updateRow() throws SQLException {
5496
// make sure we aren't on the insert row
5497
if (onInsertRow == true) {
5498
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.updateins").toString());
5499
}
5500
5501
((Row)getCurrentRow()).setUpdated();
5502
5503
// notify the listeners that the row changed.
5504
notifyRowChanged();
5505
}
5506
5507
/**
5508
* Deletes the current row from this <code>CachedRowSetImpl</code> object and
5509
* notifies listeners registered with this rowset that a row has changed.
5510
* This method cannot be called when the cursor is on the insert row.
5511
* <P>
5512
* This method marks the current row as deleted, but it does not delete
5513
* the row from the underlying data source. The method
5514
* <code>acceptChanges</code> must be called to delete the row in
5515
* the data source.
5516
*
5517
* @throws SQLException if (1) this method is called when the cursor
5518
* is on the insert row, before the first row, or after the
5519
* last row or (2) this rowset is
5520
* <code>ResultSet.CONCUR_READ_ONLY</code>
5521
*/
5522
public void deleteRow() throws SQLException {
5523
// make sure the cursor is on a valid row
5524
checkCursor();
5525
5526
((Row)getCurrentRow()).setDeleted();
5527
++numDeleted;
5528
5529
// notify the listeners that the row changed.
5530
notifyRowChanged();
5531
}
5532
5533
/**
5534
* Sets the current row with its original value and marks the row as
5535
* not updated, thus undoing any changes made to the row since the
5536
* last call to the methods <code>updateRow</code> or <code>deleteRow</code>.
5537
* This method should be called only when the cursor is on a row in
5538
* this rowset.
5539
*
5540
* @throws SQLException if the cursor is on the insert row, before the
5541
* first row, or after the last row
5542
*/
5543
public void refreshRow() throws SQLException {
5544
// make sure we are on a row
5545
checkCursor();
5546
5547
// don't want this to happen...
5548
if (onInsertRow == true) {
5549
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
5550
}
5551
5552
Row currentRow = (Row)getCurrentRow();
5553
// just undo any changes made to this row.
5554
currentRow.clearUpdated();
5555
5556
}
5557
5558
/**
5559
* Rolls back any updates made to the current row of this
5560
* <code>CachedRowSetImpl</code> object and notifies listeners that
5561
* a row has changed. To have an effect, this method
5562
* must be called after an <code>updateXXX</code> method has been
5563
* called and before the method <code>updateRow</code> has been called.
5564
* If no updates have been made or the method <code>updateRow</code>
5565
* has already been called, this method has no effect.
5566
*
5567
* @throws SQLException if the cursor is on the insert row, before the
5568
* first row, or after the last row
5569
*/
5570
public void cancelRowUpdates() throws SQLException {
5571
// make sure we are on a row
5572
checkCursor();
5573
5574
// don't want this to happen...
5575
if (onInsertRow == true) {
5576
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
5577
}
5578
5579
Row currentRow = (Row)getCurrentRow();
5580
if (currentRow.getUpdated() == true) {
5581
currentRow.clearUpdated();
5582
notifyRowChanged();
5583
}
5584
}
5585
5586
/**
5587
* Moves the cursor for this <code>CachedRowSetImpl</code> object
5588
* to the insert row. The current row in the rowset is remembered
5589
* while the cursor is on the insert row.
5590
* <P>
5591
* The insert row is a special row associated with an updatable
5592
* rowset. It is essentially a buffer where a new row may
5593
* be constructed by calling the appropriate <code>updateXXX</code>
5594
* methods to assign a value to each column in the row. A complete
5595
* row must be constructed; that is, every column that is not nullable
5596
* must be assigned a value. In order for the new row to become part
5597
* of this rowset, the method <code>insertRow</code> must be called
5598
* before the cursor is moved back to the rowset.
5599
* <P>
5600
* Only certain methods may be invoked while the cursor is on the insert
5601
* row; many methods throw an exception if they are called while the
5602
* cursor is there. In addition to the <code>updateXXX</code>
5603
* and <code>insertRow</code> methods, only the <code>getXXX</code> methods
5604
* may be called when the cursor is on the insert row. A <code>getXXX</code>
5605
* method should be called on a column only after an <code>updateXXX</code>
5606
* method has been called on that column; otherwise, the value returned is
5607
* undetermined.
5608
*
5609
* @throws SQLException if this <code>CachedRowSetImpl</code> object is
5610
* <code>ResultSet.CONCUR_READ_ONLY</code>
5611
*/
5612
public void moveToInsertRow() throws SQLException {
5613
if (getConcurrency() == ResultSet.CONCUR_READ_ONLY) {
5614
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.movetoins").toString());
5615
}
5616
if (insertRow == null) {
5617
if (RowSetMD == null)
5618
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.movetoins1").toString());
5619
int numCols = RowSetMD.getColumnCount();
5620
if (numCols > 0) {
5621
insertRow = new InsertRow(numCols);
5622
} else {
5623
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.movetoins2").toString());
5624
}
5625
}
5626
onInsertRow = true;
5627
// %%% setCurrentRow called in BaseRow
5628
5629
currentRow = cursorPos;
5630
cursorPos = -1;
5631
5632
insertRow.initInsertRow();
5633
}
5634
5635
/**
5636
* Moves the cursor for this <code>CachedRowSetImpl</code> object to
5637
* the current row. The current row is the row the cursor was on
5638
* when the method <code>moveToInsertRow</code> was called.
5639
* <P>
5640
* Calling this method has no effect unless it is called while the
5641
* cursor is on the insert row.
5642
*
5643
* @throws SQLException if an error occurs
5644
*/
5645
public void moveToCurrentRow() throws SQLException {
5646
if (onInsertRow == false) {
5647
return;
5648
} else {
5649
cursorPos = currentRow;
5650
onInsertRow = false;
5651
}
5652
}
5653
5654
/**
5655
* Returns <code>null</code>.
5656
*
5657
* @return <code>null</code>
5658
* @throws SQLException if an error occurs
5659
*/
5660
public Statement getStatement() throws SQLException {
5661
return null;
5662
}
5663
5664
/**
5665
* Retrieves the value of the designated column in this
5666
* <code>CachedRowSetImpl</code> object as an <code>Object</code> in
5667
* the Java programming language, using the given
5668
* <code>java.util.Map</code> object to custom map the value if
5669
* appropriate.
5670
*
5671
* @param columnIndex the first column is <code>1</code>, the second
5672
* is <code>2</code>, and so on; must be <code>1</code> or larger
5673
* and equal to or less than the number of columns in this rowset
5674
* @param map a <code>java.util.Map</code> object showing the mapping
5675
* from SQL type names to classes in the Java programming
5676
* language
5677
* @return an <code>Object</code> representing the SQL value
5678
* @throws SQLException if the given column index is out of bounds or
5679
* the cursor is not on one of this rowset's rows or its
5680
* insert row
5681
*/
5682
public Object getObject(int columnIndex,
5683
java.util.Map<String,Class<?>> map)
5684
throws SQLException
5685
{
5686
Object value;
5687
5688
// sanity check.
5689
checkIndex(columnIndex);
5690
// make sure the cursor is on a valid row
5691
checkCursor();
5692
5693
setLastValueNull(false);
5694
value = getCurrentRow().getColumnObject(columnIndex);
5695
5696
// check for SQL NULL
5697
if (value == null) {
5698
setLastValueNull(true);
5699
return null;
5700
}
5701
if (value instanceof Struct) {
5702
Struct s = (Struct)value;
5703
5704
// look up the class in the map
5705
Class<?> c = map.get(s.getSQLTypeName());
5706
if (c != null) {
5707
// create new instance of the class
5708
SQLData obj = null;
5709
try {
5710
obj = (SQLData) ReflectUtil.newInstance(c);
5711
} catch(Exception ex) {
5712
throw new SQLException("Unable to Instantiate: ", ex);
5713
}
5714
// get the attributes from the struct
5715
Object attribs[] = s.getAttributes(map);
5716
// create the SQLInput "stream"
5717
SQLInputImpl sqlInput = new SQLInputImpl(attribs, map);
5718
// read the values...
5719
obj.readSQL(sqlInput, s.getSQLTypeName());
5720
return (Object)obj;
5721
}
5722
}
5723
return value;
5724
}
5725
5726
/**
5727
* Retrieves the value of the designated column in this
5728
* <code>CachedRowSetImpl</code> object as a <code>Ref</code> object
5729
* in the Java programming language.
5730
*
5731
* @param columnIndex the first column is <code>1</code>, the second
5732
* is <code>2</code>, and so on; must be <code>1</code> or larger
5733
* and equal to or less than the number of columns in this rowset
5734
* @return a <code>Ref</code> object representing an SQL<code> REF</code> value
5735
* @throws SQLException if (1) the given column index is out of bounds,
5736
* (2) the cursor is not on one of this rowset's rows or its
5737
* insert row, or (3) the designated column does not store an
5738
* SQL <code>REF</code> value
5739
* @see #getRef(String)
5740
*/
5741
public Ref getRef(int columnIndex) throws SQLException {
5742
Ref value;
5743
5744
// sanity check.
5745
checkIndex(columnIndex);
5746
// make sure the cursor is on a valid row
5747
checkCursor();
5748
5749
if (RowSetMD.getColumnType(columnIndex) != java.sql.Types.REF) {
5750
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
5751
}
5752
5753
setLastValueNull(false);
5754
value = (Ref)(getCurrentRow().getColumnObject(columnIndex));
5755
5756
// check for SQL NULL
5757
if (value == null) {
5758
setLastValueNull(true);
5759
return null;
5760
}
5761
5762
return value;
5763
}
5764
5765
/**
5766
* Retrieves the value of the designated column in this
5767
* <code>CachedRowSetImpl</code> object as a <code>Blob</code> object
5768
* in the Java programming language.
5769
*
5770
* @param columnIndex the first column is <code>1</code>, the second
5771
* is <code>2</code>, and so on; must be <code>1</code> or larger
5772
* and equal to or less than the number of columns in this rowset
5773
* @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
5774
* @throws SQLException if (1) the given column index is out of bounds,
5775
* (2) the cursor is not on one of this rowset's rows or its
5776
* insert row, or (3) the designated column does not store an
5777
* SQL <code>BLOB</code> value
5778
* @see #getBlob(String)
5779
*/
5780
public Blob getBlob(int columnIndex) throws SQLException {
5781
Blob value;
5782
5783
// sanity check.
5784
checkIndex(columnIndex);
5785
// make sure the cursor is on a valid row
5786
checkCursor();
5787
5788
if (RowSetMD.getColumnType(columnIndex) != java.sql.Types.BLOB) {
5789
System.out.println(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.type").toString(), RowSetMD.getColumnType(columnIndex)));
5790
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
5791
}
5792
5793
setLastValueNull(false);
5794
value = (Blob)(getCurrentRow().getColumnObject(columnIndex));
5795
5796
// check for SQL NULL
5797
if (value == null) {
5798
setLastValueNull(true);
5799
return null;
5800
}
5801
5802
return value;
5803
}
5804
5805
/**
5806
* Retrieves the value of the designated column in this
5807
* <code>CachedRowSetImpl</code> object as a <code>Clob</code> object
5808
* in the Java programming language.
5809
*
5810
* @param columnIndex the first column is <code>1</code>, the second
5811
* is <code>2</code>, and so on; must be <code>1</code> or larger
5812
* and equal to or less than the number of columns in this rowset
5813
* @return a <code>Clob</code> object representing an SQL <code>CLOB</code> value
5814
* @throws SQLException if (1) the given column index is out of bounds,
5815
* (2) the cursor is not on one of this rowset's rows or its
5816
* insert row, or (3) the designated column does not store an
5817
* SQL <code>CLOB</code> value
5818
* @see #getClob(String)
5819
*/
5820
public Clob getClob(int columnIndex) throws SQLException {
5821
Clob value;
5822
5823
// sanity check.
5824
checkIndex(columnIndex);
5825
// make sure the cursor is on a valid row
5826
checkCursor();
5827
5828
if (RowSetMD.getColumnType(columnIndex) != java.sql.Types.CLOB) {
5829
System.out.println(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.type").toString(), RowSetMD.getColumnType(columnIndex)));
5830
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
5831
}
5832
5833
setLastValueNull(false);
5834
value = (Clob)(getCurrentRow().getColumnObject(columnIndex));
5835
5836
// check for SQL NULL
5837
if (value == null) {
5838
setLastValueNull(true);
5839
return null;
5840
}
5841
5842
return value;
5843
}
5844
5845
/**
5846
* Retrieves the value of the designated column in this
5847
* <code>CachedRowSetImpl</code> object as an <code>Array</code> object
5848
* in the Java programming language.
5849
*
5850
* @param columnIndex the first column is <code>1</code>, the second
5851
* is <code>2</code>, and so on; must be <code>1</code> or larger
5852
* and equal to or less than the number of columns in this rowset
5853
* @return an <code>Array</code> object representing an SQL
5854
* <code>ARRAY</code> value
5855
* @throws SQLException if (1) the given column index is out of bounds,
5856
* (2) the cursor is not on one of this rowset's rows or its
5857
* insert row, or (3) the designated column does not store an
5858
* SQL <code>ARRAY</code> value
5859
* @see #getArray(String)
5860
*/
5861
public Array getArray(int columnIndex) throws SQLException {
5862
java.sql.Array value;
5863
5864
// sanity check.
5865
checkIndex(columnIndex);
5866
// make sure the cursor is on a valid row
5867
checkCursor();
5868
5869
if (RowSetMD.getColumnType(columnIndex) != java.sql.Types.ARRAY) {
5870
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
5871
}
5872
5873
setLastValueNull(false);
5874
value = (java.sql.Array)(getCurrentRow().getColumnObject(columnIndex));
5875
5876
// check for SQL NULL
5877
if (value == null) {
5878
setLastValueNull(true);
5879
return null;
5880
}
5881
5882
return value;
5883
}
5884
5885
/**
5886
* Retrieves the value of the designated column in this
5887
* <code>CachedRowSetImpl</code> object as an <code>Object</code> in
5888
* the Java programming language, using the given
5889
* <code>java.util.Map</code> object to custom map the value if
5890
* appropriate.
5891
*
5892
* @param columnName a <code>String</code> object that must match the
5893
* SQL name of a column in this rowset, ignoring case
5894
* @param map a <code>java.util.Map</code> object showing the mapping
5895
* from SQL type names to classes in the Java programming
5896
* language
5897
* @return an <code>Object</code> representing the SQL value
5898
* @throws SQLException if the given column name is not the name of
5899
* a column in this rowset or the cursor is not on one of
5900
* this rowset's rows or its insert row
5901
*/
5902
public Object getObject(String columnName,
5903
java.util.Map<String,Class<?>> map)
5904
throws SQLException {
5905
return getObject(getColIdxByName(columnName), map);
5906
}
5907
5908
/**
5909
* Retrieves the value of the designated column in this
5910
* <code>CachedRowSetImpl</code> object as a <code>Ref</code> object
5911
* in the Java programming language.
5912
*
5913
* @param colName a <code>String</code> object that must match the
5914
* SQL name of a column in this rowset, ignoring case
5915
* @return a <code>Ref</code> object representing an SQL<code> REF</code> value
5916
* @throws SQLException if (1) the given column name is not the name of
5917
* a column in this rowset, (2) the cursor is not on one of
5918
* this rowset's rows or its insert row, or (3) the column value
5919
* is not an SQL <code>REF</code> value
5920
* @see #getRef(int)
5921
*/
5922
public Ref getRef(String colName) throws SQLException {
5923
return getRef(getColIdxByName(colName));
5924
}
5925
5926
/**
5927
* Retrieves the value of the designated column in this
5928
* <code>CachedRowSetImpl</code> object as a <code>Blob</code> object
5929
* in the Java programming language.
5930
*
5931
* @param colName a <code>String</code> object that must match the
5932
* SQL name of a column in this rowset, ignoring case
5933
* @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
5934
* @throws SQLException if (1) the given column name is not the name of
5935
* a column in this rowset, (2) the cursor is not on one of
5936
* this rowset's rows or its insert row, or (3) the designated
5937
* column does not store an SQL <code>BLOB</code> value
5938
* @see #getBlob(int)
5939
*/
5940
public Blob getBlob(String colName) throws SQLException {
5941
return getBlob(getColIdxByName(colName));
5942
}
5943
5944
/**
5945
* Retrieves the value of the designated column in this
5946
* <code>CachedRowSetImpl</code> object as a <code>Clob</code> object
5947
* in the Java programming language.
5948
*
5949
* @param colName a <code>String</code> object that must match the
5950
* SQL name of a column in this rowset, ignoring case
5951
* @return a <code>Clob</code> object representing an SQL
5952
* <code>CLOB</code> value
5953
* @throws SQLException if (1) the given column name is not the name of
5954
* a column in this rowset, (2) the cursor is not on one of
5955
* this rowset's rows or its insert row, or (3) the designated
5956
* column does not store an SQL <code>CLOB</code> value
5957
* @see #getClob(int)
5958
*/
5959
public Clob getClob(String colName) throws SQLException {
5960
return getClob(getColIdxByName(colName));
5961
}
5962
5963
/**
5964
* Retrieves the value of the designated column in this
5965
* <code>CachedRowSetImpl</code> object as an <code>Array</code> object
5966
* in the Java programming langugage.
5967
*
5968
* @param colName a <code>String</code> object that must match the
5969
* SQL name of a column in this rowset, ignoring case
5970
* @return an <code>Array</code> object representing an SQL
5971
* <code>ARRAY</code> value
5972
* @throws SQLException if (1) the given column name is not the name of
5973
* a column in this rowset, (2) the cursor is not on one of
5974
* this rowset's rows or its insert row, or (3) the designated
5975
* column does not store an SQL <code>ARRAY</code> value
5976
* @see #getArray(int)
5977
*/
5978
public Array getArray(String colName) throws SQLException {
5979
return getArray(getColIdxByName(colName));
5980
}
5981
5982
/**
5983
* Retrieves the value of the designated column in the current row
5984
* of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Date</code>
5985
* object, using the given <code>Calendar</code> object to construct an
5986
* appropriate millisecond value for the date.
5987
*
5988
* @param columnIndex the first column is <code>1</code>, the second
5989
* is <code>2</code>, and so on; must be <code>1</code> or larger
5990
* and equal to or less than the number of columns in the rowset
5991
* @param cal the <code>java.util.Calendar</code> object to use in
5992
* constructing the date
5993
* @return the column value; if the value is SQL <code>NULL</code>,
5994
* the result is <code>null</code>
5995
* @throws SQLException if (1) the given column name is not the name of
5996
* a column in this rowset, (2) the cursor is not on one of
5997
* this rowset's rows or its insert row, or (3) the designated
5998
* column does not store an SQL <code>DATE</code> or
5999
* <code>TIMESTAMP</code> value
6000
*/
6001
public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException {
6002
Object value;
6003
6004
// sanity check.
6005
checkIndex(columnIndex);
6006
// make sure the cursor is on a valid row
6007
checkCursor();
6008
6009
setLastValueNull(false);
6010
value = getCurrentRow().getColumnObject(columnIndex);
6011
6012
// check for SQL NULL
6013
if (value == null) {
6014
setLastValueNull(true);
6015
return null;
6016
}
6017
6018
value = convertTemporal(value,
6019
RowSetMD.getColumnType(columnIndex),
6020
java.sql.Types.DATE);
6021
6022
// create a default calendar
6023
Calendar defaultCal = Calendar.getInstance();
6024
// set this Calendar to the time we have
6025
defaultCal.setTime((java.util.Date)value);
6026
6027
/*
6028
* Now we can pull the pieces of the date out
6029
* of the default calendar and put them into
6030
* the user provided calendar
6031
*/
6032
cal.set(Calendar.YEAR, defaultCal.get(Calendar.YEAR));
6033
cal.set(Calendar.MONTH, defaultCal.get(Calendar.MONTH));
6034
cal.set(Calendar.DAY_OF_MONTH, defaultCal.get(Calendar.DAY_OF_MONTH));
6035
6036
/*
6037
* This looks a little odd but it is correct -
6038
* Calendar.getTime() returns a Date...
6039
*/
6040
return new java.sql.Date(cal.getTime().getTime());
6041
}
6042
6043
/**
6044
* Retrieves the value of the designated column in the current row
6045
* of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Date</code>
6046
* object, using the given <code>Calendar</code> object to construct an
6047
* appropriate millisecond value for the date.
6048
*
6049
* @param columnName a <code>String</code> object that must match the
6050
* SQL name of a column in this rowset, ignoring case
6051
* @param cal the <code>java.util.Calendar</code> object to use in
6052
* constructing the date
6053
* @return the column value; if the value is SQL <code>NULL</code>,
6054
* the result is <code>null</code>
6055
* @throws SQLException if (1) the given column name is not the name of
6056
* a column in this rowset, (2) the cursor is not on one of
6057
* this rowset's rows or its insert row, or (3) the designated
6058
* column does not store an SQL <code>DATE</code> or
6059
* <code>TIMESTAMP</code> value
6060
*/
6061
public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException {
6062
return getDate(getColIdxByName(columnName), cal);
6063
}
6064
6065
/**
6066
* Retrieves the value of the designated column in the current row
6067
* of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Time</code>
6068
* object, using the given <code>Calendar</code> object to construct an
6069
* appropriate millisecond value for the date.
6070
*
6071
* @param columnIndex the first column is <code>1</code>, the second
6072
* is <code>2</code>, and so on; must be <code>1</code> or larger
6073
* and equal to or less than the number of columns in the rowset
6074
* @param cal the <code>java.util.Calendar</code> object to use in
6075
* constructing the date
6076
* @return the column value; if the value is SQL <code>NULL</code>,
6077
* the result is <code>null</code>
6078
* @throws SQLException if (1) the given column name is not the name of
6079
* a column in this rowset, (2) the cursor is not on one of
6080
* this rowset's rows or its insert row, or (3) the designated
6081
* column does not store an SQL <code>TIME</code> or
6082
* <code>TIMESTAMP</code> value
6083
*/
6084
public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException {
6085
Object value;
6086
6087
// sanity check.
6088
checkIndex(columnIndex);
6089
// make sure the cursor is on a valid row
6090
checkCursor();
6091
6092
setLastValueNull(false);
6093
value = getCurrentRow().getColumnObject(columnIndex);
6094
6095
// check for SQL NULL
6096
if (value == null) {
6097
setLastValueNull(true);
6098
return null;
6099
}
6100
6101
value = convertTemporal(value,
6102
RowSetMD.getColumnType(columnIndex),
6103
java.sql.Types.TIME);
6104
6105
// create a default calendar
6106
Calendar defaultCal = Calendar.getInstance();
6107
// set the time in the default calendar
6108
defaultCal.setTime((java.util.Date)value);
6109
6110
/*
6111
* Now we can pull the pieces of the date out
6112
* of the default calendar and put them into
6113
* the user provided calendar
6114
*/
6115
cal.set(Calendar.HOUR_OF_DAY, defaultCal.get(Calendar.HOUR_OF_DAY));
6116
cal.set(Calendar.MINUTE, defaultCal.get(Calendar.MINUTE));
6117
cal.set(Calendar.SECOND, defaultCal.get(Calendar.SECOND));
6118
6119
return new java.sql.Time(cal.getTime().getTime());
6120
}
6121
6122
/**
6123
* Retrieves the value of the designated column in the current row
6124
* of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Time</code>
6125
* object, using the given <code>Calendar</code> object to construct an
6126
* appropriate millisecond value for the date.
6127
*
6128
* @param columnName a <code>String</code> object that must match the
6129
* SQL name of a column in this rowset, ignoring case
6130
* @param cal the <code>java.util.Calendar</code> object to use in
6131
* constructing the date
6132
* @return the column value; if the value is SQL <code>NULL</code>,
6133
* the result is <code>null</code>
6134
* @throws SQLException if (1) the given column name is not the name of
6135
* a column in this rowset, (2) the cursor is not on one of
6136
* this rowset's rows or its insert row, or (3) the designated
6137
* column does not store an SQL <code>TIME</code> or
6138
* <code>TIMESTAMP</code> value
6139
*/
6140
public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException {
6141
return getTime(getColIdxByName(columnName), cal);
6142
}
6143
6144
/**
6145
* Retrieves the value of the designated column in the current row
6146
* of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Timestamp</code>
6147
* object, using the given <code>Calendar</code> object to construct an
6148
* appropriate millisecond value for the date.
6149
*
6150
* @param columnIndex the first column is <code>1</code>, the second
6151
* is <code>2</code>, and so on; must be <code>1</code> or larger
6152
* and equal to or less than the number of columns in the rowset
6153
* @param cal the <code>java.util.Calendar</code> object to use in
6154
* constructing the date
6155
* @return the column value; if the value is SQL <code>NULL</code>,
6156
* the result is <code>null</code>
6157
* @throws SQLException if (1) the given column name is not the name of
6158
* a column in this rowset, (2) the cursor is not on one of
6159
* this rowset's rows or its insert row, or (3) the designated
6160
* column does not store an SQL <code>TIME</code> or
6161
* <code>TIMESTAMP</code> value
6162
*/
6163
public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
6164
Object value;
6165
6166
// sanity check.
6167
checkIndex(columnIndex);
6168
// make sure the cursor is on a valid row
6169
checkCursor();
6170
6171
setLastValueNull(false);
6172
value = getCurrentRow().getColumnObject(columnIndex);
6173
6174
// check for SQL NULL
6175
if (value == null) {
6176
setLastValueNull(true);
6177
return null;
6178
}
6179
6180
value = convertTemporal(value,
6181
RowSetMD.getColumnType(columnIndex),
6182
java.sql.Types.TIMESTAMP);
6183
6184
// create a default calendar
6185
Calendar defaultCal = Calendar.getInstance();
6186
// set the time in the default calendar
6187
defaultCal.setTime((java.util.Date)value);
6188
6189
/*
6190
* Now we can pull the pieces of the date out
6191
* of the default calendar and put them into
6192
* the user provided calendar
6193
*/
6194
cal.set(Calendar.YEAR, defaultCal.get(Calendar.YEAR));
6195
cal.set(Calendar.MONTH, defaultCal.get(Calendar.MONTH));
6196
cal.set(Calendar.DAY_OF_MONTH, defaultCal.get(Calendar.DAY_OF_MONTH));
6197
cal.set(Calendar.HOUR_OF_DAY, defaultCal.get(Calendar.HOUR_OF_DAY));
6198
cal.set(Calendar.MINUTE, defaultCal.get(Calendar.MINUTE));
6199
cal.set(Calendar.SECOND, defaultCal.get(Calendar.SECOND));
6200
6201
return new java.sql.Timestamp(cal.getTime().getTime());
6202
}
6203
6204
/**
6205
* Retrieves the value of the designated column in the current row
6206
* of this <code>CachedRowSetImpl</code> object as a
6207
* <code>java.sql.Timestamp</code> object, using the given
6208
* <code>Calendar</code> object to construct an appropriate
6209
* millisecond value for the date.
6210
*
6211
* @param columnName a <code>String</code> object that must match the
6212
* SQL name of a column in this rowset, ignoring case
6213
* @param cal the <code>java.util.Calendar</code> object to use in
6214
* constructing the date
6215
* @return the column value; if the value is SQL <code>NULL</code>,
6216
* the result is <code>null</code>
6217
* @throws SQLException if (1) the given column name is not the name of
6218
* a column in this rowset, (2) the cursor is not on one of
6219
* this rowset's rows or its insert row, or (3) the designated
6220
* column does not store an SQL <code>DATE</code>,
6221
* <code>TIME</code>, or <code>TIMESTAMP</code> value
6222
*/
6223
public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException {
6224
return getTimestamp(getColIdxByName(columnName), cal);
6225
}
6226
6227
/*
6228
* RowSetInternal Interface
6229
*/
6230
6231
/**
6232
* Retrieves the <code>Connection</code> object passed to this
6233
* <code>CachedRowSetImpl</code> object. This connection may be
6234
* used to populate this rowset with data or to write data back
6235
* to its underlying data source.
6236
*
6237
* @return the <code>Connection</code> object passed to this rowset;
6238
* may be <code>null</code> if there is no connection
6239
* @throws SQLException if an error occurs
6240
*/
6241
public Connection getConnection() throws SQLException{
6242
return conn;
6243
}
6244
6245
/**
6246
* Sets the metadata for this <code>CachedRowSetImpl</code> object
6247
* with the given <code>RowSetMetaData</code> object.
6248
*
6249
* @param md a <code>RowSetMetaData</code> object instance containing
6250
* metadata about the columsn in the rowset
6251
* @throws SQLException if invalid meta data is supplied to the
6252
* rowset
6253
*/
6254
public void setMetaData(RowSetMetaData md) throws SQLException {
6255
RowSetMD =(RowSetMetaDataImpl) md;
6256
}
6257
6258
/**
6259
* Returns a result set containing the original value of the rowset. The
6260
* original value is the state of the <code>CachedRowSetImpl</code> after the
6261
* last population or synchronization (whichever occurred most recently) with
6262
* the data source.
6263
* <p>
6264
* The cursor is positioned before the first row in the result set.
6265
* Only rows contained in the result set returned by <code>getOriginal()</code>
6266
* are said to have an original value.
6267
*
6268
* @return the original result set of the rowset
6269
* @throws SQLException if an error occurs produce the
6270
* <code>ResultSet</code> object
6271
*/
6272
public ResultSet getOriginal() throws SQLException {
6273
CachedRowSetImpl crs = new CachedRowSetImpl();
6274
crs.RowSetMD = RowSetMD;
6275
crs.numRows = numRows;
6276
crs.cursorPos = 0;
6277
6278
// make sure we don't get someone playing with these
6279
// %%% is this now necessary ???
6280
//crs.setReader(null);
6281
//crs.setWriter(null);
6282
int colCount = RowSetMD.getColumnCount();
6283
Row orig;
6284
6285
for (Iterator<?> i = rvh.iterator(); i.hasNext();) {
6286
orig = new Row(colCount, ((Row)i.next()).getOrigRow());
6287
crs.rvh.add(orig);
6288
}
6289
return (ResultSet)crs;
6290
}
6291
6292
/**
6293
* Returns a result set containing the original value of the current
6294
* row only.
6295
* The original value is the state of the <code>CachedRowSetImpl</code> after
6296
* the last population or synchronization (whichever occurred most recently)
6297
* with the data source.
6298
*
6299
* @return the original result set of the row
6300
* @throws SQLException if there is no current row
6301
* @see #setOriginalRow
6302
*/
6303
public ResultSet getOriginalRow() throws SQLException {
6304
CachedRowSetImpl crs = new CachedRowSetImpl();
6305
crs.RowSetMD = RowSetMD;
6306
crs.numRows = 1;
6307
crs.cursorPos = 0;
6308
crs.setTypeMap(this.getTypeMap());
6309
6310
// make sure we don't get someone playing with these
6311
// %%% is this now necessary ???
6312
//crs.setReader(null);
6313
//crs.setWriter(null);
6314
6315
Row orig = new Row(RowSetMD.getColumnCount(),
6316
getCurrentRow().getOrigRow());
6317
6318
crs.rvh.add(orig);
6319
6320
return (ResultSet)crs;
6321
6322
}
6323
6324
/**
6325
* Marks the current row in this rowset as being an original row.
6326
*
6327
* @throws SQLException if there is no current row
6328
* @see #getOriginalRow
6329
*/
6330
public void setOriginalRow() throws SQLException {
6331
if (onInsertRow == true) {
6332
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidop").toString());
6333
}
6334
6335
Row row = (Row)getCurrentRow();
6336
makeRowOriginal(row);
6337
6338
// this can happen if deleted rows are being shown
6339
if (row.getDeleted() == true) {
6340
removeCurrentRow();
6341
}
6342
}
6343
6344
/**
6345
* Makes the given row of this rowset the original row by clearing any
6346
* settings that mark the row as having been inserted, deleted, or updated.
6347
* This method is called internally by the methods
6348
* <code>setOriginalRow</code>
6349
* and <code>setOriginal</code>.
6350
*
6351
* @param row the row to be made the original row
6352
*/
6353
private void makeRowOriginal(Row row) {
6354
if (row.getInserted() == true) {
6355
row.clearInserted();
6356
}
6357
6358
if (row.getUpdated() == true) {
6359
row.moveCurrentToOrig();
6360
}
6361
}
6362
6363
/**
6364
* Marks all rows in this rowset as being original rows. Any updates
6365
* made to the rows become the original values for the rowset.
6366
* Calls to the method <code>setOriginal</code> connot be reversed.
6367
*
6368
* @throws SQLException if an error occurs
6369
*/
6370
public void setOriginal() throws SQLException {
6371
for (Iterator<?> i = rvh.iterator(); i.hasNext();) {
6372
Row row = (Row)i.next();
6373
makeRowOriginal(row);
6374
// remove deleted rows from the collection.
6375
if (row.getDeleted() == true) {
6376
i.remove();
6377
--numRows;
6378
}
6379
}
6380
numDeleted = 0;
6381
6382
// notify any listeners that the rowset has changed
6383
notifyRowSetChanged();
6384
}
6385
6386
/**
6387
* Returns an identifier for the object (table) that was used to create this
6388
* rowset.
6389
*
6390
* @return a <code>String</code> object that identifies the table from
6391
* which this <code>CachedRowSetImpl</code> object was derived
6392
* @throws SQLException if an error occurs
6393
*/
6394
public String getTableName() throws SQLException {
6395
return tableName;
6396
}
6397
6398
/**
6399
* Sets the identifier for the table from which this rowset was derived
6400
* to the given table name.
6401
*
6402
* @param tabName a <code>String</code> object that identifies the
6403
* table from which this <code>CachedRowSetImpl</code> object
6404
* was derived
6405
* @throws SQLException if an error occurs
6406
*/
6407
public void setTableName(String tabName) throws SQLException {
6408
if (tabName == null)
6409
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.tablename").toString());
6410
else
6411
tableName = tabName;
6412
}
6413
6414
/**
6415
* Returns the columns that make a key to uniquely identify a
6416
* row in this <code>CachedRowSetImpl</code> object.
6417
*
6418
* @return an array of column numbers that constitutes a primary
6419
* key for this rowset. This array should be empty
6420
* if no column is representitive of a primary key
6421
* @throws SQLException if the rowset is empty or no columns
6422
* are designated as primary keys
6423
* @see #setKeyColumns
6424
*/
6425
public int[] getKeyColumns() throws SQLException {
6426
int[]keyColumns = this.keyCols;
6427
return (keyColumns == null) ? null : Arrays.copyOf(keyColumns, keyColumns.length);
6428
}
6429
6430
6431
/**
6432
* Sets this <code>CachedRowSetImpl</code> object's
6433
* <code>keyCols</code> field with the given array of column
6434
* numbers, which forms a key for uniquely identifying a row
6435
* in this rowset.
6436
*
6437
* @param keys an array of <code>int</code> indicating the
6438
* columns that form a primary key for this
6439
* <code>CachedRowSetImpl</code> object; every
6440
* element in the array must be greater than
6441
* <code>0</code> and less than or equal to the number
6442
* of columns in this rowset
6443
* @throws SQLException if any of the numbers in the
6444
* given array is not valid for this rowset
6445
* @see #getKeyColumns
6446
*/
6447
public void setKeyColumns(int [] keys) throws SQLException {
6448
int numCols = 0;
6449
if (RowSetMD != null) {
6450
numCols = RowSetMD.getColumnCount();
6451
if (keys.length > numCols)
6452
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.keycols").toString());
6453
}
6454
keyCols = new int[keys.length];
6455
for (int i = 0; i < keys.length; i++) {
6456
if (RowSetMD != null && (keys[i] <= 0 ||
6457
keys[i] > numCols)) {
6458
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcol").toString() +
6459
keys[i]);
6460
}
6461
keyCols[i] = keys[i];
6462
}
6463
}
6464
6465
/**
6466
* Sets the designated column in either the current row or the insert
6467
* row of this <code>CachedRowSetImpl</code> object with the given
6468
* <code>Ref</code> value.
6469
*
6470
* This method updates a column value in either the current row or
6471
* the insert row of this rowset, but it does not update the
6472
* database. If the cursor is on a row in the rowset, the
6473
* method {@link #updateRow} must be called to update the database.
6474
* If the cursor is on the insert row, the method {@link #insertRow}
6475
* must be called, which will insert the new row into both this rowset
6476
* and the database. Both of these methods must be called before the
6477
* cursor moves to another row.
6478
*
6479
* @param columnIndex the first column is <code>1</code>, the second
6480
* is <code>2</code>, and so on; must be <code>1</code> or larger
6481
* and equal to or less than the number of columns in this rowset
6482
* @param ref the new column <code>java.sql.Ref</code> value
6483
* @throws SQLException if (1) the given column index is out of bounds,
6484
* (2) the cursor is not on one of this rowset's rows or its
6485
* insert row, or (3) this rowset is
6486
* <code>ResultSet.CONCUR_READ_ONLY</code>
6487
*/
6488
public void updateRef(int columnIndex, java.sql.Ref ref) throws SQLException {
6489
// sanity check.
6490
checkIndex(columnIndex);
6491
// make sure the cursor is on a valid row
6492
checkCursor();
6493
6494
// SerialClob will help in getting the byte array and storing it.
6495
// We need to be checking DatabaseMetaData.locatorsUpdatorCopy()
6496
// or through RowSetMetaData.locatorsUpdatorCopy()
6497
getCurrentRow().setColumnObject(columnIndex, new SerialRef(ref));
6498
}
6499
6500
/**
6501
* Sets the designated column in either the current row or the insert
6502
* row of this <code>CachedRowSetImpl</code> object with the given
6503
* <code>double</code> value.
6504
*
6505
* This method updates a column value in either the current row or
6506
* the insert row of this rowset, but it does not update the
6507
* database. If the cursor is on a row in the rowset, the
6508
* method {@link #updateRow} must be called to update the database.
6509
* If the cursor is on the insert row, the method {@link #insertRow}
6510
* must be called, which will insert the new row into both this rowset
6511
* and the database. Both of these methods must be called before the
6512
* cursor moves to another row.
6513
*
6514
* @param columnName a <code>String</code> object that must match the
6515
* SQL name of a column in this rowset, ignoring case
6516
* @param ref the new column <code>java.sql.Ref</code> value
6517
* @throws SQLException if (1) the given column name does not match the
6518
* name of a column in this rowset, (2) the cursor is not on
6519
* one of this rowset's rows or its insert row, or (3) this
6520
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
6521
*/
6522
public void updateRef(String columnName, java.sql.Ref ref) throws SQLException {
6523
updateRef(getColIdxByName(columnName), ref);
6524
}
6525
6526
/**
6527
* Sets the designated column in either the current row or the insert
6528
* row of this <code>CachedRowSetImpl</code> object with the given
6529
* <code>double</code> value.
6530
*
6531
* This method updates a column value in either the current row or
6532
* the insert row of this rowset, but it does not update the
6533
* database. If the cursor is on a row in the rowset, the
6534
* method {@link #updateRow} must be called to update the database.
6535
* If the cursor is on the insert row, the method {@link #insertRow}
6536
* must be called, which will insert the new row into both this rowset
6537
* and the database. Both of these methods must be called before the
6538
* cursor moves to another row.
6539
*
6540
* @param columnIndex the first column is <code>1</code>, the second
6541
* is <code>2</code>, and so on; must be <code>1</code> or larger
6542
* and equal to or less than the number of columns in this rowset
6543
* @param c the new column <code>Clob</code> value
6544
* @throws SQLException if (1) the given column index is out of bounds,
6545
* (2) the cursor is not on one of this rowset's rows or its
6546
* insert row, or (3) this rowset is
6547
* <code>ResultSet.CONCUR_READ_ONLY</code>
6548
*/
6549
public void updateClob(int columnIndex, Clob c) throws SQLException {
6550
// sanity check.
6551
checkIndex(columnIndex);
6552
// make sure the cursor is on a valid row
6553
checkCursor();
6554
6555
// SerialClob will help in getting the byte array and storing it.
6556
// We need to be checking DatabaseMetaData.locatorsUpdatorCopy()
6557
// or through RowSetMetaData.locatorsUpdatorCopy()
6558
6559
if(dbmslocatorsUpdateCopy){
6560
getCurrentRow().setColumnObject(columnIndex, new SerialClob(c));
6561
}
6562
else{
6563
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.opnotsupp").toString());
6564
}
6565
}
6566
6567
/**
6568
* Sets the designated column in either the current row or the insert
6569
* row of this <code>CachedRowSetImpl</code> object with the given
6570
* <code>double</code> value.
6571
*
6572
* This method updates a column value in either the current row or
6573
* the insert row of this rowset, but it does not update the
6574
* database. If the cursor is on a row in the rowset, the
6575
* method {@link #updateRow} must be called to update the database.
6576
* If the cursor is on the insert row, the method {@link #insertRow}
6577
* must be called, which will insert the new row into both this rowset
6578
* and the database. Both of these methods must be called before the
6579
* cursor moves to another row.
6580
*
6581
* @param columnName a <code>String</code> object that must match the
6582
* SQL name of a column in this rowset, ignoring case
6583
* @param c the new column <code>Clob</code> value
6584
* @throws SQLException if (1) the given column name does not match the
6585
* name of a column in this rowset, (2) the cursor is not on
6586
* one of this rowset's rows or its insert row, or (3) this
6587
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
6588
*/
6589
public void updateClob(String columnName, Clob c) throws SQLException {
6590
updateClob(getColIdxByName(columnName), c);
6591
}
6592
6593
/**
6594
* Sets the designated column in either the current row or the insert
6595
* row of this <code>CachedRowSetImpl</code> object with the given
6596
* <code>java.sql.Blob</code> value.
6597
*
6598
* This method updates a column value in either the current row or
6599
* the insert row of this rowset, but it does not update the
6600
* database. If the cursor is on a row in the rowset, the
6601
* method {@link #updateRow} must be called to update the database.
6602
* If the cursor is on the insert row, the method {@link #insertRow}
6603
* must be called, which will insert the new row into both this rowset
6604
* and the database. Both of these methods must be called before the
6605
* cursor moves to another row.
6606
*
6607
* @param columnIndex the first column is <code>1</code>, the second
6608
* is <code>2</code>, and so on; must be <code>1</code> or larger
6609
* and equal to or less than the number of columns in this rowset
6610
* @param b the new column <code>Blob</code> value
6611
* @throws SQLException if (1) the given column index is out of bounds,
6612
* (2) the cursor is not on one of this rowset's rows or its
6613
* insert row, or (3) this rowset is
6614
* <code>ResultSet.CONCUR_READ_ONLY</code>
6615
*/
6616
public void updateBlob(int columnIndex, Blob b) throws SQLException {
6617
// sanity check.
6618
checkIndex(columnIndex);
6619
// make sure the cursor is on a valid row
6620
checkCursor();
6621
6622
// SerialBlob will help in getting the byte array and storing it.
6623
// We need to be checking DatabaseMetaData.locatorsUpdatorCopy()
6624
// or through RowSetMetaData.locatorsUpdatorCopy()
6625
6626
if(dbmslocatorsUpdateCopy){
6627
getCurrentRow().setColumnObject(columnIndex, new SerialBlob(b));
6628
}
6629
else{
6630
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.opnotsupp").toString());
6631
}
6632
}
6633
6634
/**
6635
* Sets the designated column in either the current row or the insert
6636
* row of this <code>CachedRowSetImpl</code> object with the given
6637
* <code>java.sql.Blob </code> value.
6638
*
6639
* This method updates a column value in either the current row or
6640
* the insert row of this rowset, but it does not update the
6641
* database. If the cursor is on a row in the rowset, the
6642
* method {@link #updateRow} must be called to update the database.
6643
* If the cursor is on the insert row, the method {@link #insertRow}
6644
* must be called, which will insert the new row into both this rowset
6645
* and the database. Both of these methods must be called before the
6646
* cursor moves to another row.
6647
*
6648
* @param columnName a <code>String</code> object that must match the
6649
* SQL name of a column in this rowset, ignoring case
6650
* @param b the new column <code>Blob</code> value
6651
* @throws SQLException if (1) the given column name does not match the
6652
* name of a column in this rowset, (2) the cursor is not on
6653
* one of this rowset's rows or its insert row, or (3) this
6654
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
6655
*/
6656
public void updateBlob(String columnName, Blob b) throws SQLException {
6657
updateBlob(getColIdxByName(columnName), b);
6658
}
6659
6660
/**
6661
* Sets the designated column in either the current row or the insert
6662
* row of this <code>CachedRowSetImpl</code> object with the given
6663
* <code>java.sql.Array</code> values.
6664
*
6665
* This method updates a column value in either the current row or
6666
* the insert row of this rowset, but it does not update the
6667
* database. If the cursor is on a row in the rowset, the
6668
* method {@link #updateRow} must be called to update the database.
6669
* If the cursor is on the insert row, the method {@link #insertRow}
6670
* must be called, which will insert the new row into both this rowset
6671
* and the database. Both of these methods must be called before the
6672
* cursor moves to another row.
6673
*
6674
* @param columnIndex the first column is <code>1</code>, the second
6675
* is <code>2</code>, and so on; must be <code>1</code> or larger
6676
* and equal to or less than the number of columns in this rowset
6677
* @param a the new column <code>Array</code> value
6678
* @throws SQLException if (1) the given column index is out of bounds,
6679
* (2) the cursor is not on one of this rowset's rows or its
6680
* insert row, or (3) this rowset is
6681
* <code>ResultSet.CONCUR_READ_ONLY</code>
6682
*/
6683
public void updateArray(int columnIndex, Array a) throws SQLException {
6684
// sanity check.
6685
checkIndex(columnIndex);
6686
// make sure the cursor is on a valid row
6687
checkCursor();
6688
6689
// SerialArray will help in getting the byte array and storing it.
6690
// We need to be checking DatabaseMetaData.locatorsUpdatorCopy()
6691
// or through RowSetMetaData.locatorsUpdatorCopy()
6692
getCurrentRow().setColumnObject(columnIndex, new SerialArray(a));
6693
}
6694
6695
/**
6696
* Sets the designated column in either the current row or the insert
6697
* row of this <code>CachedRowSetImpl</code> object with the given
6698
* <code>java.sql.Array</code> value.
6699
*
6700
* This method updates a column value in either the current row or
6701
* the insert row of this rowset, but it does not update the
6702
* database. If the cursor is on a row in the rowset, the
6703
* method {@link #updateRow} must be called to update the database.
6704
* If the cursor is on the insert row, the method {@link #insertRow}
6705
* must be called, which will insert the new row into both this rowset
6706
* and the database. Both of these methods must be called before the
6707
* cursor moves to another row.
6708
*
6709
* @param columnName a <code>String</code> object that must match the
6710
* SQL name of a column in this rowset, ignoring case
6711
* @param a the new column <code>Array</code> value
6712
* @throws SQLException if (1) the given column name does not match the
6713
* name of a column in this rowset, (2) the cursor is not on
6714
* one of this rowset's rows or its insert row, or (3) this
6715
* rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
6716
*/
6717
public void updateArray(String columnName, Array a) throws SQLException {
6718
updateArray(getColIdxByName(columnName), a);
6719
}
6720
6721
6722
/**
6723
* Retrieves the value of the designated column in this
6724
* <code>CachedRowSetImpl</code> object as a <code>java.net.URL</code> object
6725
* in the Java programming language.
6726
*
6727
* @return a java.net.URL object containing the resource reference described by
6728
* the URL
6729
* @throws SQLException if (1) the given column index is out of bounds,
6730
* (2) the cursor is not on one of this rowset's rows or its
6731
* insert row, or (3) the designated column does not store an
6732
* SQL <code>DATALINK</code> value.
6733
* @see #getURL(String)
6734
*/
6735
public java.net.URL getURL(int columnIndex) throws SQLException {
6736
//throw new SQLException("Operation not supported");
6737
6738
java.net.URL value;
6739
6740
// sanity check.
6741
checkIndex(columnIndex);
6742
// make sure the cursor is on a valid row
6743
checkCursor();
6744
6745
if (RowSetMD.getColumnType(columnIndex) != java.sql.Types.DATALINK) {
6746
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
6747
}
6748
6749
setLastValueNull(false);
6750
value = (java.net.URL)(getCurrentRow().getColumnObject(columnIndex));
6751
6752
// check for SQL NULL
6753
if (value == null) {
6754
setLastValueNull(true);
6755
return null;
6756
}
6757
6758
return value;
6759
}
6760
6761
/**
6762
* Retrieves the value of the designated column in this
6763
* <code>CachedRowSetImpl</code> object as a <code>java.net.URL</code> object
6764
* in the Java programming language.
6765
*
6766
* @return a java.net.URL object containing the resource reference described by
6767
* the URL
6768
* @throws SQLException if (1) the given column name not the name of a column
6769
* in this rowset, or
6770
* (2) the cursor is not on one of this rowset's rows or its
6771
* insert row, or (3) the designated column does not store an
6772
* SQL <code>DATALINK</code> value.
6773
* @see #getURL(int)
6774
*/
6775
public java.net.URL getURL(String columnName) throws SQLException {
6776
return getURL(getColIdxByName(columnName));
6777
6778
}
6779
6780
/**
6781
* The first warning reported by calls on this <code>CachedRowSetImpl</code>
6782
* object is returned. Subsequent <code>CachedRowSetImpl</code> warnings will
6783
* be chained to this <code>SQLWarning</code>. All <code>RowSetWarnings</code>
6784
* warnings are generated in the disconnected environment and remain a
6785
* seperate warning chain to that provided by the <code>getWarnings</code>
6786
* method.
6787
*
6788
* <P>The warning chain is automatically cleared each time a new
6789
* row is read.
6790
*
6791
* <P><B>Note:</B> This warning chain only covers warnings caused
6792
* by <code>CachedRowSet</code> (and their child interface)
6793
* methods. All <code>SQLWarnings</code> can be obtained using the
6794
* <code>getWarnings</code> method which tracks warnings generated
6795
* by the underlying JDBC driver.
6796
* @return the first SQLWarning or null
6797
*
6798
*/
6799
public RowSetWarning getRowSetWarnings() {
6800
try {
6801
notifyCursorMoved();
6802
} catch (SQLException e) {} // mask exception
6803
return rowsetWarning;
6804
}
6805
6806
6807
/**
6808
* The function tries to isolate the tablename when only setCommand
6809
* is set and not setTablename is called provided there is only one table
6810
* name in the query else just leaves the setting of table name as such.
6811
* If setTablename is set later it will over ride this table name
6812
* value so retrieved.
6813
*
6814
* @return the tablename if only one table in query else return ""
6815
*/
6816
private String buildTableName(String command) throws SQLException {
6817
6818
// If we have a query from one table,
6819
// we set the table name implicitly
6820
// else user has to explicitly set the table name.
6821
6822
int indexFrom, indexComma;
6823
String strTablename ="";
6824
command = command.trim();
6825
6826
// Query can be a select, insert or update
6827
6828
if(command.toLowerCase().startsWith("select")) {
6829
// look for "from" keyword, after that look for a
6830
// comma after from. If comma is there don't set
6831
// table name else isolate table name.
6832
6833
indexFrom = command.toLowerCase().indexOf("from");
6834
indexComma = command.indexOf(",", indexFrom);
6835
6836
if(indexComma == -1) {
6837
// implies only one table
6838
strTablename = (command.substring(indexFrom+"from".length(),command.length())).trim();
6839
6840
String tabName = strTablename;
6841
6842
int idxWhere = tabName.toLowerCase().indexOf("where");
6843
6844
/**
6845
* Adding the addtional check for conditions following the table name.
6846
* If a condition is found truncate it.
6847
**/
6848
6849
if(idxWhere != -1)
6850
{
6851
tabName = tabName.substring(0,idxWhere).trim();
6852
}
6853
6854
strTablename = tabName;
6855
6856
} else {
6857
//strTablename="";
6858
}
6859
6860
} else if(command.toLowerCase().startsWith("insert")) {
6861
//strTablename="";
6862
} else if(command.toLowerCase().startsWith("update")) {
6863
//strTablename="";
6864
}
6865
return strTablename;
6866
}
6867
6868
/**
6869
* Commits all changes performed by the <code>acceptChanges()</code>
6870
* methods
6871
*
6872
* @see java.sql.Connection#commit
6873
*/
6874
public void commit() throws SQLException {
6875
conn.commit();
6876
}
6877
6878
/**
6879
* Rolls back all changes performed by the <code>acceptChanges()</code>
6880
* methods
6881
*
6882
* @see java.sql.Connection#rollback
6883
*/
6884
public void rollback() throws SQLException {
6885
conn.rollback();
6886
}
6887
6888
/**
6889
* Rolls back all changes performed by the <code>acceptChanges()</code>
6890
* to the last <code>Savepoint</code> transaction marker.
6891
*
6892
* @see java.sql.Connection#rollback(Savepoint)
6893
*/
6894
public void rollback(Savepoint s) throws SQLException {
6895
conn.rollback(s);
6896
}
6897
6898
/**
6899
* Unsets the designated parameter to the given int array.
6900
* This was set using <code>setMatchColumn</code>
6901
* as the column which will form the basis of the join.
6902
* <P>
6903
* The parameter value unset by this method should be same
6904
* as was set.
6905
*
6906
* @param columnIdxes the index into this rowset
6907
* object's internal representation of parameter values
6908
* @throws SQLException if an error occurs or the
6909
* parameter index is out of bounds or if the columnIdx is
6910
* not the same as set using <code>setMatchColumn(int [])</code>
6911
*/
6912
public void unsetMatchColumn(int[] columnIdxes) throws SQLException {
6913
6914
int i_val;
6915
for( int j= 0 ;j < columnIdxes.length; j++) {
6916
i_val = (Integer.parseInt(iMatchColumns.get(j).toString()));
6917
if(columnIdxes[j] != i_val) {
6918
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols").toString());
6919
}
6920
}
6921
6922
for( int i = 0;i < columnIdxes.length ;i++) {
6923
iMatchColumns.set(i, -1);
6924
}
6925
}
6926
6927
/**
6928
* Unsets the designated parameter to the given String array.
6929
* This was set using <code>setMatchColumn</code>
6930
* as the column which will form the basis of the join.
6931
* <P>
6932
* The parameter value unset by this method should be same
6933
* as was set.
6934
*
6935
* @param columnIdxes the index into this rowset
6936
* object's internal representation of parameter values
6937
* @throws SQLException if an error occurs or the
6938
* parameter index is out of bounds or if the columnName is
6939
* not the same as set using <code>setMatchColumn(String [])</code>
6940
*/
6941
public void unsetMatchColumn(String[] columnIdxes) throws SQLException {
6942
6943
for(int j = 0 ;j < columnIdxes.length; j++) {
6944
if( !columnIdxes[j].equals(strMatchColumns.get(j)) ){
6945
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols").toString());
6946
}
6947
}
6948
6949
for(int i = 0 ; i < columnIdxes.length; i++) {
6950
strMatchColumns.set(i,null);
6951
}
6952
}
6953
6954
/**
6955
* Retrieves the column name as <code>String</code> array
6956
* that was set using <code>setMatchColumn(String [])</code>
6957
* for this rowset.
6958
*
6959
* @return a <code>String</code> array object that contains the column names
6960
* for the rowset which has this the match columns
6961
*
6962
* @throws SQLException if an error occurs or column name is not set
6963
*/
6964
public String[] getMatchColumnNames() throws SQLException {
6965
6966
String []str_temp = new String[strMatchColumns.size()];
6967
6968
if( strMatchColumns.get(0) == null) {
6969
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.setmatchcols").toString());
6970
}
6971
6972
strMatchColumns.copyInto(str_temp);
6973
return str_temp;
6974
}
6975
6976
/**
6977
* Retrieves the column id as <code>int</code> array that was set using
6978
* <code>setMatchColumn(int [])</code> for this rowset.
6979
*
6980
* @return a <code>int</code> array object that contains the column ids
6981
* for the rowset which has this as the match columns.
6982
*
6983
* @throws SQLException if an error occurs or column index is not set
6984
*/
6985
public int[] getMatchColumnIndexes() throws SQLException {
6986
6987
Integer []int_temp = new Integer[iMatchColumns.size()];
6988
int [] i_temp = new int[iMatchColumns.size()];
6989
int i_val;
6990
6991
i_val = iMatchColumns.get(0);
6992
6993
if( i_val == -1 ) {
6994
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.setmatchcols").toString());
6995
}
6996
6997
6998
iMatchColumns.copyInto(int_temp);
6999
7000
for(int i = 0; i < int_temp.length; i++) {
7001
i_temp[i] = (int_temp[i]).intValue();
7002
}
7003
7004
return i_temp;
7005
}
7006
7007
/**
7008
* Sets the designated parameter to the given int array.
7009
* This forms the basis of the join for the
7010
* <code>JoinRowSet</code> as the column which will form the basis of the
7011
* join.
7012
* <P>
7013
* The parameter value set by this method is stored internally and
7014
* will be supplied as the appropriate parameter in this rowset's
7015
* command when the method <code>getMatchColumnIndexes</code> is called.
7016
*
7017
* @param columnIdxes the indexes into this rowset
7018
* object's internal representation of parameter values; the
7019
* first parameter is 0, the second is 1, and so on; must be
7020
* <code>0</code> or greater
7021
* @throws SQLException if an error occurs or the
7022
* parameter index is out of bounds
7023
*/
7024
public void setMatchColumn(int[] columnIdxes) throws SQLException {
7025
7026
for(int j = 0 ; j < columnIdxes.length; j++) {
7027
if( columnIdxes[j] < 0 ) {
7028
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols1").toString());
7029
}
7030
}
7031
for(int i = 0 ;i < columnIdxes.length; i++) {
7032
iMatchColumns.add(i,columnIdxes[i]);
7033
}
7034
}
7035
7036
/**
7037
* Sets the designated parameter to the given String array.
7038
* This forms the basis of the join for the
7039
* <code>JoinRowSet</code> as the column which will form the basis of the
7040
* join.
7041
* <P>
7042
* The parameter value set by this method is stored internally and
7043
* will be supplied as the appropriate parameter in this rowset's
7044
* command when the method <code>getMatchColumn</code> is called.
7045
*
7046
* @param columnNames the name of the column into this rowset
7047
* object's internal representation of parameter values
7048
* @throws SQLException if an error occurs or the
7049
* parameter index is out of bounds
7050
*/
7051
public void setMatchColumn(String[] columnNames) throws SQLException {
7052
7053
for(int j = 0; j < columnNames.length; j++) {
7054
if( columnNames[j] == null || columnNames[j].equals("")) {
7055
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols2").toString());
7056
}
7057
}
7058
for( int i = 0; i < columnNames.length; i++) {
7059
strMatchColumns.add(i,columnNames[i]);
7060
}
7061
}
7062
7063
7064
/**
7065
* Sets the designated parameter to the given <code>int</code>
7066
* object. This forms the basis of the join for the
7067
* <code>JoinRowSet</code> as the column which will form the basis of the
7068
* join.
7069
* <P>
7070
* The parameter value set by this method is stored internally and
7071
* will be supplied as the appropriate parameter in this rowset's
7072
* command when the method <code>getMatchColumn</code> is called.
7073
*
7074
* @param columnIdx the index into this rowset
7075
* object's internal representation of parameter values; the
7076
* first parameter is 0, the second is 1, and so on; must be
7077
* <code>0</code> or greater
7078
* @throws SQLException if an error occurs or the
7079
* parameter index is out of bounds
7080
*/
7081
public void setMatchColumn(int columnIdx) throws SQLException {
7082
// validate, if col is ok to be set
7083
if(columnIdx < 0) {
7084
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols1").toString());
7085
} else {
7086
// set iMatchColumn
7087
iMatchColumns.set(0, columnIdx);
7088
//strMatchColumn = null;
7089
}
7090
}
7091
7092
/**
7093
* Sets the designated parameter to the given <code>String</code>
7094
* object. This forms the basis of the join for the
7095
* <code>JoinRowSet</code> as the column which will form the basis of the
7096
* join.
7097
* <P>
7098
* The parameter value set by this method is stored internally and
7099
* will be supplied as the appropriate parameter in this rowset's
7100
* command when the method <code>getMatchColumn</code> is called.
7101
*
7102
* @param columnName the name of the column into this rowset
7103
* object's internal representation of parameter values
7104
* @throws SQLException if an error occurs or the
7105
* parameter index is out of bounds
7106
*/
7107
public void setMatchColumn(String columnName) throws SQLException {
7108
// validate, if col is ok to be set
7109
if(columnName == null || (columnName= columnName.trim()).equals("") ) {
7110
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols2").toString());
7111
} else {
7112
// set strMatchColumn
7113
strMatchColumns.set(0, columnName);
7114
//iMatchColumn = -1;
7115
}
7116
}
7117
7118
/**
7119
* Unsets the designated parameter to the given <code>int</code>
7120
* object. This was set using <code>setMatchColumn</code>
7121
* as the column which will form the basis of the join.
7122
* <P>
7123
* The parameter value unset by this method should be same
7124
* as was set.
7125
*
7126
* @param columnIdx the index into this rowset
7127
* object's internal representation of parameter values
7128
* @throws SQLException if an error occurs or the
7129
* parameter index is out of bounds or if the columnIdx is
7130
* not the same as set using <code>setMatchColumn(int)</code>
7131
*/
7132
public void unsetMatchColumn(int columnIdx) throws SQLException {
7133
// check if we are unsetting the SAME column
7134
if(! iMatchColumns.get(0).equals(Integer.valueOf(columnIdx) ) ) {
7135
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch").toString());
7136
} else if(strMatchColumns.get(0) != null) {
7137
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch1").toString());
7138
} else {
7139
// that is, we are unsetting it.
7140
iMatchColumns.set(0, -1);
7141
}
7142
}
7143
7144
/**
7145
* Unsets the designated parameter to the given <code>String</code>
7146
* object. This was set using <code>setMatchColumn</code>
7147
* as the column which will form the basis of the join.
7148
* <P>
7149
* The parameter value unset by this method should be same
7150
* as was set.
7151
*
7152
* @param columnName the index into this rowset
7153
* object's internal representation of parameter values
7154
* @throws SQLException if an error occurs or the
7155
* parameter index is out of bounds or if the columnName is
7156
* not the same as set using <code>setMatchColumn(String)</code>
7157
*/
7158
public void unsetMatchColumn(String columnName) throws SQLException {
7159
// check if we are unsetting the same column
7160
columnName = columnName.trim();
7161
7162
if(!((strMatchColumns.get(0)).equals(columnName))) {
7163
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch").toString());
7164
} else if(iMatchColumns.get(0) > 0) {
7165
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch2").toString());
7166
} else {
7167
strMatchColumns.set(0, null); // that is, we are unsetting it.
7168
}
7169
}
7170
7171
/**
7172
* Notifies registered listeners that a RowSet object in the given RowSetEvent
7173
* object has populated a number of additional rows. The <code>numRows</code> parameter
7174
* ensures that this event will only be fired every <code>numRow</code>.
7175
* <p>
7176
* The source of the event can be retrieved with the method event.getSource.
7177
*
7178
* @param event a <code>RowSetEvent</code> object that contains the
7179
* <code>RowSet</code> object that is the source of the events
7180
* @param numRows when populating, the number of rows interval on which the
7181
* <code>CachedRowSet</code> populated should fire; the default value
7182
* is zero; cannot be less than <code>fetchSize</code> or zero
7183
*/
7184
public void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException {
7185
7186
if( numRows < 0 || numRows < getFetchSize()) {
7187
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.numrows").toString());
7188
}
7189
7190
if(size() % numRows == 0) {
7191
RowSetEvent event_temp = new RowSetEvent(this);
7192
event = event_temp;
7193
notifyRowSetChanged();
7194
}
7195
}
7196
7197
/**
7198
* Populates this <code>CachedRowSet</code> object with data from
7199
* the given <code>ResultSet</code> object. While related to the <code>populate(ResultSet)</code>
7200
* method, an additional parameter is provided to allow starting position within
7201
* the <code>ResultSet</code> from where to populate the CachedRowSet
7202
* instance.
7203
*
7204
* This method is an alternative to the method <code>execute</code>
7205
* for filling the rowset with data. The method <code>populate</code>
7206
* does not require that the properties needed by the method
7207
* <code>execute</code>, such as the <code>command</code> property,
7208
* be set. This is true because the method <code>populate</code>
7209
* is given the <code>ResultSet</code> object from
7210
* which to get data and thus does not need to use the properties
7211
* required for setting up a connection and executing this
7212
* <code>CachedRowSetImpl</code> object's command.
7213
* <P>
7214
* After populating this rowset with data, the method
7215
* <code>populate</code> sets the rowset's metadata and
7216
* then sends a <code>RowSetChangedEvent</code> object
7217
* to all registered listeners prior to returning.
7218
*
7219
* @param data the <code>ResultSet</code> object containing the data
7220
* to be read into this <code>CachedRowSetImpl</code> object
7221
* @param start the integer specifing the position in the
7222
* <code>ResultSet</code> object to popultate the
7223
* <code>CachedRowSetImpl</code> object.
7224
* @throws SQLException if an error occurs; or the max row setting is
7225
* violated while populating the RowSet.Also id the start position
7226
* is negative.
7227
* @see #execute
7228
*/
7229
public void populate(ResultSet data, int start) throws SQLException{
7230
7231
int rowsFetched;
7232
Row currentRow;
7233
int numCols;
7234
int i;
7235
Map<String, Class<?>> map = getTypeMap();
7236
Object obj;
7237
int mRows;
7238
7239
cursorPos = 0;
7240
if(populatecallcount == 0){
7241
if(start < 0){
7242
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.startpos").toString());
7243
}
7244
if(getMaxRows() == 0){
7245
data.absolute(start);
7246
while(data.next()){
7247
totalRows++;
7248
}
7249
totalRows++;
7250
}
7251
startPos = start;
7252
}
7253
populatecallcount = populatecallcount +1;
7254
resultSet = data;
7255
if((endPos - startPos) >= getMaxRows() && (getMaxRows() > 0)){
7256
endPos = prevEndPos;
7257
pagenotend = false;
7258
return;
7259
}
7260
7261
if((maxRowsreached != getMaxRows() || maxRowsreached != totalRows) && pagenotend) {
7262
startPrev = start - getPageSize();
7263
}
7264
7265
if( pageSize == 0){
7266
prevEndPos = endPos;
7267
endPos = start + getMaxRows() ;
7268
}
7269
else{
7270
prevEndPos = endPos;
7271
endPos = start + getPageSize();
7272
}
7273
7274
7275
if (start == 1){
7276
resultSet.beforeFirst();
7277
}
7278
else {
7279
resultSet.absolute(start -1);
7280
}
7281
if( pageSize == 0) {
7282
rvh = new Vector<Object>(getMaxRows());
7283
7284
}
7285
else{
7286
rvh = new Vector<Object>(getPageSize());
7287
}
7288
7289
if (data == null) {
7290
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.populate").toString());
7291
}
7292
7293
// get the meta data for this ResultSet
7294
RSMD = data.getMetaData();
7295
7296
// set up the metadata
7297
RowSetMD = new RowSetMetaDataImpl();
7298
initMetaData(RowSetMD, RSMD);
7299
7300
// release the meta-data so that aren't tempted to use it.
7301
RSMD = null;
7302
numCols = RowSetMD.getColumnCount();
7303
mRows = this.getMaxRows();
7304
rowsFetched = 0;
7305
currentRow = null;
7306
7307
if(!data.next() && mRows == 0){
7308
endPos = prevEndPos;
7309
pagenotend = false;
7310
return;
7311
}
7312
7313
data.previous();
7314
7315
while ( data.next()) {
7316
7317
currentRow = new Row(numCols);
7318
if(pageSize == 0){
7319
if ( rowsFetched >= mRows && mRows > 0) {
7320
rowsetWarning.setNextException(new SQLException("Populating rows "
7321
+ "setting has exceeded max row setting"));
7322
break;
7323
}
7324
}
7325
else {
7326
if ( (rowsFetched >= pageSize) ||( maxRowsreached >= mRows && mRows > 0)) {
7327
rowsetWarning.setNextException(new SQLException("Populating rows "
7328
+ "setting has exceeded max row setting"));
7329
break;
7330
}
7331
}
7332
7333
for ( i = 1; i <= numCols; i++) {
7334
/*
7335
* check if the user has set a map. If no map
7336
* is set then use plain getObject. This lets
7337
* us work with drivers that do not support
7338
* getObject with a map in fairly sensible way
7339
*/
7340
if (map == null) {
7341
obj = data.getObject(i);
7342
} else {
7343
obj = data.getObject(i, map);
7344
}
7345
/*
7346
* the following block checks for the various
7347
* types that we have to serialize in order to
7348
* store - right now only structs have been tested
7349
*/
7350
if (obj instanceof Struct) {
7351
obj = new SerialStruct((Struct)obj, map);
7352
} else if (obj instanceof SQLData) {
7353
obj = new SerialStruct((SQLData)obj, map);
7354
} else if (obj instanceof Blob) {
7355
obj = new SerialBlob((Blob)obj);
7356
} else if (obj instanceof Clob) {
7357
obj = new SerialClob((Clob)obj);
7358
} else if (obj instanceof java.sql.Array) {
7359
obj = new SerialArray((java.sql.Array)obj, map);
7360
}
7361
7362
currentRow.initColumnObject(i, obj);
7363
}
7364
rowsFetched++;
7365
maxRowsreached++;
7366
rvh.add(currentRow);
7367
}
7368
numRows = rowsFetched ;
7369
// Also rowsFetched should be equal to rvh.size()
7370
// notify any listeners that the rowset has changed
7371
notifyRowSetChanged();
7372
7373
}
7374
7375
/**
7376
* The nextPage gets the next page, that is a <code>CachedRowSetImpl</code> object
7377
* containing the number of rows specified by page size.
7378
* @return boolean value true indicating whether there are more pages to come and
7379
* false indicating that this is the last page.
7380
* @throws SQLException if an error occurs or this called before calling populate.
7381
*/
7382
public boolean nextPage() throws SQLException {
7383
7384
if (populatecallcount == 0){
7385
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.nextpage").toString());
7386
}
7387
// Fix for 6554186
7388
onFirstPage = false;
7389
if(callWithCon){
7390
crsReader.setStartPosition(endPos);
7391
crsReader.readData((RowSetInternal)this);
7392
resultSet = null;
7393
}
7394
else {
7395
populate(resultSet,endPos);
7396
}
7397
return pagenotend;
7398
}
7399
7400
/**
7401
* This is the setter function for setting the size of the page, which specifies
7402
* how many rows have to be retrived at a time.
7403
*
7404
* @param size which is the page size
7405
* @throws SQLException if size is less than zero or greater than max rows.
7406
*/
7407
public void setPageSize (int size) throws SQLException {
7408
if (size < 0) {
7409
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.pagesize").toString());
7410
}
7411
if (size > getMaxRows() && getMaxRows() != 0) {
7412
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.pagesize1").toString());
7413
}
7414
pageSize = size;
7415
}
7416
7417
/**
7418
* This is the getter function for the size of the page.
7419
*
7420
* @return an integer that is the page size.
7421
*/
7422
public int getPageSize() {
7423
return pageSize;
7424
}
7425
7426
7427
/**
7428
* Retrieves the data present in the page prior to the page from where it is
7429
* called.
7430
* @return boolean value true if it retrieves the previous page, flase if it
7431
* is on the first page.
7432
* @throws SQLException if it is called before populate is called or ResultSet
7433
* is of type <code>ResultSet.TYPE_FORWARD_ONLY</code> or if an error
7434
* occurs.
7435
*/
7436
public boolean previousPage() throws SQLException {
7437
int pS;
7438
int mR;
7439
int rem;
7440
7441
pS = getPageSize();
7442
mR = maxRowsreached;
7443
7444
if (populatecallcount == 0){
7445
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.nextpage").toString());
7446
}
7447
7448
if( !callWithCon){
7449
if(resultSet.getType() == ResultSet.TYPE_FORWARD_ONLY){
7450
throw new SQLException (resBundle.handleGetObject("cachedrowsetimpl.fwdonly").toString());
7451
}
7452
}
7453
7454
pagenotend = true;
7455
7456
if(startPrev < startPos ){
7457
onFirstPage = true;
7458
return false;
7459
}
7460
7461
if(onFirstPage){
7462
return false;
7463
}
7464
7465
rem = mR % pS;
7466
7467
if(rem == 0){
7468
maxRowsreached -= (2 * pS);
7469
if(callWithCon){
7470
crsReader.setStartPosition(startPrev);
7471
crsReader.readData((RowSetInternal)this);
7472
resultSet = null;
7473
}
7474
else {
7475
populate(resultSet,startPrev);
7476
}
7477
return true;
7478
}
7479
else
7480
{
7481
maxRowsreached -= (pS + rem);
7482
if(callWithCon){
7483
crsReader.setStartPosition(startPrev);
7484
crsReader.readData((RowSetInternal)this);
7485
resultSet = null;
7486
}
7487
else {
7488
populate(resultSet,startPrev);
7489
}
7490
return true;
7491
}
7492
}
7493
7494
/**
7495
* Goes to the page number passed as the parameter
7496
* @param page , the page loaded on a call to this function
7497
* @return true if the page exists false otherwise
7498
* @throws SQLException if an error occurs
7499
*/
7500
/*
7501
public boolean absolutePage(int page) throws SQLException{
7502
7503
boolean isAbs = true, retVal = true;
7504
int counter;
7505
7506
if( page <= 0 ){
7507
throw new SQLException("Absolute positoin is invalid");
7508
}
7509
counter = 0;
7510
7511
firstPage();
7512
counter++;
7513
while((counter < page) && isAbs) {
7514
isAbs = nextPage();
7515
counter ++;
7516
}
7517
7518
if( !isAbs && counter < page){
7519
retVal = false;
7520
}
7521
else if(counter == page){
7522
retVal = true;
7523
}
7524
7525
return retVal;
7526
}
7527
*/
7528
7529
7530
/**
7531
* Goes to the page number passed as the parameter from the current page.
7532
* The parameter can take postive or negative value accordingly.
7533
* @param page , the page loaded on a call to this function
7534
* @return true if the page exists false otherwise
7535
* @throws SQLException if an error occurs
7536
*/
7537
/*
7538
public boolean relativePage(int page) throws SQLException {
7539
7540
boolean isRel = true,retVal = true;
7541
int counter;
7542
7543
if(page > 0){
7544
counter = 0;
7545
while((counter < page) && isRel){
7546
isRel = nextPage();
7547
counter++;
7548
}
7549
7550
if(!isRel && counter < page){
7551
retVal = false;
7552
}
7553
else if( counter == page){
7554
retVal = true;
7555
}
7556
return retVal;
7557
}
7558
else {
7559
counter = page;
7560
isRel = true;
7561
while((counter < 0) && isRel){
7562
isRel = previousPage();
7563
counter++;
7564
}
7565
7566
if( !isRel && counter < 0){
7567
retVal = false;
7568
}
7569
else if(counter == 0){
7570
retVal = true;
7571
}
7572
return retVal;
7573
}
7574
}
7575
*/
7576
7577
/**
7578
* Retrieves the first page of data as specified by the page size.
7579
* @return boolean value true if present on first page, false otherwise
7580
* @throws SQLException if it called before populate or ResultSet is of
7581
* type <code>ResultSet.TYPE_FORWARD_ONLY</code> or an error occurs
7582
*/
7583
/*
7584
public boolean firstPage() throws SQLException {
7585
if (populatecallcount == 0){
7586
throw new SQLException("Populate the data before calling ");
7587
}
7588
if( !callWithCon){
7589
if(resultSet.getType() == ResultSet.TYPE_FORWARD_ONLY) {
7590
throw new SQLException("Result of type forward only");
7591
}
7592
}
7593
endPos = 0;
7594
maxRowsreached = 0;
7595
pagenotend = true;
7596
if(callWithCon){
7597
crsReader.setStartPosition(startPos);
7598
crsReader.readData((RowSetInternal)this);
7599
resultSet = null;
7600
}
7601
else {
7602
populate(resultSet,startPos);
7603
}
7604
onFirstPage = true;
7605
return onFirstPage;
7606
}
7607
*/
7608
7609
/**
7610
* Retrives the last page of data as specified by the page size.
7611
* @return boolean value tur if present on the last page, false otherwise
7612
* @throws SQLException if called before populate or if an error occurs.
7613
*/
7614
/*
7615
public boolean lastPage() throws SQLException{
7616
int pS;
7617
int mR;
7618
int quo;
7619
int rem;
7620
7621
pS = getPageSize();
7622
mR = getMaxRows();
7623
7624
if(pS == 0){
7625
onLastPage = true;
7626
return onLastPage;
7627
}
7628
7629
if(getMaxRows() == 0){
7630
mR = totalRows;
7631
}
7632
7633
if (populatecallcount == 0){
7634
throw new SQLException("Populate the data before calling ");
7635
}
7636
7637
onFirstPage = false;
7638
7639
if((mR % pS) == 0){
7640
quo = mR / pS;
7641
int start = startPos + (pS * (quo - 1));
7642
maxRowsreached = mR - pS;
7643
if(callWithCon){
7644
crsReader.setStartPosition(start);
7645
crsReader.readData((RowSetInternal)this);
7646
resultSet = null;
7647
}
7648
else {
7649
populate(resultSet,start);
7650
}
7651
onLastPage = true;
7652
return onLastPage;
7653
}
7654
else {
7655
quo = mR /pS;
7656
rem = mR % pS;
7657
int start = startPos + (pS * quo);
7658
maxRowsreached = mR - (rem);
7659
if(callWithCon){
7660
crsReader.setStartPosition(start);
7661
crsReader.readData((RowSetInternal)this);
7662
resultSet = null;
7663
}
7664
else {
7665
populate(resultSet,start);
7666
}
7667
onLastPage = true;
7668
return onLastPage;
7669
}
7670
}
7671
*/
7672
7673
/**
7674
* Sets the status for the row on which the cursor is positioned. The insertFlag is used
7675
* to mention the toggle status for this row
7676
* @param insertFlag if it is true - marks this row as inserted
7677
* if it is false - marks it as not a newly inserted row
7678
* @throws SQLException if an error occurs while doing this operation
7679
*/
7680
public void setRowInserted(boolean insertFlag) throws SQLException {
7681
7682
checkCursor();
7683
7684
if(onInsertRow == true)
7685
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidop").toString());
7686
7687
if( insertFlag ) {
7688
((Row)getCurrentRow()).setInserted();
7689
} else {
7690
((Row)getCurrentRow()).clearInserted();
7691
}
7692
}
7693
7694
/**
7695
* Retrieves the value of the designated <code>SQL XML</code> parameter as a
7696
* <code>SQLXML</code> object in the Java programming language.
7697
* @param columnIndex the first column is 1, the second is 2, ...
7698
* @return a SQLXML object that maps an SQL XML value
7699
* @throws SQLException if a database access error occurs
7700
* @since 6.0
7701
*/
7702
public SQLXML getSQLXML(int columnIndex) throws SQLException {
7703
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7704
}
7705
7706
/**
7707
* Retrieves the value of the designated <code>SQL XML</code> parameter as a
7708
* <code>SQLXML</code> object in the Java programming language.
7709
* @param colName the name of the column from which to retrieve the value
7710
* @return a SQLXML object that maps an SQL XML value
7711
* @throws SQLException if a database access error occurs
7712
*/
7713
public SQLXML getSQLXML(String colName) throws SQLException {
7714
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7715
}
7716
7717
/**
7718
* Retrieves the value of the designated column in the current row of this
7719
* <code>ResultSet</code> object as a java.sql.RowId object in the Java
7720
* programming language.
7721
*
7722
* @param columnIndex the first column is 1, the second 2, ...
7723
* @return the column value if the value is a SQL <code>NULL</code> the
7724
* value returned is <code>null</code>
7725
* @throws SQLException if a database access error occurs
7726
* @since 6.0
7727
*/
7728
public RowId getRowId(int columnIndex) throws SQLException {
7729
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7730
}
7731
7732
/**
7733
* Retrieves the value of the designated column in the current row of this
7734
* <code>ResultSet</code> object as a java.sql.RowId object in the Java
7735
* programming language.
7736
*
7737
* @param columnName the name of the column
7738
* @return the column value if the value is a SQL <code>NULL</code> the
7739
* value returned is <code>null</code>
7740
* @throws SQLException if a database access error occurs
7741
* @since 6.0
7742
*/
7743
public RowId getRowId(String columnName) throws SQLException {
7744
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7745
}
7746
7747
/**
7748
* Updates the designated column with a <code>RowId</code> value. The updater
7749
* methods are used to update column values in the current row or the insert
7750
* row. The updater methods do not update the underlying database; instead
7751
* the <code>updateRow<code> or <code>insertRow</code> methods are called
7752
* to update the database.
7753
*
7754
* @param columnIndex the first column is 1, the second 2, ...
7755
* @param x the column value
7756
* @throws SQLException if a database access occurs
7757
* @since 6.0
7758
*/
7759
public void updateRowId(int columnIndex, RowId x) throws SQLException {
7760
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7761
}
7762
7763
/**
7764
* Updates the designated column with a <code>RowId</code> value. The updater
7765
* methods are used to update column values in the current row or the insert
7766
* row. The updater methods do not update the underlying database; instead
7767
* the <code>updateRow<code> or <code>insertRow</code> methods are called
7768
* to update the database.
7769
*
7770
* @param columnName the name of the column
7771
* @param x the column value
7772
* @throws SQLException if a database access occurs
7773
* @since 6.0
7774
*/
7775
public void updateRowId(String columnName, RowId x) throws SQLException {
7776
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7777
}
7778
7779
/**
7780
* Retrieves the holdability of this ResultSet object
7781
* @return either ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
7782
* @throws SQLException if a database error occurs
7783
* @since 6.0
7784
*/
7785
public int getHoldability() throws SQLException {
7786
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7787
}
7788
7789
/**
7790
* Retrieves whether this ResultSet object has been closed. A ResultSet is closed if the
7791
* method close has been called on it, or if it is automatically closed.
7792
* @return true if this ResultSet object is closed; false if it is still open
7793
* @throws SQLException if a database access error occurs
7794
* @since 6.0
7795
*/
7796
public boolean isClosed() throws SQLException {
7797
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7798
}
7799
7800
/**
7801
* This method is used for updating columns that support National Character sets.
7802
* It can be used for updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
7803
* @param columnIndex the first column is 1, the second 2, ...
7804
* @param nString the value for the column to be updated
7805
* @throws SQLException if a database access error occurs
7806
* @since 6.0
7807
*/
7808
public void updateNString(int columnIndex, String nString) throws SQLException {
7809
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7810
}
7811
7812
/**
7813
* This method is used for updating columns that support National Character sets.
7814
* It can be used for updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
7815
* @param columnName name of the Column
7816
* @param nString the value for the column to be updated
7817
* @throws SQLException if a database access error occurs
7818
* @since 6.0
7819
*/
7820
public void updateNString(String columnName, String nString) throws SQLException {
7821
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7822
}
7823
7824
7825
/*o
7826
* This method is used for updating SQL <code>NCLOB</code> type that maps
7827
* to <code>java.sql.Types.NCLOB</code>
7828
* @param columnIndex the first column is 1, the second 2, ...
7829
* @param nClob the value for the column to be updated
7830
* @throws SQLException if a database access error occurs
7831
* @since 6.0
7832
*/
7833
public void updateNClob(int columnIndex, NClob nClob) throws SQLException {
7834
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7835
}
7836
7837
/**
7838
* This method is used for updating SQL <code>NCLOB</code> type that maps
7839
* to <code>java.sql.Types.NCLOB</code>
7840
* @param columnName name of the column
7841
* @param nClob the value for the column to be updated
7842
* @throws SQLException if a database access error occurs
7843
* @since 6.0
7844
*/
7845
public void updateNClob(String columnName, NClob nClob) throws SQLException {
7846
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7847
}
7848
7849
/**
7850
* Retrieves the value of the designated column in the current row
7851
* of this <code>ResultSet</code> object as a <code>NClob</code> object
7852
* in the Java programming language.
7853
*
7854
* @param i the first column is 1, the second is 2, ...
7855
* @return a <code>NClob</code> object representing the SQL
7856
* <code>NCLOB</code> value in the specified column
7857
* @exception SQLException if a database access error occurs
7858
* @since 6.0
7859
*/
7860
public NClob getNClob(int i) throws SQLException {
7861
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7862
}
7863
7864
7865
/**
7866
* Retrieves the value of the designated column in the current row
7867
* of this <code>ResultSet</code> object as a <code>NClob</code> object
7868
* in the Java programming language.
7869
*
7870
* @param colName the name of the column from which to retrieve the value
7871
* @return a <code>NClob</code> object representing the SQL <code>NCLOB</code>
7872
* value in the specified column
7873
* @exception SQLException if a database access error occurs
7874
* @since 6.0
7875
*/
7876
public NClob getNClob(String colName) throws SQLException {
7877
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7878
}
7879
7880
public <T> T unwrap(java.lang.Class<T> iface) throws java.sql.SQLException {
7881
return null;
7882
}
7883
7884
public boolean isWrapperFor(Class<?> interfaces) throws SQLException {
7885
return false;
7886
}
7887
7888
7889
/**
7890
* Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver converts this to an
7891
* SQL <code>XML</code> value when it sends it to the database.
7892
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
7893
* @param xmlObject a <code>SQLXML</code> object that maps an SQL <code>XML</code> value
7894
* @throws SQLException if a database access error occurs
7895
* @since 1.6
7896
*/
7897
public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException {
7898
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7899
}
7900
7901
/**
7902
* Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver converts this to an
7903
* <code>SQL XML</code> value when it sends it to the database.
7904
* @param parameterName the name of the parameter
7905
* @param xmlObject a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
7906
* @throws SQLException if a database access error occurs
7907
* @since 1.6
7908
*/
7909
public void setSQLXML(String parameterName, SQLXML xmlObject) throws SQLException {
7910
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7911
}
7912
7913
7914
/**
7915
* Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
7916
* driver converts this to a SQL <code>ROWID</code> value when it sends it
7917
* to the database
7918
*
7919
* @param parameterIndex the first parameter is 1, the second is 2, ...
7920
* @param x the parameter value
7921
* @throws SQLException if a database access error occurs
7922
*
7923
* @since 1.6
7924
*/
7925
public void setRowId(int parameterIndex, RowId x) throws SQLException {
7926
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7927
}
7928
7929
7930
/**
7931
* Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
7932
* driver converts this to a SQL <code>ROWID</code> when it sends it to the
7933
* database.
7934
*
7935
* @param parameterName the name of the parameter
7936
* @param x the parameter value
7937
* @throws SQLException if a database access error occurs
7938
* @since 1.6
7939
*/
7940
public void setRowId(String parameterName, RowId x) throws SQLException {
7941
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7942
}
7943
7944
7945
/**
7946
* Sets the designated parameter to a <code>Reader</code> object. The
7947
* <code>Reader</code> reads the data till end-of-file is reached. The
7948
* driver does the necessary conversion from Java character format to
7949
* the national character set in the database.
7950
7951
* <P><B>Note:</B> This stream object can either be a standard
7952
* Java stream object or your own subclass that implements the
7953
* standard interface.
7954
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
7955
* it might be more efficient to use a version of
7956
* <code>setNCharacterStream</code> which takes a length parameter.
7957
*
7958
* @param parameterIndex of the first parameter is 1, the second is 2, ...
7959
* @param value the parameter value
7960
* @throws SQLException if the driver does not support national
7961
* character sets; if the driver can detect that a data conversion
7962
* error could occur ; if a database access error occurs; or
7963
* this method is called on a closed <code>PreparedStatement</code>
7964
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
7965
* @since 1.6
7966
*/
7967
public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException {
7968
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
7969
}
7970
7971
7972
/**
7973
* Sets the designated parameter to a <code>java.sql.NClob</code> object. The object
7974
* implements the <code>java.sql.NClob</code> interface. This <code>NClob</code>
7975
* object maps to a SQL <code>NCLOB</code>.
7976
* @param parameterName the name of the column to be set
7977
* @param value the parameter value
7978
* @throws SQLException if the driver does not support national
7979
* character sets; if the driver can detect that a data conversion
7980
* error could occur; or if a database access error occurs
7981
* @since 1.6
7982
*/
7983
public void setNClob(String parameterName, NClob value) throws SQLException {
7984
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
7985
}
7986
7987
7988
/**
7989
* Retrieves the value of the designated column in the current row
7990
* of this <code>ResultSet</code> object as a
7991
* <code>java.io.Reader</code> object.
7992
* It is intended for use when
7993
* accessing <code>NCHAR</code>,<code>NVARCHAR</code>
7994
* and <code>LONGNVARCHAR</code> columns.
7995
*
7996
* @return a <code>java.io.Reader</code> object that contains the column
7997
* value; if the value is SQL <code>NULL</code>, the value returned is
7998
* <code>null</code> in the Java programming language.
7999
* @param columnIndex the first column is 1, the second is 2, ...
8000
* @exception SQLException if a database access error occurs
8001
* @since 1.6
8002
*/
8003
public java.io.Reader getNCharacterStream(int columnIndex) throws SQLException {
8004
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
8005
}
8006
8007
8008
/**
8009
* Retrieves the value of the designated column in the current row
8010
* of this <code>ResultSet</code> object as a
8011
* <code>java.io.Reader</code> object.
8012
* It is intended for use when
8013
* accessing <code>NCHAR</code>,<code>NVARCHAR</code>
8014
* and <code>LONGNVARCHAR</code> columns.
8015
*
8016
* @param columnName the name of the column
8017
* @return a <code>java.io.Reader</code> object that contains the column
8018
* value; if the value is SQL <code>NULL</code>, the value returned is
8019
* <code>null</code> in the Java programming language
8020
* @exception SQLException if a database access error occurs
8021
* @since 1.6
8022
*/
8023
public java.io.Reader getNCharacterStream(String columnName) throws SQLException {
8024
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
8025
}
8026
8027
8028
/**
8029
* Updates the designated column with a <code>java.sql.SQLXML</code> value.
8030
* The updater
8031
* methods are used to update column values in the current row or the insert
8032
* row. The updater methods do not update the underlying database; instead
8033
* the <code>updateRow</code> or <code>insertRow</code> methods are called
8034
* to update the database.
8035
* @param columnIndex the first column is 1, the second 2, ...
8036
* @param xmlObject the value for the column to be updated
8037
* @throws SQLException if a database access error occurs
8038
* @since 1.6
8039
*/
8040
public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException {
8041
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
8042
}
8043
8044
/**
8045
* Updates the designated column with a <code>java.sql.SQLXML</code> value.
8046
* The updater
8047
* methods are used to update column values in the current row or the insert
8048
* row. The updater methods do not update the underlying database; instead
8049
* the <code>updateRow</code> or <code>insertRow</code> methods are called
8050
* to update the database.
8051
*
8052
* @param columnName the name of the column
8053
* @param xmlObject the column value
8054
* @throws SQLException if a database access occurs
8055
* @since 1.6
8056
*/
8057
public void updateSQLXML(String columnName, SQLXML xmlObject) throws SQLException {
8058
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
8059
}
8060
8061
/**
8062
* Retrieves the value of the designated column in the current row
8063
* of this <code>ResultSet</code> object as
8064
* a <code>String</code> in the Java programming language.
8065
* It is intended for use when
8066
* accessing <code>NCHAR</code>,<code>NVARCHAR</code>
8067
* and <code>LONGNVARCHAR</code> columns.
8068
*
8069
* @param columnIndex the first column is 1, the second is 2, ...
8070
* @return the column value; if the value is SQL <code>NULL</code>, the
8071
* value returned is <code>null</code>
8072
* @exception SQLException if a database access error occurs
8073
* @since 1.6
8074
*/
8075
public String getNString(int columnIndex) throws SQLException {
8076
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
8077
}
8078
8079
/**
8080
* Retrieves the value of the designated column in the current row
8081
* of this <code>ResultSet</code> object as
8082
* a <code>String</code> in the Java programming language.
8083
* It is intended for use when
8084
* accessing <code>NCHAR</code>,<code>NVARCHAR</code>
8085
* and <code>LONGNVARCHAR</code> columns.
8086
*
8087
* @param columnName the SQL name of the column
8088
* @return the column value; if the value is SQL <code>NULL</code>, the
8089
* value returned is <code>null</code>
8090
* @exception SQLException if a database access error occurs
8091
* @since 1.6
8092
*/
8093
public String getNString(String columnName) throws SQLException {
8094
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
8095
}
8096
8097
/**
8098
* Updates the designated column with a character stream value, which will
8099
* have the specified number of bytes. The driver does the necessary conversion
8100
* from Java character format to the national character set in the database.
8101
* It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
8102
* The updater methods are used to update column values in the current row or
8103
* the insert row. The updater methods do not update the underlying database;
8104
* instead the updateRow or insertRow methods are called to update the database.
8105
*
8106
* @param columnIndex - the first column is 1, the second is 2, ...
8107
* @param x - the new column value
8108
* @param length - the length of the stream
8109
* @exception SQLException if a database access error occurs
8110
* @since 1.6
8111
*/
8112
public void updateNCharacterStream(int columnIndex,
8113
java.io.Reader x,
8114
long length)
8115
throws SQLException {
8116
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
8117
}
8118
8119
/**
8120
* Updates the designated column with a character stream value, which will
8121
* have the specified number of bytes. The driver does the necessary conversion
8122
* from Java character format to the national character set in the database.
8123
* It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
8124
* The updater methods are used to update column values in the current row or
8125
* the insert row. The updater methods do not update the underlying database;
8126
* instead the updateRow or insertRow methods are called to update the database.
8127
*
8128
* @param columnName - name of the Column
8129
* @param x - the new column value
8130
* @param length - the length of the stream
8131
* @exception SQLException if a database access error occurs
8132
* @since 1.6
8133
*/
8134
public void updateNCharacterStream(String columnName,
8135
java.io.Reader x,
8136
long length)
8137
throws SQLException {
8138
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.opnotysupp").toString());
8139
}
8140
8141
/**
8142
* Updates the designated column with a character stream value. The
8143
* driver does the necessary conversion from Java character format to
8144
* the national character set in the database.
8145
* It is intended for use when
8146
* updating <code>NCHAR</code>,<code>NVARCHAR</code>
8147
* and <code>LONGNVARCHAR</code> columns.
8148
*
8149
* The updater methods are used to update column values in the
8150
* current row or the insert row. The updater methods do not
8151
* update the underlying database; instead the <code>updateRow</code> or
8152
* <code>insertRow</code> methods are called to update the database.
8153
*
8154
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8155
* it might be more efficient to use a version of
8156
* <code>updateNCharacterStream</code> which takes a length parameter.
8157
*
8158
* @param columnIndex the first column is 1, the second is 2, ...
8159
* @param x the new column value
8160
* @exception SQLException if a database access error occurs,
8161
* the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
8162
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8163
* this method
8164
* @since 1.6
8165
*/
8166
public void updateNCharacterStream(int columnIndex,
8167
java.io.Reader x) throws SQLException {
8168
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8169
}
8170
8171
/**
8172
* Updates the designated column with a character stream value. The
8173
* driver does the necessary conversion from Java character format to
8174
* the national character set in the database.
8175
* It is intended for use when
8176
* updating <code>NCHAR</code>,<code>NVARCHAR</code>
8177
* and <code>LONGNVARCHAR</code> columns.
8178
*
8179
* The updater methods are used to update column values in the
8180
* current row or the insert row. The updater methods do not
8181
* update the underlying database; instead the <code>updateRow</code> or
8182
* <code>insertRow</code> methods are called to update the database.
8183
*
8184
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8185
* it might be more efficient to use a version of
8186
* <code>updateNCharacterStream</code> which takes a length parameter.
8187
*
8188
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
8189
bel is the name of the column
8190
* @param reader the <code>java.io.Reader</code> object containing
8191
* the new column value
8192
* @exception SQLException if a database access error occurs,
8193
* the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
8194
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8195
* this method
8196
* @since 1.6
8197
*/
8198
public void updateNCharacterStream(String columnLabel,
8199
java.io.Reader reader) throws SQLException {
8200
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8201
}
8202
8203
//////////////////////////
8204
8205
/**
8206
* Updates the designated column using the given input stream, which
8207
* will have the specified number of bytes.
8208
* When a very large ASCII value is input to a <code>LONGVARCHAR</code>
8209
* parameter, it may be more practical to send it via a
8210
* <code>java.io.InputStream</code>. Data will be read from the stream
8211
* as needed until end-of-file is reached. The JDBC driver will
8212
* do any necessary conversion from ASCII to the database char format.
8213
*
8214
* <P><B>Note:</B> This stream object can either be a standard
8215
* Java stream object or your own subclass that implements the
8216
* standard interface.
8217
* <p>
8218
* The updater methods are used to update column values in the
8219
* current row or the insert row. The updater methods do not
8220
* update the underlying database; instead the <code>updateRow</code> or
8221
* <code>insertRow</code> methods are called to update the database.
8222
*
8223
* @param columnIndex the first column is 1, the second is 2, ...
8224
* @param inputStream An object that contains the data to set the parameter
8225
* value to.
8226
* @param length the number of bytes in the parameter data.
8227
* @exception SQLException if a database access error occurs,
8228
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8229
* or this method is called on a closed result set
8230
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8231
* this method
8232
* @since 1.6
8233
*/
8234
public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException{
8235
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8236
}
8237
8238
/**
8239
* Updates the designated column using the given input stream, which
8240
* will have the specified number of bytes.
8241
* When a very large ASCII value is input to a <code>LONGVARCHAR</code>
8242
* parameter, it may be more practical to send it via a
8243
* <code>java.io.InputStream</code>. Data will be read from the stream
8244
* as needed until end-of-file is reached. The JDBC driver will
8245
* do any necessary conversion from ASCII to the database char format.
8246
*
8247
* <P><B>Note:</B> This stream object can either be a standard
8248
* Java stream object or your own subclass that implements the
8249
* standard interface.
8250
* <p>
8251
* The updater methods are used to update column values in the
8252
* current row or the insert row. The updater methods do not
8253
* update the underlying database; instead the <code>updateRow</code> or
8254
* <code>insertRow</code> methods are called to update the database.
8255
*
8256
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
8257
* @param inputStream An object that contains the data to set the parameter
8258
* value to.
8259
* @param length the number of bytes in the parameter data.
8260
* @exception SQLException if a database access error occurs,
8261
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8262
* or this method is called on a closed result set
8263
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8264
* this method
8265
* @since 1.6
8266
*/
8267
public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException {
8268
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8269
}
8270
8271
/**
8272
* Updates the designated column using the given input stream.
8273
* When a very large ASCII value is input to a <code>LONGVARCHAR</code>
8274
* parameter, it may be more practical to send it via a
8275
* <code>java.io.InputStream</code>. Data will be read from the stream
8276
* as needed until end-of-file is reached. The JDBC driver will
8277
* do any necessary conversion from ASCII to the database char format.
8278
*
8279
* <P><B>Note:</B> This stream object can either be a standard
8280
* Java stream object or your own subclass that implements the
8281
* standard interface.
8282
*
8283
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8284
* it might be more efficient to use a version of
8285
* <code>updateBlob</code> which takes a length parameter.
8286
* <p>
8287
* The updater methods are used to update column values in the
8288
* current row or the insert row. The updater methods do not
8289
* update the underlying database; instead the <code>updateRow</code> or
8290
* <code>insertRow</code> methods are called to update the database.
8291
*
8292
* @param columnIndex the first column is 1, the second is 2, ...
8293
* @param inputStream An object that contains the data to set the parameter
8294
* value to.
8295
* @exception SQLException if a database access error occurs,
8296
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8297
* or this method is called on a closed result set
8298
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8299
* this method
8300
* @since 1.6
8301
*/
8302
public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException {
8303
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8304
}
8305
8306
/**
8307
* Updates the designated column using the given input stream.
8308
* When a very large ASCII value is input to a <code>LONGVARCHAR</code>
8309
* parameter, it may be more practical to send it via a
8310
* <code>java.io.InputStream</code>. Data will be read from the stream
8311
* as needed until end-of-file is reached. The JDBC driver will
8312
* do any necessary conversion from ASCII to the database char format.
8313
*
8314
* <P><B>Note:</B> This stream object can either be a standard
8315
* Java stream object or your own subclass that implements the
8316
* standard interface.
8317
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8318
* it might be more efficient to use a version of
8319
* <code>updateBlob</code> which takes a length parameter.
8320
* <p>
8321
* The updater methods are used to update column values in the
8322
* current row or the insert row. The updater methods do not
8323
* update the underlying database; instead the <code>updateRow</code> or
8324
* <code>insertRow</code> methods are called to update the database.
8325
*
8326
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
8327
bel is the name of the column
8328
* @param inputStream An object that contains the data to set the parameter
8329
* value to.
8330
* @exception SQLException if a database access error occurs,
8331
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8332
* or this method is called on a closed result set
8333
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8334
* this method
8335
* @since 1.6
8336
*/
8337
public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException {
8338
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8339
}
8340
8341
/**
8342
* Updates the designated column using the given <code>Reader</code>
8343
* object, which is the given number of characters long.
8344
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
8345
* parameter, it may be more practical to send it via a
8346
* <code>java.io.Reader</code> object. The data will be read from the stream
8347
* as needed until end-of-file is reached. The JDBC driver will
8348
* do any necessary conversion from UNICODE to the database char format.
8349
*
8350
* <P><B>Note:</B> This stream object can either be a standard
8351
* Java stream object or your own subclass that implements the
8352
* standard interface.
8353
* <p>
8354
* The updater methods are used to update column values in the
8355
* current row or the insert row. The updater methods do not
8356
* update the underlying database; instead the <code>updateRow</code> or
8357
* <code>insertRow</code> methods are called to update the database.
8358
*
8359
* @param columnIndex the first column is 1, the second is 2, ...
8360
* @param reader An object that contains the data to set the parameter value to.
8361
* @param length the number of characters in the parameter data.
8362
* @exception SQLException if a database access error occurs,
8363
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8364
* or this method is called on a closed result set
8365
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8366
* this method
8367
* @since 1.6
8368
*/
8369
public void updateClob(int columnIndex, Reader reader, long length) throws SQLException {
8370
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8371
}
8372
8373
/**
8374
* Updates the designated column using the given <code>Reader</code>
8375
* object, which is the given number of characters long.
8376
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
8377
* parameter, it may be more practical to send it via a
8378
* <code>java.io.Reader</code> object. The data will be read from the stream
8379
* as needed until end-of-file is reached. The JDBC driver will
8380
* do any necessary conversion from UNICODE to the database char format.
8381
*
8382
* <P><B>Note:</B> This stream object can either be a standard
8383
* Java stream object or your own subclass that implements the
8384
* standard interface.
8385
* <p>
8386
* The updater methods are used to update column values in the
8387
* current row or the insert row. The updater methods do not
8388
* update the underlying database; instead the <code>updateRow</code> or
8389
* <code>insertRow</code> methods are called to update the database.
8390
*
8391
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
8392
* @param reader An object that contains the data to set the parameter value to.
8393
* @param length the number of characters in the parameter data.
8394
* @exception SQLException if a database access error occurs,
8395
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8396
* or this method is called on a closed result set
8397
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8398
* this method
8399
* @since 1.6
8400
*/
8401
public void updateClob(String columnLabel, Reader reader, long length) throws SQLException {
8402
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8403
}
8404
8405
/**
8406
* Updates the designated column using the given <code>Reader</code>
8407
* object.
8408
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
8409
* parameter, it may be more practical to send it via a
8410
* <code>java.io.Reader</code> object. The data will be read from the stream
8411
* as needed until end-of-file is reached. The JDBC driver will
8412
* do any necessary conversion from UNICODE to the database char format.
8413
*
8414
* <P><B>Note:</B> This stream object can either be a standard
8415
* Java stream object or your own subclass that implements the
8416
* standard interface.
8417
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8418
* it might be more efficient to use a version of
8419
* <code>updateClob</code> which takes a length parameter.
8420
* <p>
8421
* The updater methods are used to update column values in the
8422
* current row or the insert row. The updater methods do not
8423
* update the underlying database; instead the <code>updateRow</code> or
8424
* <code>insertRow</code> methods are called to update the database.
8425
*
8426
* @param columnIndex the first column is 1, the second is 2, ...
8427
* @param reader An object that contains the data to set the parameter value to.
8428
* @exception SQLException if a database access error occurs,
8429
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8430
* or this method is called on a closed result set
8431
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8432
* this method
8433
* @since 1.6
8434
*/
8435
public void updateClob(int columnIndex, Reader reader) throws SQLException {
8436
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8437
}
8438
8439
/**
8440
* Updates the designated column using the given <code>Reader</code>
8441
* object.
8442
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
8443
* parameter, it may be more practical to send it via a
8444
* <code>java.io.Reader</code> object. The data will be read from the stream
8445
* as needed until end-of-file is reached. The JDBC driver will
8446
* do any necessary conversion from UNICODE to the database char format.
8447
*
8448
* <P><B>Note:</B> This stream object can either be a standard
8449
* Java stream object or your own subclass that implements the
8450
* standard interface.
8451
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8452
* it might be more efficient to use a version of
8453
* <code>updateClob</code> which takes a length parameter.
8454
* <p>
8455
* The updater methods are used to update column values in the
8456
* current row or the insert row. The updater methods do not
8457
* update the underlying database; instead the <code>updateRow</code> or
8458
* <code>insertRow</code> methods are called to update the database.
8459
*
8460
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
8461
bel is the name of the column
8462
* @param reader An object that contains the data to set the parameter value to.
8463
* @exception SQLException if a database access error occurs,
8464
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8465
* or this method is called on a closed result set
8466
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8467
* this method
8468
* @since 1.6
8469
*/
8470
public void updateClob(String columnLabel, Reader reader) throws SQLException {
8471
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8472
}
8473
8474
/**
8475
* Updates the designated column using the given <code>Reader</code>
8476
* object, which is the given number of characters long.
8477
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
8478
* parameter, it may be more practical to send it via a
8479
* <code>java.io.Reader</code> object. The data will be read from the stream
8480
* as needed until end-of-file is reached. The JDBC driver will
8481
* do any necessary conversion from UNICODE to the database char format.
8482
*
8483
* <P><B>Note:</B> This stream object can either be a standard
8484
* Java stream object or your own subclass that implements the
8485
* standard interface.
8486
* <p>
8487
* The updater methods are used to update column values in the
8488
* current row or the insert row. The updater methods do not
8489
* update the underlying database; instead the <code>updateRow</code> or
8490
* <code>insertRow</code> methods are called to update the database.
8491
*
8492
* @param columnIndex the first column is 1, the second 2, ...
8493
* @param reader An object that contains the data to set the parameter value to.
8494
* @param length the number of characters in the parameter data.
8495
* @throws SQLException if the driver does not support national
8496
* character sets; if the driver can detect that a data conversion
8497
* error could occur; this method is called on a closed result set,
8498
* if a database access error occurs or
8499
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8500
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8501
* this method
8502
* @since 1.6
8503
*/
8504
public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException {
8505
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8506
}
8507
8508
/**
8509
* Updates the designated column using the given <code>Reader</code>
8510
* object, which is the given number of characters long.
8511
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
8512
* parameter, it may be more practical to send it via a
8513
* <code>java.io.Reader</code> object. The data will be read from the stream
8514
* as needed until end-of-file is reached. The JDBC driver will
8515
* do any necessary conversion from UNICODE to the database char format.
8516
*
8517
* <P><B>Note:</B> This stream object can either be a standard
8518
* Java stream object or your own subclass that implements the
8519
* standard interface.
8520
* <p>
8521
* The updater methods are used to update column values in the
8522
* current row or the insert row. The updater methods do not
8523
* update the underlying database; instead the <code>updateRow</code> or
8524
* <code>insertRow</code> methods are called to update the database.
8525
*
8526
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
8527
* @param reader An object that contains the data to set the parameter value to.
8528
* @param length the number of characters in the parameter data.
8529
* @throws SQLException if the driver does not support national
8530
* character sets; if the driver can detect that a data conversion
8531
* error could occur; this method is called on a closed result set;
8532
* if a database access error occurs or
8533
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8534
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8535
* this method
8536
* @since 1.6
8537
*/
8538
public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException {
8539
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8540
}
8541
8542
/**
8543
* Updates the designated column using the given <code>Reader</code>
8544
* object.
8545
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
8546
* parameter, it may be more practical to send it via a
8547
* <code>java.io.Reader</code> object. The data will be read from the stream
8548
* as needed until end-of-file is reached. The JDBC driver will
8549
* do any necessary conversion from UNICODE to the database char format.
8550
*
8551
* <P><B>Note:</B> This stream object can either be a standard
8552
* Java stream object or your own subclass that implements the
8553
* standard interface.
8554
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8555
* it might be more efficient to use a version of
8556
* <code>updateNClob</code> which takes a length parameter.
8557
* <p>
8558
* The updater methods are used to update column values in the
8559
* current row or the insert row. The updater methods do not
8560
* update the underlying database; instead the <code>updateRow</code> or
8561
* <code>insertRow</code> methods are called to update the database.
8562
*
8563
* @param columnIndex the first column is 1, the second 2, ...
8564
* @param reader An object that contains the data to set the parameter value to.
8565
* @throws SQLException if the driver does not support national
8566
* character sets; if the driver can detect that a data conversion
8567
* error could occur; this method is called on a closed result set,
8568
* if a database access error occurs or
8569
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8570
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8571
* this method
8572
* @since 1.6
8573
*/
8574
public void updateNClob(int columnIndex, Reader reader) throws SQLException {
8575
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8576
}
8577
8578
/**
8579
* Updates the designated column using the given <code>Reader</code>
8580
* object.
8581
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
8582
* parameter, it may be more practical to send it via a
8583
* <code>java.io.Reader</code> object. The data will be read from the stream
8584
* as needed until end-of-file is reached. The JDBC driver will
8585
* do any necessary conversion from UNICODE to the database char format.
8586
*
8587
* <P><B>Note:</B> This stream object can either be a standard
8588
* Java stream object or your own subclass that implements the
8589
* standard interface.
8590
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8591
* it might be more efficient to use a version of
8592
* <code>updateNClob</code> which takes a length parameter.
8593
* <p>
8594
* The updater methods are used to update column values in the
8595
* current row or the insert row. The updater methods do not
8596
* update the underlying database; instead the <code>updateRow</code> or
8597
* <code>insertRow</code> methods are called to update the database.
8598
*
8599
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
8600
bel is the name of the column
8601
* @param reader An object that contains the data to set the parameter value to.
8602
* @throws SQLException if the driver does not support national
8603
* character sets; if the driver can detect that a data conversion
8604
* error could occur; this method is called on a closed result set;
8605
* if a database access error occurs or
8606
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8607
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8608
* this method
8609
* @since 1.6
8610
*/
8611
public void updateNClob(String columnLabel, Reader reader) throws SQLException {
8612
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8613
}
8614
8615
/**
8616
* Updates the designated column with an ascii stream value, which will have
8617
* the specified number of bytes.
8618
* The updater methods are used to update column values in the
8619
* current row or the insert row. The updater methods do not
8620
* update the underlying database; instead the <code>updateRow</code> or
8621
* <code>insertRow</code> methods are called to update the database.
8622
*
8623
* @param columnIndex the first column is 1, the second is 2, ...
8624
* @param x the new column value
8625
* @param length the length of the stream
8626
* @exception SQLException if a database access error occurs,
8627
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8628
* or this method is called on a closed result set
8629
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8630
* this method
8631
* @since 1.6
8632
*/
8633
public void updateAsciiStream(int columnIndex,
8634
java.io.InputStream x,
8635
long length) throws SQLException {
8636
8637
}
8638
8639
/**
8640
* Updates the designated column with a binary stream value, which will have
8641
* the specified number of bytes.
8642
* The updater methods are used to update column values in the
8643
* current row or the insert row. The updater methods do not
8644
* update the underlying database; instead the <code>updateRow</code> or
8645
* <code>insertRow</code> methods are called to update the database.
8646
*
8647
* @param columnIndex the first column is 1, the second is 2, ...
8648
* @param x the new column value
8649
* @param length the length of the stream
8650
* @exception SQLException if a database access error occurs,
8651
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8652
* or this method is called on a closed result set
8653
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8654
* this method
8655
* @since 1.6
8656
*/
8657
public void updateBinaryStream(int columnIndex,
8658
java.io.InputStream x,
8659
long length) throws SQLException {
8660
}
8661
8662
/**
8663
* Updates the designated column with a character stream value, which will have
8664
* the specified number of bytes.
8665
* The updater methods are used to update column values in the
8666
* current row or the insert row. The updater methods do not
8667
* update the underlying database; instead the <code>updateRow</code> or
8668
* <code>insertRow</code> methods are called to update the database.
8669
*
8670
* @param columnIndex the first column is 1, the second is 2, ...
8671
* @param x the new column value
8672
* @param length the length of the stream
8673
* @exception SQLException if a database access error occurs,
8674
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8675
* or this method is called on a closed result set
8676
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8677
* this method
8678
* @since 1.6
8679
*/
8680
public void updateCharacterStream(int columnIndex,
8681
java.io.Reader x,
8682
long length) throws SQLException {
8683
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8684
}
8685
8686
/**
8687
* Updates the designated column with a character stream value, which will have
8688
* the specified number of bytes.
8689
* The updater methods are used to update column values in the
8690
* current row or the insert row. The updater methods do not
8691
* update the underlying database; instead the <code>updateRow</code> or
8692
* <code>insertRow</code> methods are called to update the database.
8693
*
8694
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
8695
bel is the name of the column
8696
* @param reader the <code>java.io.Reader</code> object containing
8697
* the new column value
8698
* @param length the length of the stream
8699
* @exception SQLException if a database access error occurs,
8700
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8701
* or this method is called on a closed result set
8702
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8703
* this method
8704
* @since 1.6
8705
*/
8706
public void updateCharacterStream(String columnLabel,
8707
java.io.Reader reader,
8708
long length) throws SQLException {
8709
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8710
}
8711
/**
8712
* Updates the designated column with an ascii stream value, which will have
8713
* the specified number of bytes..
8714
* The updater methods are used to update column values in the
8715
* current row or the insert row. The updater methods do not
8716
* update the underlying database; instead the <code>updateRow</code> or
8717
* <code>insertRow</code> methods are called to update the database.
8718
*
8719
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
8720
* @param x the new column value
8721
* @param length the length of the stream
8722
* @exception SQLException if a database access error occurs,
8723
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8724
* or this method is called on a closed result set
8725
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8726
* this method
8727
* @since 1.6
8728
*/
8729
public void updateAsciiStream(String columnLabel,
8730
java.io.InputStream x,
8731
long length) throws SQLException {
8732
}
8733
8734
/**
8735
* Updates the designated column with a binary stream value, which will have
8736
* the specified number of bytes.
8737
* The updater methods are used to update column values in the
8738
* current row or the insert row. The updater methods do not
8739
* update the underlying database; instead the <code>updateRow</code> or
8740
* <code>insertRow</code> methods are called to update the database.
8741
*
8742
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
8743
* @param x the new column value
8744
* @param length the length of the stream
8745
* @exception SQLException if a database access error occurs,
8746
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8747
* or this method is called on a closed result set
8748
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8749
* this method
8750
* @since 1.6
8751
*/
8752
public void updateBinaryStream(String columnLabel,
8753
java.io.InputStream x,
8754
long length) throws SQLException {
8755
}
8756
8757
/**
8758
* Updates the designated column with a binary stream value.
8759
* The updater methods are used to update column values in the
8760
* current row or the insert row. The updater methods do not
8761
* update the underlying database; instead the <code>updateRow</code> or
8762
* <code>insertRow</code> methods are called to update the database.
8763
*
8764
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8765
* it might be more efficient to use a version of
8766
* <code>updateBinaryStream</code> which takes a length parameter.
8767
*
8768
* @param columnIndex the first column is 1, the second is 2, ...
8769
* @param x the new column value
8770
* @exception SQLException if a database access error occurs,
8771
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8772
* or this method is called on a closed result set
8773
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8774
* this method
8775
* @since 1.6
8776
*/
8777
public void updateBinaryStream(int columnIndex,
8778
java.io.InputStream x) throws SQLException {
8779
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8780
}
8781
8782
8783
/**
8784
* Updates the designated column with a binary stream value.
8785
* The updater methods are used to update column values in the
8786
* current row or the insert row. The updater methods do not
8787
* update the underlying database; instead the <code>updateRow</code> or
8788
* <code>insertRow</code> methods are called to update the database.
8789
*
8790
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8791
* it might be more efficient to use a version of
8792
* <code>updateBinaryStream</code> which takes a length parameter.
8793
*
8794
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
8795
bel is the name of the column
8796
* @param x the new column value
8797
* @exception SQLException if a database access error occurs,
8798
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8799
* or this method is called on a closed result set
8800
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8801
* this method
8802
* @since 1.6
8803
*/
8804
public void updateBinaryStream(String columnLabel,
8805
java.io.InputStream x) throws SQLException {
8806
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8807
}
8808
8809
/**
8810
* Updates the designated column with a character stream value.
8811
* The updater methods are used to update column values in the
8812
* current row or the insert row. The updater methods do not
8813
* update the underlying database; instead the <code>updateRow</code> or
8814
* <code>insertRow</code> methods are called to update the database.
8815
*
8816
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8817
* it might be more efficient to use a version of
8818
* <code>updateCharacterStream</code> which takes a length parameter.
8819
*
8820
* @param columnIndex the first column is 1, the second is 2, ...
8821
* @param x the new column value
8822
* @exception SQLException if a database access error occurs,
8823
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8824
* or this method is called on a closed result set
8825
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8826
* this method
8827
* @since 1.6
8828
*/
8829
public void updateCharacterStream(int columnIndex,
8830
java.io.Reader x) throws SQLException {
8831
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8832
}
8833
8834
/**
8835
* Updates the designated column with a character stream value.
8836
* The updater methods are used to update column values in the
8837
* current row or the insert row. The updater methods do not
8838
* update the underlying database; instead the <code>updateRow</code> or
8839
* <code>insertRow</code> methods are called to update the database.
8840
*
8841
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8842
* it might be more efficient to use a version of
8843
* <code>updateCharacterStream</code> which takes a length parameter.
8844
*
8845
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
8846
bel is the name of the column
8847
* @param reader the <code>java.io.Reader</code> object containing
8848
* the new column value
8849
* @exception SQLException if a database access error occurs,
8850
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8851
* or this method is called on a closed result set
8852
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8853
* this method
8854
* @since 1.6
8855
*/
8856
public void updateCharacterStream(String columnLabel,
8857
java.io.Reader reader) throws SQLException {
8858
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8859
}
8860
8861
/**
8862
* Updates the designated column with an ascii stream value.
8863
* The updater methods are used to update column values in the
8864
* current row or the insert row. The updater methods do not
8865
* update the underlying database; instead the <code>updateRow</code> or
8866
* <code>insertRow</code> methods are called to update the database.
8867
*
8868
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8869
* it might be more efficient to use a version of
8870
* <code>updateAsciiStream</code> which takes a length parameter.
8871
*
8872
* @param columnIndex the first column is 1, the second is 2, ...
8873
* @param x the new column value
8874
* @exception SQLException if a database access error occurs,
8875
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8876
* or this method is called on a closed result set
8877
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8878
* this method
8879
* @since 1.6
8880
*/
8881
public void updateAsciiStream(int columnIndex,
8882
java.io.InputStream x) throws SQLException {
8883
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8884
}
8885
8886
/**
8887
* Updates the designated column with an ascii stream value.
8888
* The updater methods are used to update column values in the
8889
* current row or the insert row. The updater methods do not
8890
* update the underlying database; instead the <code>updateRow</code> or
8891
* <code>insertRow</code> methods are called to update the database.
8892
*
8893
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8894
* it might be more efficient to use a version of
8895
* <code>updateAsciiStream</code> which takes a length parameter.
8896
*
8897
* @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
8898
bel is the name of the column
8899
* @param x the new column value
8900
* @exception SQLException if a database access error occurs,
8901
* the result set concurrency is <code>CONCUR_READ_ONLY</code>
8902
* or this method is called on a closed result set
8903
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8904
* this method
8905
* @since 1.6
8906
*/
8907
public void updateAsciiStream(String columnLabel,
8908
java.io.InputStream x) throws SQLException {
8909
8910
}
8911
8912
/**
8913
* Sets the designated parameter to the given <code>java.net.URL</code> value.
8914
* The driver converts this to an SQL <code>DATALINK</code> value
8915
* when it sends it to the database.
8916
*
8917
* @param parameterIndex the first parameter is 1, the second is 2, ...
8918
* @param x the <code>java.net.URL</code> object to be set
8919
* @exception SQLException if a database access error occurs or
8920
* this method is called on a closed <code>PreparedStatement</code>
8921
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
8922
* @since 1.4
8923
*/
8924
public void setURL(int parameterIndex, java.net.URL x) throws SQLException{
8925
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8926
}
8927
8928
/**
8929
* Sets the designated parameter to a <code>Reader</code> object.
8930
* This method differs from the <code>setCharacterStream (int, Reader)</code> method
8931
* because it informs the driver that the parameter value should be sent to
8932
* the server as a <code>NCLOB</code>. When the <code>setCharacterStream</code> method is used, the
8933
* driver may have to do extra work to determine whether the parameter
8934
* data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
8935
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8936
* it might be more efficient to use a version of
8937
* <code>setNClob</code> which takes a length parameter.
8938
*
8939
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
8940
* @param reader An object that contains the data to set the parameter value to.
8941
* @throws SQLException if parameterIndex does not correspond to a parameter
8942
* marker in the SQL statement;
8943
* if the driver does not support national character sets;
8944
* if the driver can detect that a data conversion
8945
* error could occur; if a database access error occurs or
8946
* this method is called on a closed <code>PreparedStatement</code>
8947
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
8948
*
8949
* @since 1.6
8950
*/
8951
public void setNClob(int parameterIndex, Reader reader)
8952
throws SQLException{
8953
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8954
}
8955
8956
/**
8957
* Sets the designated parameter to a <code>Reader</code> object. The <code>reader</code> must contain the number
8958
* of characters specified by length otherwise a <code>SQLException</code> will be
8959
* generated when the <code>CallableStatement</code> is executed.
8960
* This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
8961
* because it informs the driver that the parameter value should be sent to
8962
* the server as a <code>NCLOB</code>. When the <code>setCharacterStream</code> method is used, the
8963
* driver may have to do extra work to determine whether the parameter
8964
* data should be send to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
8965
*
8966
* @param parameterName the name of the parameter to be set
8967
* @param reader An object that contains the data to set the parameter value to.
8968
* @param length the number of characters in the parameter data.
8969
* @throws SQLException if parameterIndex does not correspond to a parameter
8970
* marker in the SQL statement; if the length specified is less than zero;
8971
* if the driver does not support national
8972
* character sets; if the driver can detect that a data conversion
8973
* error could occur; if a database access error occurs or
8974
* this method is called on a closed <code>CallableStatement</code>
8975
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
8976
* this method
8977
* @since 1.6
8978
*/
8979
public void setNClob(String parameterName, Reader reader, long length)
8980
throws SQLException{
8981
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
8982
}
8983
8984
8985
/**
8986
* Sets the designated parameter to a <code>Reader</code> object.
8987
* This method differs from the <code>setCharacterStream (int, Reader)</code> method
8988
* because it informs the driver that the parameter value should be sent to
8989
* the server as a <code>NCLOB</code>. When the <code>setCharacterStream</code> method is used, the
8990
* driver may have to do extra work to determine whether the parameter
8991
* data should be send to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
8992
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
8993
* it might be more efficient to use a version of
8994
* <code>setNClob</code> which takes a length parameter.
8995
*
8996
* @param parameterName the name of the parameter
8997
* @param reader An object that contains the data to set the parameter value to.
8998
* @throws SQLException if the driver does not support national character sets;
8999
* if the driver can detect that a data conversion
9000
* error could occur; if a database access error occurs or
9001
* this method is called on a closed <code>CallableStatement</code>
9002
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9003
*
9004
* @since 1.6
9005
*/
9006
public void setNClob(String parameterName, Reader reader)
9007
throws SQLException{
9008
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9009
}
9010
9011
9012
/**
9013
* Sets the designated parameter to a <code>Reader</code> object. The reader must contain the number
9014
* of characters specified by length otherwise a <code>SQLException</code> will be
9015
* generated when the <code>PreparedStatement</code> is executed.
9016
* This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
9017
* because it informs the driver that the parameter value should be sent to
9018
* the server as a <code>NCLOB</code>. When the <code>setCharacterStream</code> method is used, the
9019
* driver may have to do extra work to determine whether the parameter
9020
* data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
9021
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
9022
* @param reader An object that contains the data to set the parameter value to.
9023
* @param length the number of characters in the parameter data.
9024
* @throws SQLException if parameterIndex does not correspond to a parameter
9025
* marker in the SQL statement; if the length specified is less than zero;
9026
* if the driver does not support national character sets;
9027
* if the driver can detect that a data conversion
9028
* error could occur; if a database access error occurs or
9029
* this method is called on a closed <code>PreparedStatement</code>
9030
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9031
*
9032
* @since 1.6
9033
*/
9034
public void setNClob(int parameterIndex, Reader reader, long length)
9035
throws SQLException{
9036
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9037
}
9038
9039
9040
/**
9041
* Sets the designated parameter to a <code>java.sql.NClob</code> object. The driver converts this to
9042
a
9043
* SQL <code>NCLOB</code> value when it sends it to the database.
9044
* @param parameterIndex of the first parameter is 1, the second is 2, ...
9045
* @param value the parameter value
9046
* @throws SQLException if the driver does not support national
9047
* character sets; if the driver can detect that a data conversion
9048
* error could occur ; or if a database access error occurs
9049
* @since 1.6
9050
*/
9051
public void setNClob(int parameterIndex, NClob value) throws SQLException{
9052
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9053
}
9054
9055
9056
/**
9057
* Sets the designated parameter to the given <code>String</code> object.
9058
* The driver converts this to a SQL <code>NCHAR</code> or
9059
* <code>NVARCHAR</code> or <code>LONGNVARCHAR</code> value
9060
* (depending on the argument's
9061
* size relative to the driver's limits on <code>NVARCHAR</code> values)
9062
* when it sends it to the database.
9063
*
9064
* @param parameterIndex of the first parameter is 1, the second is 2, ...
9065
* @param value the parameter value
9066
* @throws SQLException if the driver does not support national
9067
* character sets; if the driver can detect that a data conversion
9068
* error could occur ; or if a database access error occurs
9069
* @since 1.6
9070
*/
9071
public void setNString(int parameterIndex, String value) throws SQLException{
9072
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9073
}
9074
9075
9076
/**
9077
* Sets the designated parameter to the given <code>String</code> object.
9078
* The driver converts this to a SQL <code>NCHAR</code> or
9079
* <code>NVARCHAR</code> or <code>LONGNVARCHAR</code>
9080
* @param parameterName the name of the column to be set
9081
* @param value the parameter value
9082
* @throws SQLException if the driver does not support national
9083
* character sets; if the driver can detect that a data conversion
9084
* error could occur; or if a database access error occurs
9085
* @since 1.6
9086
*/
9087
public void setNString(String parameterName, String value)
9088
throws SQLException{
9089
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9090
}
9091
9092
9093
/**
9094
* Sets the designated parameter to a <code>Reader</code> object. The
9095
* <code>Reader</code> reads the data till end-of-file is reached. The
9096
* driver does the necessary conversion from Java character format to
9097
* the national character set in the database.
9098
* @param parameterIndex of the first parameter is 1, the second is 2, ...
9099
* @param value the parameter value
9100
* @param length the number of characters in the parameter data.
9101
* @throws SQLException if the driver does not support national
9102
* character sets; if the driver can detect that a data conversion
9103
* error could occur ; or if a database access error occurs
9104
* @since 1.6
9105
*/
9106
public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException{
9107
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9108
}
9109
9110
9111
/**
9112
* Sets the designated parameter to a <code>Reader</code> object. The
9113
* <code>Reader</code> reads the data till end-of-file is reached. The
9114
* driver does the necessary conversion from Java character format to
9115
* the national character set in the database.
9116
* @param parameterName the name of the column to be set
9117
* @param value the parameter value
9118
* @param length the number of characters in the parameter data.
9119
* @throws SQLException if the driver does not support national
9120
* character sets; if the driver can detect that a data conversion
9121
* error could occur; or if a database access error occurs
9122
* @since 1.6
9123
*/
9124
public void setNCharacterStream(String parameterName, Reader value, long length)
9125
throws SQLException{
9126
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9127
}
9128
9129
/**
9130
* Sets the designated parameter to a <code>Reader</code> object. The
9131
* <code>Reader</code> reads the data till end-of-file is reached. The
9132
* driver does the necessary conversion from Java character format to
9133
* the national character set in the database.
9134
9135
* <P><B>Note:</B> This stream object can either be a standard
9136
* Java stream object or your own subclass that implements the
9137
* standard interface.
9138
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
9139
* it might be more efficient to use a version of
9140
* <code>setNCharacterStream</code> which takes a length parameter.
9141
*
9142
* @param parameterName the name of the parameter
9143
* @param value the parameter value
9144
* @throws SQLException if the driver does not support national
9145
* character sets; if the driver can detect that a data conversion
9146
* error could occur ; if a database access error occurs; or
9147
* this method is called on a closed <code>CallableStatement</code>
9148
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9149
* @since 1.6
9150
*/
9151
public void setNCharacterStream(String parameterName, Reader value) throws SQLException{
9152
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9153
}
9154
9155
/**
9156
* Sets the designated parameter to the given <code>java.sql.Timestamp</code> value,
9157
* using the given <code>Calendar</code> object. The driver uses
9158
* the <code>Calendar</code> object to construct an SQL <code>TIMESTAMP</code> value,
9159
* which the driver then sends to the database. With a
9160
* a <code>Calendar</code> object, the driver can calculate the timestamp
9161
* taking into account a custom timezone. If no
9162
* <code>Calendar</code> object is specified, the driver uses the default
9163
* timezone, which is that of the virtual machine running the application.
9164
*
9165
* @param parameterName the name of the parameter
9166
* @param x the parameter value
9167
* @param cal the <code>Calendar</code> object the driver will use
9168
* to construct the timestamp
9169
* @exception SQLException if a database access error occurs or
9170
* this method is called on a closed <code>CallableStatement</code>
9171
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9172
* this method
9173
* @see #getTimestamp
9174
* @since 1.4
9175
*/
9176
public void setTimestamp(String parameterName, java.sql.Timestamp x, Calendar cal)
9177
throws SQLException{
9178
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9179
}
9180
9181
/**
9182
* Sets the designated parameter to a <code>Reader</code> object. The <code>reader</code> must contain the number
9183
* of characters specified by length otherwise a <code>SQLException</code> will be
9184
* generated when the <code>CallableStatement</code> is executed.
9185
* This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
9186
* because it informs the driver that the parameter value should be sent to
9187
* the server as a <code>CLOB</code>. When the <code>setCharacterStream</code> method is used, the
9188
* driver may have to do extra work to determine whether the parameter
9189
* data should be send to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
9190
* @param parameterName the name of the parameter to be set
9191
* @param reader An object that contains the data to set the parameter value to.
9192
* @param length the number of characters in the parameter data.
9193
* @throws SQLException if parameterIndex does not correspond to a parameter
9194
* marker in the SQL statement; if the length specified is less than zero;
9195
* a database access error occurs or
9196
* this method is called on a closed <code>CallableStatement</code>
9197
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9198
* this method
9199
*
9200
* @since 1.6
9201
*/
9202
public void setClob(String parameterName, Reader reader, long length)
9203
throws SQLException{
9204
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9205
}
9206
9207
9208
/**
9209
* Sets the designated parameter to the given <code>java.sql.Clob</code> object.
9210
* The driver converts this to an SQL <code>CLOB</code> value when it
9211
* sends it to the database.
9212
*
9213
* @param parameterName the name of the parameter
9214
* @param x a <code>Clob</code> object that maps an SQL <code>CLOB</code> value
9215
* @exception SQLException if a database access error occurs or
9216
* this method is called on a closed <code>CallableStatement</code>
9217
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9218
* this method
9219
* @since 1.6
9220
*/
9221
public void setClob (String parameterName, Clob x) throws SQLException{
9222
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9223
}
9224
9225
9226
/**
9227
* Sets the designated parameter to a <code>Reader</code> object.
9228
* This method differs from the <code>setCharacterStream (int, Reader)</code> method
9229
* because it informs the driver that the parameter value should be sent to
9230
* the server as a <code>CLOB</code>. When the <code>setCharacterStream</code> method is used, the
9231
* driver may have to do extra work to determine whether the parameter
9232
* data should be send to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
9233
*
9234
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
9235
* it might be more efficient to use a version of
9236
* <code>setClob</code> which takes a length parameter.
9237
*
9238
* @param parameterName the name of the parameter
9239
* @param reader An object that contains the data to set the parameter value to.
9240
* @throws SQLException if a database access error occurs or this method is called on
9241
* a closed <code>CallableStatement</code>
9242
*
9243
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9244
* @since 1.6
9245
*/
9246
public void setClob(String parameterName, Reader reader)
9247
throws SQLException{
9248
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9249
}
9250
9251
9252
/**
9253
* Sets the designated parameter to the given <code>java.sql.Date</code> value
9254
* using the default time zone of the virtual machine that is running
9255
* the application.
9256
* The driver converts this
9257
* to an SQL <code>DATE</code> value when it sends it to the database.
9258
*
9259
* @param parameterName the name of the parameter
9260
* @param x the parameter value
9261
* @exception SQLException if a database access error occurs or
9262
* this method is called on a closed <code>CallableStatement</code>
9263
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9264
* this method
9265
* @see #getDate
9266
* @since 1.4
9267
*/
9268
public void setDate(String parameterName, java.sql.Date x)
9269
throws SQLException{
9270
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9271
}
9272
9273
9274
/**
9275
* Sets the designated parameter to the given <code>java.sql.Date</code> value,
9276
* using the given <code>Calendar</code> object. The driver uses
9277
* the <code>Calendar</code> object to construct an SQL <code>DATE</code> value,
9278
* which the driver then sends to the database. With a
9279
* a <code>Calendar</code> object, the driver can calculate the date
9280
* taking into account a custom timezone. If no
9281
* <code>Calendar</code> object is specified, the driver uses the default
9282
* timezone, which is that of the virtual machine running the application.
9283
*
9284
* @param parameterName the name of the parameter
9285
* @param x the parameter value
9286
* @param cal the <code>Calendar</code> object the driver will use
9287
* to construct the date
9288
* @exception SQLException if a database access error occurs or
9289
* this method is called on a closed <code>CallableStatement</code>
9290
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9291
* this method
9292
* @see #getDate
9293
* @since 1.4
9294
*/
9295
public void setDate(String parameterName, java.sql.Date x, Calendar cal)
9296
throws SQLException{
9297
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9298
}
9299
9300
9301
/**
9302
* Sets the designated parameter to the given <code>java.sql.Time</code> value.
9303
* The driver converts this
9304
* to an SQL <code>TIME</code> value when it sends it to the database.
9305
*
9306
* @param parameterName the name of the parameter
9307
* @param x the parameter value
9308
* @exception SQLException if a database access error occurs or
9309
* this method is called on a closed <code>CallableStatement</code>
9310
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9311
* this method
9312
* @see #getTime
9313
* @since 1.4
9314
*/
9315
public void setTime(String parameterName, java.sql.Time x)
9316
throws SQLException{
9317
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9318
}
9319
9320
9321
/**
9322
* Sets the designated parameter to the given <code>java.sql.Time</code> value,
9323
* using the given <code>Calendar</code> object. The driver uses
9324
* the <code>Calendar</code> object to construct an SQL <code>TIME</code> value,
9325
* which the driver then sends to the database. With a
9326
* a <code>Calendar</code> object, the driver can calculate the time
9327
* taking into account a custom timezone. If no
9328
* <code>Calendar</code> object is specified, the driver uses the default
9329
* timezone, which is that of the virtual machine running the application.
9330
*
9331
* @param parameterName the name of the parameter
9332
* @param x the parameter value
9333
* @param cal the <code>Calendar</code> object the driver will use
9334
* to construct the time
9335
* @exception SQLException if a database access error occurs or
9336
* this method is called on a closed <code>CallableStatement</code>
9337
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9338
* this method
9339
* @see #getTime
9340
* @since 1.4
9341
*/
9342
public void setTime(String parameterName, java.sql.Time x, Calendar cal)
9343
throws SQLException{
9344
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9345
}
9346
9347
/**
9348
* Sets the designated parameter to a <code>Reader</code> object.
9349
* This method differs from the <code>setCharacterStream (int, Reader)</code> method
9350
* because it informs the driver that the parameter value should be sent to
9351
* the server as a <code>CLOB</code>. When the <code>setCharacterStream</code> method is used, the
9352
* driver may have to do extra work to determine whether the parameter
9353
* data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
9354
*
9355
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
9356
* it might be more efficient to use a version of
9357
* <code>setClob</code> which takes a length parameter.
9358
*
9359
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
9360
* @param reader An object that contains the data to set the parameter value to.
9361
* @throws SQLException if a database access error occurs, this method is called on
9362
* a closed <code>PreparedStatement</code>or if parameterIndex does not correspond to a parameter
9363
* marker in the SQL statement
9364
*
9365
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9366
* @since 1.6
9367
*/
9368
public void setClob(int parameterIndex, Reader reader)
9369
throws SQLException{
9370
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9371
}
9372
9373
/**
9374
* Sets the designated parameter to a <code>Reader</code> object. The reader must contain the number
9375
* of characters specified by length otherwise a <code>SQLException</code> will be
9376
* generated when the <code>PreparedStatement</code> is executed.
9377
*This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
9378
* because it informs the driver that the parameter value should be sent to
9379
* the server as a <code>CLOB</code>. When the <code>setCharacterStream</code> method is used, the
9380
* driver may have to do extra work to determine whether the parameter
9381
* data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
9382
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
9383
* @param reader An object that contains the data to set the parameter value to.
9384
* @param length the number of characters in the parameter data.
9385
* @throws SQLException if a database access error occurs, this method is called on
9386
* a closed <code>PreparedStatement</code>, if parameterIndex does not correspond to a parameter
9387
* marker in the SQL statement, or if the length specified is less than zero.
9388
*
9389
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9390
* @since 1.6
9391
*/
9392
public void setClob(int parameterIndex, Reader reader, long length)
9393
throws SQLException{
9394
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9395
}
9396
9397
9398
/**
9399
* Sets the designated parameter to a <code>InputStream</code> object. The inputstream must contain the number
9400
* of characters specified by length otherwise a <code>SQLException</code> will be
9401
* generated when the <code>PreparedStatement</code> is executed.
9402
* This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
9403
* method because it informs the driver that the parameter value should be
9404
* sent to the server as a <code>BLOB</code>. When the <code>setBinaryStream</code> method is used,
9405
* the driver may have to do extra work to determine whether the parameter
9406
* data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
9407
* @param parameterIndex index of the first parameter is 1,
9408
* the second is 2, ...
9409
* @param inputStream An object that contains the data to set the parameter
9410
* value to.
9411
* @param length the number of bytes in the parameter data.
9412
* @throws SQLException if a database access error occurs,
9413
* this method is called on a closed <code>PreparedStatement</code>,
9414
* if parameterIndex does not correspond
9415
* to a parameter marker in the SQL statement, if the length specified
9416
* is less than zero or if the number of bytes in the inputstream does not match
9417
* the specified length.
9418
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9419
*
9420
* @since 1.6
9421
*/
9422
public void setBlob(int parameterIndex, InputStream inputStream, long length)
9423
throws SQLException{
9424
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9425
}
9426
9427
9428
/**
9429
* Sets the designated parameter to a <code>InputStream</code> object.
9430
* This method differs from the <code>setBinaryStream (int, InputStream)</code>
9431
* method because it informs the driver that the parameter value should be
9432
* sent to the server as a <code>BLOB</code>. When the <code>setBinaryStream</code> method is used,
9433
* the driver may have to do extra work to determine whether the parameter
9434
* data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
9435
*
9436
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
9437
* it might be more efficient to use a version of
9438
* <code>setBlob</code> which takes a length parameter.
9439
*
9440
* @param parameterIndex index of the first parameter is 1,
9441
* the second is 2, ...
9442
* @param inputStream An object that contains the data to set the parameter
9443
* value to.
9444
* @throws SQLException if a database access error occurs,
9445
* this method is called on a closed <code>PreparedStatement</code> or
9446
* if parameterIndex does not correspond
9447
* to a parameter marker in the SQL statement,
9448
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9449
*
9450
* @since 1.6
9451
*/
9452
public void setBlob(int parameterIndex, InputStream inputStream)
9453
throws SQLException{
9454
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9455
}
9456
9457
9458
/**
9459
* Sets the designated parameter to a <code>InputStream</code> object. The <code>inputstream</code> must contain the number
9460
* of characters specified by length, otherwise a <code>SQLException</code> will be
9461
* generated when the <code>CallableStatement</code> is executed.
9462
* This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
9463
* method because it informs the driver that the parameter value should be
9464
* sent to the server as a <code>BLOB</code>. When the <code>setBinaryStream</code> method is used,
9465
* the driver may have to do extra work to determine whether the parameter
9466
* data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
9467
*
9468
* @param parameterName the name of the parameter to be set
9469
* the second is 2, ...
9470
*
9471
* @param inputStream An object that contains the data to set the parameter
9472
* value to.
9473
* @param length the number of bytes in the parameter data.
9474
* @throws SQLException if parameterIndex does not correspond
9475
* to a parameter marker in the SQL statement, or if the length specified
9476
* is less than zero; if the number of bytes in the inputstream does not match
9477
* the specified length; if a database access error occurs or
9478
* this method is called on a closed <code>CallableStatement</code>
9479
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9480
* this method
9481
*
9482
* @since 1.6
9483
*/
9484
public void setBlob(String parameterName, InputStream inputStream, long length)
9485
throws SQLException{
9486
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9487
}
9488
9489
9490
/**
9491
* Sets the designated parameter to the given <code>java.sql.Blob</code> object.
9492
* The driver converts this to an SQL <code>BLOB</code> value when it
9493
* sends it to the database.
9494
*
9495
* @param parameterName the name of the parameter
9496
* @param x a <code>Blob</code> object that maps an SQL <code>BLOB</code> value
9497
* @exception SQLException if a database access error occurs or
9498
* this method is called on a closed <code>CallableStatement</code>
9499
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9500
* this method
9501
* @since 1.6
9502
*/
9503
public void setBlob (String parameterName, Blob x) throws SQLException{
9504
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9505
}
9506
9507
9508
/**
9509
* Sets the designated parameter to a <code>InputStream</code> object.
9510
* This method differs from the <code>setBinaryStream (int, InputStream)</code>
9511
* method because it informs the driver that the parameter value should be
9512
* sent to the server as a <code>BLOB</code>. When the <code>setBinaryStream</code> method is used,
9513
* the driver may have to do extra work to determine whether the parameter
9514
* data should be send to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
9515
*
9516
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
9517
* it might be more efficient to use a version of
9518
* <code>setBlob</code> which takes a length parameter.
9519
*
9520
* @param parameterName the name of the parameter
9521
* @param inputStream An object that contains the data to set the parameter
9522
* value to.
9523
* @throws SQLException if a database access error occurs or
9524
* this method is called on a closed <code>CallableStatement</code>
9525
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9526
*
9527
* @since 1.6
9528
*/
9529
public void setBlob(String parameterName, InputStream inputStream)
9530
throws SQLException{
9531
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9532
}
9533
9534
/**
9535
* Sets the value of the designated parameter with the given object. The second
9536
* argument must be an object type; for integral values, the
9537
* <code>java.lang</code> equivalent objects should be used.
9538
*
9539
* <p>The given Java object will be converted to the given targetSqlType
9540
* before being sent to the database.
9541
*
9542
* If the object has a custom mapping (is of a class implementing the
9543
* interface <code>SQLData</code>),
9544
* the JDBC driver should call the method <code>SQLData.writeSQL</code> to write it
9545
* to the SQL data stream.
9546
* If, on the other hand, the object is of a class implementing
9547
* <code>Ref</code>, <code>Blob</code>, <code>Clob</code>, <code>NClob</code>,
9548
* <code>Struct</code>, <code>java.net.URL</code>,
9549
* or <code>Array</code>, the driver should pass it to the database as a
9550
* value of the corresponding SQL type.
9551
* <P>
9552
* Note that this method may be used to pass datatabase-
9553
* specific abstract data types.
9554
*
9555
* @param parameterName the name of the parameter
9556
* @param x the object containing the input parameter value
9557
* @param targetSqlType the SQL type (as defined in java.sql.Types) to be
9558
* sent to the database. The scale argument may further qualify this type.
9559
* @param scale for java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types,
9560
* this is the number of digits after the decimal point. For all other
9561
* types, this value will be ignored.
9562
* @exception SQLException if a database access error occurs or
9563
* this method is called on a closed <code>CallableStatement</code>
9564
* @exception SQLFeatureNotSupportedException if <code>targetSqlType</code> is
9565
* a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
9566
* <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
9567
* <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
9568
* <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
9569
* or <code>STRUCT</code> data type and the JDBC driver does not support
9570
* this data type
9571
* @see Types
9572
* @see #getObject
9573
* @since 1.4
9574
*/
9575
public void setObject(String parameterName, Object x, int targetSqlType, int scale)
9576
throws SQLException{
9577
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9578
}
9579
9580
9581
9582
/**
9583
* Sets the value of the designated parameter with the given object.
9584
* This method is like the method <code>setObject</code>
9585
* above, except that it assumes a scale of zero.
9586
*
9587
* @param parameterName the name of the parameter
9588
* @param x the object containing the input parameter value
9589
* @param targetSqlType the SQL type (as defined in java.sql.Types) to be
9590
* sent to the database
9591
* @exception SQLException if a database access error occurs or
9592
* this method is called on a closed <code>CallableStatement</code>
9593
* @exception SQLFeatureNotSupportedException if <code>targetSqlType</code> is
9594
* a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
9595
* <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
9596
* <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
9597
* <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
9598
* or <code>STRUCT</code> data type and the JDBC driver does not support
9599
* this data type
9600
* @see #getObject
9601
* @since 1.4
9602
*/
9603
public void setObject(String parameterName, Object x, int targetSqlType)
9604
throws SQLException{
9605
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9606
}
9607
9608
9609
/**
9610
* Sets the value of the designated parameter with the given object.
9611
* The second parameter must be of type <code>Object</code>; therefore, the
9612
* <code>java.lang</code> equivalent objects should be used for built-in types.
9613
*
9614
* <p>The JDBC specification specifies a standard mapping from
9615
* Java <code>Object</code> types to SQL types. The given argument
9616
* will be converted to the corresponding SQL type before being
9617
* sent to the database.
9618
*
9619
* <p>Note that this method may be used to pass datatabase-
9620
* specific abstract data types, by using a driver-specific Java
9621
* type.
9622
*
9623
* If the object is of a class implementing the interface <code>SQLData</code>,
9624
* the JDBC driver should call the method <code>SQLData.writeSQL</code>
9625
* to write it to the SQL data stream.
9626
* If, on the other hand, the object is of a class implementing
9627
* <code>Ref</code>, <code>Blob</code>, <code>Clob</code>, <code>NClob</code>,
9628
* <code>Struct</code>, <code>java.net.URL</code>,
9629
* or <code>Array</code>, the driver should pass it to the database as a
9630
* value of the corresponding SQL type.
9631
* <P>
9632
* This method throws an exception if there is an ambiguity, for example, if the
9633
* object is of a class implementing more than one of the interfaces named above.
9634
*
9635
* @param parameterName the name of the parameter
9636
* @param x the object containing the input parameter value
9637
* @exception SQLException if a database access error occurs,
9638
* this method is called on a closed <code>CallableStatement</code> or if the given
9639
* <code>Object</code> parameter is ambiguous
9640
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9641
* this method
9642
* @see #getObject
9643
* @since 1.4
9644
*/
9645
public void setObject(String parameterName, Object x) throws SQLException{
9646
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9647
}
9648
9649
/**
9650
* Sets the designated parameter to the given input stream, which will have
9651
* the specified number of bytes.
9652
* When a very large ASCII value is input to a <code>LONGVARCHAR</code>
9653
* parameter, it may be more practical to send it via a
9654
* <code>java.io.InputStream</code>. Data will be read from the stream
9655
* as needed until end-of-file is reached. The JDBC driver will
9656
* do any necessary conversion from ASCII to the database char format.
9657
*
9658
* <P><B>Note:</B> This stream object can either be a standard
9659
* Java stream object or your own subclass that implements the
9660
* standard interface.
9661
*
9662
* @param parameterName the name of the parameter
9663
* @param x the Java input stream that contains the ASCII parameter value
9664
* @param length the number of bytes in the stream
9665
* @exception SQLException if a database access error occurs or
9666
* this method is called on a closed <code>CallableStatement</code>
9667
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9668
* this method
9669
* @since 1.4
9670
*/
9671
public void setAsciiStream(String parameterName, java.io.InputStream x, int length)
9672
throws SQLException{
9673
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9674
}
9675
9676
9677
/**
9678
* Sets the designated parameter to the given input stream, which will have
9679
* the specified number of bytes.
9680
* When a very large binary value is input to a <code>LONGVARBINARY</code>
9681
* parameter, it may be more practical to send it via a
9682
* <code>java.io.InputStream</code> object. The data will be read from the stream
9683
* as needed until end-of-file is reached.
9684
*
9685
* <P><B>Note:</B> This stream object can either be a standard
9686
* Java stream object or your own subclass that implements the
9687
* standard interface.
9688
*
9689
* @param parameterName the name of the parameter
9690
* @param x the java input stream which contains the binary parameter value
9691
* @param length the number of bytes in the stream
9692
* @exception SQLException if a database access error occurs or
9693
* this method is called on a closed <code>CallableStatement</code>
9694
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9695
* this method
9696
* @since 1.4
9697
*/
9698
public void setBinaryStream(String parameterName, java.io.InputStream x,
9699
int length) throws SQLException{
9700
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9701
}
9702
9703
9704
/**
9705
* Sets the designated parameter to the given <code>Reader</code>
9706
* object, which is the given number of characters long.
9707
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
9708
* parameter, it may be more practical to send it via a
9709
* <code>java.io.Reader</code> object. The data will be read from the stream
9710
* as needed until end-of-file is reached. The JDBC driver will
9711
* do any necessary conversion from UNICODE to the database char format.
9712
*
9713
* <P><B>Note:</B> This stream object can either be a standard
9714
* Java stream object or your own subclass that implements the
9715
* standard interface.
9716
*
9717
* @param parameterName the name of the parameter
9718
* @param reader the <code>java.io.Reader</code> object that
9719
* contains the UNICODE data used as the designated parameter
9720
* @param length the number of characters in the stream
9721
* @exception SQLException if a database access error occurs or
9722
* this method is called on a closed <code>CallableStatement</code>
9723
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9724
* this method
9725
* @since 1.4
9726
*/
9727
public void setCharacterStream(String parameterName,
9728
java.io.Reader reader,
9729
int length) throws SQLException{
9730
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9731
}
9732
9733
9734
/**
9735
* Sets the designated parameter to the given input stream.
9736
* When a very large ASCII value is input to a <code>LONGVARCHAR</code>
9737
* parameter, it may be more practical to send it via a
9738
* <code>java.io.InputStream</code>. Data will be read from the stream
9739
* as needed until end-of-file is reached. The JDBC driver will
9740
* do any necessary conversion from ASCII to the database char format.
9741
*
9742
* <P><B>Note:</B> This stream object can either be a standard
9743
* Java stream object or your own subclass that implements the
9744
* standard interface.
9745
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
9746
* it might be more efficient to use a version of
9747
* <code>setAsciiStream</code> which takes a length parameter.
9748
*
9749
* @param parameterName the name of the parameter
9750
* @param x the Java input stream that contains the ASCII parameter value
9751
* @exception SQLException if a database access error occurs or
9752
* this method is called on a closed <code>CallableStatement</code>
9753
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9754
* @since 1.6
9755
*/
9756
public void setAsciiStream(String parameterName, java.io.InputStream x)
9757
throws SQLException{
9758
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9759
}
9760
9761
9762
/**
9763
* Sets the designated parameter to the given input stream.
9764
* When a very large binary value is input to a <code>LONGVARBINARY</code>
9765
* parameter, it may be more practical to send it via a
9766
* <code>java.io.InputStream</code> object. The data will be read from the
9767
* stream as needed until end-of-file is reached.
9768
*
9769
* <P><B>Note:</B> This stream object can either be a standard
9770
* Java stream object or your own subclass that implements the
9771
* standard interface.
9772
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
9773
* it might be more efficient to use a version of
9774
* <code>setBinaryStream</code> which takes a length parameter.
9775
*
9776
* @param parameterName the name of the parameter
9777
* @param x the java input stream which contains the binary parameter value
9778
* @exception SQLException if a database access error occurs or
9779
* this method is called on a closed <code>CallableStatement</code>
9780
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9781
* @since 1.6
9782
*/
9783
public void setBinaryStream(String parameterName, java.io.InputStream x)
9784
throws SQLException{
9785
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9786
}
9787
9788
9789
9790
/**
9791
* Sets the designated parameter to the given <code>Reader</code>
9792
* object.
9793
* When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
9794
* parameter, it may be more practical to send it via a
9795
* <code>java.io.Reader</code> object. The data will be read from the stream
9796
* as needed until end-of-file is reached. The JDBC driver will
9797
* do any necessary conversion from UNICODE to the database char format.
9798
*
9799
* <P><B>Note:</B> This stream object can either be a standard
9800
* Java stream object or your own subclass that implements the
9801
* standard interface.
9802
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
9803
* it might be more efficient to use a version of
9804
* <code>setCharacterStream</code> which takes a length parameter.
9805
*
9806
* @param parameterName the name of the parameter
9807
* @param reader the <code>java.io.Reader</code> object that contains the
9808
* Unicode data
9809
* @exception SQLException if a database access error occurs or
9810
* this method is called on a closed <code>CallableStatement</code>
9811
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
9812
* @since 1.6
9813
*/
9814
public void setCharacterStream(String parameterName,
9815
java.io.Reader reader) throws SQLException{
9816
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9817
}
9818
9819
/**
9820
* Sets the designated parameter to the given
9821
* <code>java.math.BigDecimal</code> value.
9822
* The driver converts this to an SQL <code>NUMERIC</code> value when
9823
* it sends it to the database.
9824
*
9825
* @param parameterName the name of the parameter
9826
* @param x the parameter value
9827
* @exception SQLException if a database access error occurs or
9828
* this method is called on a closed <code>CallableStatement</code>
9829
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9830
* this method
9831
* @see #getBigDecimal
9832
* @since 1.4
9833
*/
9834
public void setBigDecimal(String parameterName, BigDecimal x) throws SQLException{
9835
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9836
}
9837
9838
9839
9840
/**
9841
* Sets the designated parameter to the given Java <code>String</code> value.
9842
* The driver converts this
9843
* to an SQL <code>VARCHAR</code> or <code>LONGVARCHAR</code> value
9844
* (depending on the argument's
9845
* size relative to the driver's limits on <code>VARCHAR</code> values)
9846
* when it sends it to the database.
9847
*
9848
* @param parameterName the name of the parameter
9849
* @param x the parameter value
9850
* @exception SQLException if a database access error occurs or
9851
* this method is called on a closed <code>CallableStatement</code>
9852
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9853
* this method
9854
* @see #getString
9855
* @since 1.4
9856
*/
9857
public void setString(String parameterName, String x) throws SQLException{
9858
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9859
}
9860
9861
9862
9863
/**
9864
* Sets the designated parameter to the given Java array of bytes.
9865
* The driver converts this to an SQL <code>VARBINARY</code> or
9866
* <code>LONGVARBINARY</code> (depending on the argument's size relative
9867
* to the driver's limits on <code>VARBINARY</code> values) when it sends
9868
* it to the database.
9869
*
9870
* @param parameterName the name of the parameter
9871
* @param x the parameter value
9872
* @exception SQLException if a database access error occurs or
9873
* this method is called on a closed <code>CallableStatement</code>
9874
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9875
* this method
9876
* @see #getBytes
9877
* @since 1.4
9878
*/
9879
public void setBytes(String parameterName, byte x[]) throws SQLException{
9880
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9881
}
9882
9883
9884
9885
/**
9886
* Sets the designated parameter to the given <code>java.sql.Timestamp</code> value.
9887
* The driver
9888
* converts this to an SQL <code>TIMESTAMP</code> value when it sends it to the
9889
* database.
9890
*
9891
* @param parameterName the name of the parameter
9892
* @param x the parameter value
9893
* @exception SQLException if a database access error occurs or
9894
* this method is called on a closed <code>CallableStatement</code>
9895
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9896
* this method
9897
* @see #getTimestamp
9898
* @since 1.4
9899
*/
9900
public void setTimestamp(String parameterName, java.sql.Timestamp x)
9901
throws SQLException{
9902
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9903
}
9904
9905
/**
9906
* Sets the designated parameter to SQL <code>NULL</code>.
9907
*
9908
* <P><B>Note:</B> You must specify the parameter's SQL type.
9909
*
9910
* @param parameterName the name of the parameter
9911
* @param sqlType the SQL type code defined in <code>java.sql.Types</code>
9912
* @exception SQLException if a database access error occurs or
9913
* this method is called on a closed <code>CallableStatement</code>
9914
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9915
* this method
9916
* @since 1.4
9917
*/
9918
public void setNull(String parameterName, int sqlType) throws SQLException {
9919
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9920
}
9921
9922
9923
/**
9924
* Sets the designated parameter to SQL <code>NULL</code>.
9925
* This version of the method <code>setNull</code> should
9926
* be used for user-defined types and REF type parameters. Examples
9927
* of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and
9928
* named array types.
9929
*
9930
* <P><B>Note:</B> To be portable, applications must give the
9931
* SQL type code and the fully-qualified SQL type name when specifying
9932
* a NULL user-defined or REF parameter. In the case of a user-defined type
9933
* the name is the type name of the parameter itself. For a REF
9934
* parameter, the name is the type name of the referenced type. If
9935
* a JDBC driver does not need the type code or type name information,
9936
* it may ignore it.
9937
*
9938
* Although it is intended for user-defined and Ref parameters,
9939
* this method may be used to set a null parameter of any JDBC type.
9940
* If the parameter does not have a user-defined or REF type, the given
9941
* typeName is ignored.
9942
*
9943
*
9944
* @param parameterName the name of the parameter
9945
* @param sqlType a value from <code>java.sql.Types</code>
9946
* @param typeName the fully-qualified name of an SQL user-defined type;
9947
* ignored if the parameter is not a user-defined type or
9948
* SQL <code>REF</code> value
9949
* @exception SQLException if a database access error occurs or
9950
* this method is called on a closed <code>CallableStatement</code>
9951
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9952
* this method
9953
* @since 1.4
9954
*/
9955
public void setNull (String parameterName, int sqlType, String typeName)
9956
throws SQLException{
9957
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9958
}
9959
9960
9961
9962
/**
9963
* Sets the designated parameter to the given Java <code>boolean</code> value.
9964
* The driver converts this
9965
* to an SQL <code>BIT</code> or <code>BOOLEAN</code> value when it sends it to the database.
9966
*
9967
* @param parameterName the name of the parameter
9968
* @param x the parameter value
9969
* @exception SQLException if a database access error occurs or
9970
* this method is called on a closed <code>CallableStatement</code>
9971
* @see #getBoolean
9972
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9973
* this method
9974
* @since 1.4
9975
*/
9976
public void setBoolean(String parameterName, boolean x) throws SQLException{
9977
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9978
}
9979
9980
9981
9982
/**
9983
* Sets the designated parameter to the given Java <code>byte</code> value.
9984
* The driver converts this
9985
* to an SQL <code>TINYINT</code> value when it sends it to the database.
9986
*
9987
* @param parameterName the name of the parameter
9988
* @param x the parameter value
9989
* @exception SQLException if a database access error occurs or
9990
* this method is called on a closed <code>CallableStatement</code>
9991
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
9992
* this method
9993
* @see #getByte
9994
* @since 1.4
9995
*/
9996
public void setByte(String parameterName, byte x) throws SQLException{
9997
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
9998
}
9999
10000
10001
10002
/**
10003
* Sets the designated parameter to the given Java <code>short</code> value.
10004
* The driver converts this
10005
* to an SQL <code>SMALLINT</code> value when it sends it to the database.
10006
*
10007
* @param parameterName the name of the parameter
10008
* @param x the parameter value
10009
* @exception SQLException if a database access error occurs or
10010
* this method is called on a closed <code>CallableStatement</code>
10011
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
10012
* this method
10013
* @see #getShort
10014
* @since 1.4
10015
*/
10016
public void setShort(String parameterName, short x) throws SQLException{
10017
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
10018
}
10019
10020
10021
/**
10022
* Sets the designated parameter to the given Java <code>int</code> value.
10023
* The driver converts this
10024
* to an SQL <code>INTEGER</code> value when it sends it to the database.
10025
*
10026
* @param parameterName the name of the parameter
10027
* @param x the parameter value
10028
* @exception SQLException if a database access error occurs or
10029
* this method is called on a closed <code>CallableStatement</code>
10030
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
10031
* this method
10032
* @see #getInt
10033
* @since 1.4
10034
*/
10035
public void setInt(String parameterName, int x) throws SQLException{
10036
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
10037
}
10038
10039
10040
/**
10041
* Sets the designated parameter to the given Java <code>long</code> value.
10042
* The driver converts this
10043
* to an SQL <code>BIGINT</code> value when it sends it to the database.
10044
*
10045
* @param parameterName the name of the parameter
10046
* @param x the parameter value
10047
* @exception SQLException if a database access error occurs or
10048
* this method is called on a closed <code>CallableStatement</code>
10049
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
10050
* this method
10051
* @see #getLong
10052
* @since 1.4
10053
*/
10054
public void setLong(String parameterName, long x) throws SQLException{
10055
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
10056
}
10057
10058
10059
/**
10060
* Sets the designated parameter to the given Java <code>float</code> value.
10061
* The driver converts this
10062
* to an SQL <code>FLOAT</code> value when it sends it to the database.
10063
*
10064
* @param parameterName the name of the parameter
10065
* @param x the parameter value
10066
* @exception SQLException if a database access error occurs or
10067
* this method is called on a closed <code>CallableStatement</code>
10068
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
10069
* this method
10070
* @see #getFloat
10071
* @since 1.4
10072
*/
10073
public void setFloat(String parameterName, float x) throws SQLException{
10074
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
10075
}
10076
10077
10078
/**
10079
* Sets the designated parameter to the given Java <code>double</code> value.
10080
* The driver converts this
10081
* to an SQL <code>DOUBLE</code> value when it sends it to the database.
10082
*
10083
* @param parameterName the name of the parameter
10084
* @param x the parameter value
10085
* @exception SQLException if a database access error occurs or
10086
* this method is called on a closed <code>CallableStatement</code>
10087
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
10088
* this method
10089
* @see #getDouble
10090
* @since 1.4
10091
*/
10092
public void setDouble(String parameterName, double x) throws SQLException{
10093
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("cachedrowsetimpl.featnotsupp").toString());
10094
}
10095
10096
/**
10097
* This method re populates the resBundle
10098
* during the deserialization process
10099
*
10100
*/
10101
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
10102
// Default state initialization happens here
10103
ois.defaultReadObject();
10104
// Initialization of transient Res Bundle happens here .
10105
try {
10106
resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
10107
} catch(IOException ioe) {
10108
throw new RuntimeException(ioe);
10109
}
10110
10111
}
10112
10113
//------------------------- JDBC 4.1 -----------------------------------
10114
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
10115
throw new SQLFeatureNotSupportedException("Not supported yet.");
10116
}
10117
10118
public <T> T getObject(String columnLabel, Class<T> type) throws SQLException {
10119
throw new SQLFeatureNotSupportedException("Not supported yet.");
10120
}
10121
10122
static final long serialVersionUID =1884577171200622428L;
10123
}
10124
10125