Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.sql.rowset/share/classes/javax/sql/rowset/WebRowSet.java
40948 views
1
/*
2
* Copyright (c) 2003, 2019, 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 javax.sql.rowset;
27
28
import java.sql.*;
29
import javax.sql.*;
30
import javax.naming.*;
31
import java.io.*;
32
import java.math.*;
33
import org.xml.sax.*;
34
35
/**
36
* The standard interface that all implementations of a {@code WebRowSet}
37
* must implement.
38
*
39
* <h2>1.0 Overview</h2>
40
* The {@code WebRowSetImpl} provides the standard
41
* reference implementation, which may be extended if required.
42
* <P>
43
* The standard WebRowSet XML Schema definition is available at the following
44
* URI:
45
* <ul>
46
* <li>
47
* <a href="http://xmlns.jcp.org/xml/ns//jdbc/webrowset.xsd">http://xmlns.jcp.org/xml/ns//jdbc/webrowset.xsd</a>
48
* </li>
49
* </ul>
50
* It describes the standard XML document format required when describing a
51
* {@code RowSet} object in XML and must be used be all standard implementations
52
* of the {@code WebRowSet} interface to ensure interoperability. In addition,
53
* the {@code WebRowSet} schema uses specific SQL/XML Schema annotations,
54
* thus ensuring greater cross
55
* platform interoperability. This is an effort currently under way at the ISO
56
* organization. The SQL/XML definition is available at the following URI:
57
* <ul>
58
* <li>
59
* <a href="http://standards.iso.org/iso/9075/2002/12/sqlxml.xsd">http://standards.iso.org/iso/9075/2002/12/sqlxml.xsd</a>
60
* </li>
61
* </ul>
62
* The schema definition describes the internal data of a {@code RowSet} object
63
* in three distinct areas:
64
* <UL>
65
* <li>properties - These properties describe the standard synchronization
66
* provider properties in addition to the more general {@code RowSet} properties.
67
* </li>
68
* <li>metadata - This describes the metadata associated with the tabular structure governed by a
69
* {@code WebRowSet} object. The metadata described is closely aligned with the
70
* metadata accessible in the underlying {@code java.sql.ResultSet} interface.
71
* </li>
72
* <li>data - This describes the original data (the state of data since the
73
* last population
74
* or last synchronization of the {@code WebRowSet} object) and the current
75
* data. By keeping track of the delta between the original data and the current data,
76
* a {@code WebRowSet} maintains the ability to synchronize changes
77
* in its data back to the originating data source.
78
* </li>
79
* </ul>
80
*
81
* <h2>2.0 WebRowSet States</h2>
82
* The following sections demonstrates how a {@code WebRowSet} implementation
83
* should use the XML Schema to describe update, insert, and delete operations
84
* and to describe the state of a {@code WebRowSet} object in XML.
85
*
86
* <h2>2.1 State 1 - Outputting a {@code WebRowSet} Object to XML</h2>
87
* In this example, a {@code WebRowSet} object is created and populated with a simple 2 column,
88
* 5 row table from a data source. Having the 5 rows in a {@code WebRowSet} object
89
* makes it possible to describe them in XML. The
90
* metadata describing the various standard JavaBeans properties as defined
91
* in the RowSet interface plus the standard properties defined in
92
* the {@code CachedRowSet} interface
93
* provide key details that describe WebRowSet
94
* properties. Outputting the WebRowSet object to XML using the standard
95
* {@code writeXml} methods describes the internal properties as follows:
96
* <PRE>
97
* {@code
98
* <properties>
99
* <command>select co1, col2 from test_table</command>
100
* <concurrency>1</concurrency>
101
* <datasource/>
102
* <escape-processing>true</escape-processing>
103
* <fetch-direction>0</fetch-direction>
104
* <fetch-size>0</fetch-size>
105
* <isolation-level>1</isolation-level>
106
* <key-columns/>
107
* <map/>
108
* <max-field-size>0</max-field-size>
109
* <max-rows>0</max-rows>
110
* <query-timeout>0</query-timeout>
111
* <read-only>false</read-only>
112
* <rowset-type>TRANSACTION_READ_UNCOMMITTED</rowset-type>
113
* <show-deleted>false</show-deleted>
114
* <table-name/>
115
* <url>jdbc:thin:oracle</url>
116
* <sync-provider>
117
* <sync-provider-name>.com.rowset.provider.RIOptimisticProvider</sync-provider-name>
118
* <sync-provider-vendor>Oracle Corporation</sync-provider-vendor>
119
* <sync-provider-version>1.0</sync-provider-name>
120
* <sync-provider-grade>LOW</sync-provider-grade>
121
* <data-source-lock>NONE</data-source-lock>
122
* </sync-provider>
123
* </properties>
124
* } </PRE>
125
* The meta-data describing the make up of the WebRowSet is described
126
* in XML as detailed below. Note both columns are described between the
127
* {@code column-definition} tags.
128
* <PRE>
129
* {@code
130
* <metadata>
131
* <column-count>2</column-count>
132
* <column-definition>
133
* <column-index>1</column-index>
134
* <auto-increment>false</auto-increment>
135
* <case-sensitive>true</case-sensitive>
136
* <currency>false</currency>
137
* <nullable>1</nullable>
138
* <signed>false</signed>
139
* <searchable>true</searchable>
140
* <column-display-size>10</column-display-size>
141
* <column-label>COL1</column-label>
142
* <column-name>COL1</column-name>
143
* <schema-name/>
144
* <column-precision>10</column-precision>
145
* <column-scale>0</column-scale>
146
* <table-name/>
147
* <catalog-name/>
148
* <column-type>1</column-type>
149
* <column-type-name>CHAR</column-type-name>
150
* </column-definition>
151
* <column-definition>
152
* <column-index>2</column-index>
153
* <auto-increment>false</auto-increment>
154
* <case-sensitive>false</case-sensitive>
155
* <currency>false</currency>
156
* <nullable>1</nullable>
157
* <signed>true</signed>
158
* <searchable>true</searchable>
159
* <column-display-size>39</column-display-size>
160
* <column-label>COL2</column-label>
161
* <column-name>COL2</column-name>
162
* <schema-name/>
163
* <column-precision>38</column-precision>
164
* <column-scale>0</column-scale>
165
* <table-name/>
166
* <catalog-name/>
167
* <column-type>3</column-type>
168
* <column-type-name>NUMBER</column-type-name>
169
* </column-definition>
170
* </metadata>
171
* }</PRE>
172
* Having detailed how the properties and metadata are described, the following details
173
* how the contents of a {@code WebRowSet} object is described in XML. Note, that
174
* this describes a {@code WebRowSet} object that has not undergone any
175
* modifications since its instantiation.
176
* A {@code currentRow} tag is mapped to each row of the table structure that the
177
* {@code WebRowSet} object provides. A {@code columnValue} tag may contain
178
* either the {@code stringData} or {@code binaryData} tag, according to
179
* the SQL type that
180
* the XML value is mapping back to. The {@code binaryData} tag contains data in the
181
* Base64 encoding and is typically used for {@code BLOB} and {@code CLOB} type data.
182
* <PRE>
183
* {@code
184
* <data>
185
* <currentRow>
186
* <columnValue>
187
* firstrow
188
* </columnValue>
189
* <columnValue>
190
* 1
191
* </columnValue>
192
* </currentRow>
193
* <currentRow>
194
* <columnValue>
195
* secondrow
196
* </columnValue>
197
* <columnValue>
198
* 2
199
* </columnValue>
200
* </currentRow>
201
* <currentRow>
202
* <columnValue>
203
* thirdrow
204
* </columnValue>
205
* <columnValue>
206
* 3
207
* </columnValue>
208
* </currentRow>
209
* <currentRow>
210
* <columnValue>
211
* fourthrow
212
* </columnValue>
213
* <columnValue>
214
* 4
215
* </columnValue>
216
* </currentRow>
217
* </data>
218
* }</PRE>
219
* <h2>2.2 State 2 - Deleting a Row</h2>
220
* Deleting a row in a {@code WebRowSet} object involves simply moving to the row
221
* to be deleted and then calling the method {@code deleteRow}, as in any other
222
* {@code RowSet} object. The following
223
* two lines of code, in which <i>wrs</i> is a {@code WebRowSet} object, delete
224
* the third row.
225
* <PRE>
226
* wrs.absolute(3);
227
* wrs.deleteRow();
228
* </PRE>
229
* The XML description shows the third row is marked as a {@code deleteRow},
230
* which eliminates the third row in the {@code WebRowSet} object.
231
* <PRE>
232
* {@code
233
* <data>
234
* <currentRow>
235
* <columnValue>
236
* firstrow
237
* </columnValue>
238
* <columnValue>
239
* 1
240
* </columnValue>
241
* </currentRow>
242
* <currentRow>
243
* <columnValue>
244
* secondrow
245
* </columnValue>
246
* <columnValue>
247
* 2
248
* </columnValue>
249
* </currentRow>
250
* <deleteRow>
251
* <columnValue>
252
* thirdrow
253
* </columnValue>
254
* <columnValue>
255
* 3
256
* </columnValue>
257
* </deleteRow>
258
* <currentRow>
259
* <columnValue>
260
* fourthrow
261
* </columnValue>
262
* <columnValue>
263
* 4
264
* </columnValue>
265
* </currentRow>
266
* </data>
267
*} </PRE>
268
* <h2>2.3 State 3 - Inserting a Row</h2>
269
* A {@code WebRowSet} object can insert a new row by moving to the insert row,
270
* calling the appropriate updater methods for each column in the row, and then
271
* calling the method {@code insertRow}.
272
* <PRE>
273
* {@code
274
* wrs.moveToInsertRow();
275
* wrs.updateString(1, "fifththrow");
276
* wrs.updateString(2, "5");
277
* wrs.insertRow();
278
* }</PRE>
279
* The following code fragment changes the second column value in the row just inserted.
280
* Note that this code applies when new rows are inserted right after the current row,
281
* which is why the method {@code next} moves the cursor to the correct row.
282
* Calling the method {@code acceptChanges} writes the change to the data source.
283
*
284
* <PRE>
285
* {@code wrs.moveToCurrentRow();
286
* wrs.next();
287
* wrs.updateString(2, "V");
288
* wrs.acceptChanges();
289
* }</PRE>
290
* Describing this in XML demonstrates where the Java code inserts a new row and then
291
* performs an update on the newly inserted row on an individual field.
292
* <PRE>
293
* {@code
294
* <data>
295
* <currentRow>
296
* <columnValue>
297
* firstrow
298
* </columnValue>
299
* <columnValue>
300
* 1
301
* </columnValue>
302
* </currentRow>
303
* <currentRow>
304
* <columnValue>
305
* secondrow
306
* </columnValue>
307
* <columnValue>
308
* 2
309
* </columnValue>
310
* </currentRow>
311
* <currentRow>
312
* <columnValue>
313
* newthirdrow
314
* </columnValue>
315
* <columnValue>
316
* III
317
* </columnValue>
318
* </currentRow>
319
* <insertRow>
320
* <columnValue>
321
* fifthrow
322
* </columnValue>
323
* <columnValue>
324
* 5
325
* </columnValue>
326
* <updateValue>
327
* V
328
* </updateValue>
329
* </insertRow>
330
* <currentRow>
331
* <columnValue>
332
* fourthrow
333
* </columnValue>
334
* <columnValue>
335
* 4
336
* </columnValue>
337
* </currentRow>
338
* </date>
339
*} </PRE>
340
* <h2>2.4 State 4 - Modifying a Row</h2>
341
* Modifying a row produces specific XML that records both the new value and the
342
* value that was replaced. The value that was replaced becomes the original value,
343
* and the new value becomes the current value. The following
344
* code moves the cursor to a specific row, performs some modifications, and updates
345
* the row when complete.
346
* <PRE>
347
*{@code
348
* wrs.absolute(5);
349
* wrs.updateString(1, "new4thRow");
350
* wrs.updateString(2, "IV");
351
* wrs.updateRow();
352
* }</PRE>
353
* In XML, this is described by the {@code modifyRow} tag. Both the original and new
354
* values are contained within the tag for original row tracking purposes.
355
* <PRE>
356
* {@code
357
* <data>
358
* <currentRow>
359
* <columnValue>
360
* firstrow
361
* </columnValue>
362
* <columnValue>
363
* 1
364
* </columnValue>
365
* </currentRow>
366
* <currentRow>
367
* <columnValue>
368
* secondrow
369
* </columnValue>
370
* <columnValue>
371
* 2
372
* </columnValue>
373
* </currentRow>
374
* <currentRow>
375
* <columnValue>
376
* newthirdrow
377
* </columnValue>
378
* <columnValue>
379
* III
380
* </columnValue>
381
* </currentRow>
382
* <currentRow>
383
* <columnValue>
384
* fifthrow
385
* </columnValue>
386
* <columnValue>
387
* 5
388
* </columnValue>
389
* </currentRow>
390
* <modifyRow>
391
* <columnValue>
392
* fourthrow
393
* </columnValue>
394
* <updateValue>
395
* new4thRow
396
* </updateValue>
397
* <columnValue>
398
* 4
399
* </columnValue>
400
* <updateValue>
401
* IV
402
* </updateValue>
403
* </modifyRow>
404
* </data>
405
* }</PRE>
406
*
407
* @see javax.sql.rowset.JdbcRowSet
408
* @see javax.sql.rowset.CachedRowSet
409
* @see javax.sql.rowset.FilteredRowSet
410
* @see javax.sql.rowset.JoinRowSet
411
* @since 1.5
412
*/
413
414
public interface WebRowSet extends CachedRowSet {
415
416
/**
417
* Reads a {@code WebRowSet} object in its XML format from the given
418
* {@code Reader} object.
419
*
420
* @param reader the {@code java.io.Reader} stream from which this
421
* {@code WebRowSet} object will be populated
422
423
* @throws SQLException if a database access error occurs
424
*/
425
public void readXml(java.io.Reader reader) throws SQLException;
426
427
/**
428
* Reads a stream based XML input to populate this {@code WebRowSet}
429
* object.
430
*
431
* @param iStream the {@code java.io.InputStream} from which this
432
* {@code WebRowSet} object will be populated
433
* @throws SQLException if a data source access error occurs
434
* @throws IOException if an IO exception occurs
435
*/
436
public void readXml(java.io.InputStream iStream) throws SQLException, IOException;
437
438
/**
439
* Populates this {@code WebRowSet} object with
440
* the contents of the given {@code ResultSet} object and writes its
441
* data, properties, and metadata
442
* to the given {@code Writer} object in XML format.
443
* <p>
444
* NOTE: The {@code WebRowSet} cursor may be moved to write out the
445
* contents to the XML data source. If implemented in this way, the cursor <b>must</b>
446
* be returned to its position just prior to the {@code writeXml()} call.
447
*
448
* @param rs the {@code ResultSet} object with which to populate this
449
* {@code WebRowSet} object
450
* @param writer the {@code java.io.Writer} object to write to.
451
* @throws SQLException if an error occurs writing out the rowset
452
* contents in XML format
453
*/
454
public void writeXml(ResultSet rs, java.io.Writer writer) throws SQLException;
455
456
/**
457
* Populates this {@code WebRowSet} object with
458
* the contents of the given {@code ResultSet} object and writes its
459
* data, properties, and metadata
460
* to the given {@code OutputStream} object in XML format.
461
* <p>
462
* NOTE: The {@code WebRowSet} cursor may be moved to write out the
463
* contents to the XML data source. If implemented in this way, the cursor <b>must</b>
464
* be returned to its position just prior to the {@code writeXml()} call.
465
*
466
* @param rs the {@code ResultSet} object with which to populate this
467
* {@code WebRowSet} object
468
* @param oStream the {@code java.io.OutputStream} to write to
469
* @throws SQLException if a data source access error occurs
470
* @throws IOException if a IO exception occurs
471
*/
472
public void writeXml(ResultSet rs, java.io.OutputStream oStream) throws SQLException, IOException;
473
474
/**
475
* Writes the data, properties, and metadata for this {@code WebRowSet} object
476
* to the given {@code Writer} object in XML format.
477
*
478
* @param writer the {@code java.io.Writer} stream to write to
479
* @throws SQLException if an error occurs writing out the rowset
480
* contents to XML
481
*/
482
public void writeXml(java.io.Writer writer) throws SQLException;
483
484
/**
485
* Writes the data, properties, and metadata for this {@code WebRowSet} object
486
* to the given {@code OutputStream} object in XML format.
487
*
488
* @param oStream the {@code java.io.OutputStream} stream to write to
489
* @throws SQLException if a data source access error occurs
490
* @throws IOException if a IO exception occurs
491
*/
492
public void writeXml(java.io.OutputStream oStream) throws SQLException, IOException;
493
494
/**
495
* The public identifier for the XML Schema definition that defines the XML
496
* tags and their valid values for a {@code WebRowSet} implementation.
497
*/
498
public static String PUBLIC_XML_SCHEMA =
499
"--//Oracle Corporation//XSD Schema//EN";
500
501
/**
502
* The URL for the XML Schema definition file that defines the XML tags and
503
* their valid values for a {@code WebRowSet} implementation.
504
*/
505
public static String SCHEMA_SYSTEM_ID = "http://java.sun.com/xml/ns/jdbc/webrowset.xsd";
506
}
507
508