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 java.io.*;
34 
35 /**
36  * The standard interface that all standard implementations of
37  * <code>JdbcRowSet</code> must implement.
38  *
39  * <h2>1.0 Overview</h2>
40  * A wrapper around a <code>ResultSet</code> object that makes it possible
41  * to use the result set as a JavaBeans&trade;
42  * component.  Thus, a <code>JdbcRowSet</code> object can be one of the Beans that
43  * a tool makes available for composing an application.  Because
44  * a <code>JdbcRowSet</code> is a connected rowset, that is, it continually
45  * maintains its connection to a database using a JDBC technology-enabled
46  * driver, it also effectively makes the driver a JavaBeans component.
47  * <P>
48  * Because it is always connected to its database, an instance of
49  * <code>JdbcRowSet</code>
50  * can simply take calls invoked on it and in turn call them on its
51  * <code>ResultSet</code> object. As a consequence, a result set can, for
52  * example, be a component in a Swing application.
53  * <P>
54  * Another advantage of a <code>JdbcRowSet</code> object is that it can be
55  * used to make a <code>ResultSet</code> object scrollable and updatable.  All
56  * <code>RowSet</code> objects are by default scrollable and updatable. If
57  * the driver and database being used do not support scrolling and/or updating
58  * of result sets, an application can populate a <code>JdbcRowSet</code> object
59  * with the data of a <code>ResultSet</code> object and then operate on the
60  * <code>JdbcRowSet</code> object as if it were the <code>ResultSet</code>
61  * object.
62  *
63  * <h2>2.0 Creating a <code>JdbcRowSet</code> Object</h2>
64  * The reference implementation of the <code>JdbcRowSet</code> interface,
65  * <code>JdbcRowSetImpl</code>, provides an implementation of
66  * the default constructor.  A new instance is initialized with
67  * default values, which can be set with new values as needed. A
68  * new instance is not really functional until its <code>execute</code>
69  * method is called. In general, this method does the following:
70  * <UL>
71  *   <LI> establishes a connection with a database
72  *   <LI> creates a <code>PreparedStatement</code> object and sets any of its
73  *        placeholder parameters
74  *   <LI> executes the statement to create a <code>ResultSet</code> object
75  * </UL>
76  * If the <code>execute</code> method is successful, it will set the
77  * appropriate private <code>JdbcRowSet</code> fields with the following:
78  * <UL>
79  *  <LI> a <code>Connection</code> object -- the connection between the rowset
80  *       and the database
81  *  <LI> a <code>PreparedStatement</code> object -- the query that produces
82  *       the result set
83  *  <LI> a <code>ResultSet</code> object -- the result set that the rowset's
84  *       command produced and that is being made, in effect, a JavaBeans
85  *       component
86  * </UL>
87  * If these fields have not been set, meaning that the <code>execute</code>
88  * method has not executed successfully, no methods other than
89  * <code>execute</code> and <code>close</code> may be called on the
90  * rowset.  All other public methods will throw an exception.
91  * <P>
92  * Before calling the <code>execute</code> method, however, the command
93  * and properties needed for establishing a connection must be set.
94  * The following code fragment creates a <code>JdbcRowSetImpl</code> object,
95  * sets the command and connection properties, sets the placeholder parameter,
96  * and then invokes the method <code>execute</code>.
97  * <PRE>
98  *     JdbcRowSetImpl jrs = new JdbcRowSetImpl();
99  *     jrs.setCommand("SELECT * FROM TITLES WHERE TYPE = ?");
100  *     jrs.setURL("jdbc:myDriver:myAttribute");
101  *     jrs.setUsername("cervantes");
102  *     jrs.setPassword("sancho");
103  *     jrs.setString(1, "BIOGRAPHY");
104  *     jrs.execute();
105  * </PRE>
106  * The variable <code>jrs</code> now represents an instance of
107  * <code>JdbcRowSetImpl</code> that is a thin wrapper around the
108  * <code>ResultSet</code> object containing all the rows in the
109  * table <code>TITLES</code> where the type of book is biography.
110  * At this point, operations called on <code>jrs</code> will
111  * affect the rows in the result set, which is effectively a JavaBeans
112  * component.
113  * <P>
114  * The implementation of the <code>RowSet</code> method <code>execute</code> in the
115  * <code>JdbcRowSet</code> reference implementation differs from that in the
116  * <code>CachedRowSet</code>&trade;
117  * reference implementation to account for the different
118  * requirements of connected and disconnected <code>RowSet</code> objects.
119  *
120  * @author Jonathan Bruce
121  * @since 1.5
122  */
123 
124 public interface JdbcRowSet extends RowSet, Joinable {
125 
126     /**
127      * Retrieves a <code>boolean</code> indicating whether rows marked
128      * for deletion appear in the set of current rows. If <code>true</code> is
129      * returned, deleted rows are visible with the current rows. If
130      * <code>false</code> is returned, rows are not visible with the set of
131      * current rows. The default value is <code>false</code>.
132      * <P>
133      * Standard rowset implementations may choose to restrict this behavior
134      * for security considerations or for certain deployment
135      * scenarios. The visibility of deleted rows is implementation-defined
136      * and does not represent standard behavior.
137      * <P>
138      * Note: Allowing deleted rows to remain visible complicates the behavior
139      * of some standard JDBC <code>RowSet</code> implementations methods.
140      * However, most rowset users can simply ignore this extra detail because
141      * only very specialized applications will likely want to take advantage of
142      * this feature.
143      *
144      * @return <code>true</code> if deleted rows are visible;
145      *         <code>false</code> otherwise
146      * @exception SQLException if a rowset implementation is unable to
147      *          to determine whether rows marked for deletion remain visible
148      * @see #setShowDeleted
149      */
getShowDeleted()150     public boolean getShowDeleted() throws SQLException;
151 
152     /**
153      * Sets the property <code>showDeleted</code> to the given
154      * <code>boolean</code> value. This property determines whether
155      * rows marked for deletion continue to appear in the set of current rows.
156      * If the value is set to <code>true</code>, deleted rows are immediately
157      * visible with the set of current rows. If the value is set to
158      * <code>false</code>, the deleted rows are set as invisible with the
159      * current set of rows.
160      * <P>
161      * Standard rowset implementations may choose to restrict this behavior
162      * for security considerations or for certain deployment
163      * scenarios. This is left as implementation-defined and does not
164      * represent standard behavior.
165      *
166      * @param b <code>true</code> if deleted rows should be shown;
167      *              <code>false</code> otherwise
168      * @exception SQLException if a rowset implementation is unable to
169      *          to reset whether deleted rows should be visible
170      * @see #getShowDeleted
171      */
setShowDeleted(boolean b)172     public void setShowDeleted(boolean b) throws SQLException;
173 
174     /**
175      * Retrieves the first warning reported by calls on this <code>JdbcRowSet</code>
176      * object.
177      * If a second warning was reported on this <code>JdbcRowSet</code> object,
178      * it will be chained to the first warning and can be retrieved by
179      * calling the method <code>RowSetWarning.getNextWarning</code> on the
180      * first warning. Subsequent warnings on this <code>JdbcRowSet</code>
181      * object will be chained to the <code>RowSetWarning</code> objects
182      * returned by the method <code>RowSetWarning.getNextWarning</code>.
183      *
184      * The warning chain is automatically cleared each time a new row is read.
185      * This method may not be called on a <code>RowSet</code> object
186      * that has been closed;
187      * doing so will cause an <code>SQLException</code> to be thrown.
188      * <P>
189      * Because it is always connected to its data source, a <code>JdbcRowSet</code>
190      * object can rely on the presence of active
191      * <code>Statement</code>, <code>Connection</code>, and <code>ResultSet</code>
192      * instances. This means that  applications can obtain additional
193      * <code>SQLWarning</code>
194      * notifications by calling the <code>getNextWarning</code> methods that
195      * they provide.
196      * Disconnected <code>Rowset</code> objects, such as a
197      * <code>CachedRowSet</code> object, do not have access to
198      * these <code>getNextWarning</code> methods.
199      *
200      * @return the first <code>RowSetWarning</code>
201      * object reported on this <code>JdbcRowSet</code> object
202      * or <code>null</code> if there are none
203      * @throws SQLException if this method is called on a closed
204      * <code>JdbcRowSet</code> object
205      * @see RowSetWarning
206      */
getRowSetWarnings()207     public RowSetWarning getRowSetWarnings() throws SQLException;
208 
209    /**
210     * Each <code>JdbcRowSet</code> contains a <code>Connection</code> object from
211     * the <code>ResultSet</code> or JDBC properties passed to it's constructors.
212     * This method wraps the <code>Connection</code> commit method to allow flexible
213     * auto commit or non auto commit transactional control support.
214     * <p>
215     * Makes all changes made since the previous commit/rollback permanent
216     * and releases any database locks currently held by this Connection
217     * object. This method should be used only when auto-commit mode has
218     * been disabled.
219     *
220     * @throws SQLException if a database access error occurs or this
221     * Connection object within this <code>JdbcRowSet</code> is in auto-commit mode
222     * @see java.sql.Connection#setAutoCommit
223     */
commit()224     public void commit() throws SQLException;
225 
226 
227    /**
228     * Each <code>JdbcRowSet</code> contains a <code>Connection</code> object from
229     * the original <code>ResultSet</code> or JDBC properties passed to it. This
230     * method wraps the <code>Connection</code>'s <code>getAutoCommit</code> method
231     * to allow an application to determine the <code>JdbcRowSet</code> transaction
232     * behavior.
233     * <p>
234     * Sets this connection's auto-commit mode to the given state. If a
235     * connection is in auto-commit mode, then all its SQL statements will
236     * be executed and committed as individual transactions. Otherwise, its
237     * SQL statements are grouped into transactions that are terminated by a
238     * call to either the method commit or the method rollback. By default,
239     * new connections are in auto-commit mode.
240     *
241     * @return {@code true} if auto-commit is enabled; {@code false} otherwise
242     * @throws SQLException if a database access error occurs
243     * @see java.sql.Connection#getAutoCommit()
244     */
getAutoCommit()245     public boolean getAutoCommit() throws SQLException;
246 
247 
248    /**
249     * Each <code>JdbcRowSet</code> contains a <code>Connection</code> object from
250     * the original <code>ResultSet</code> or JDBC properties passed to it. This
251     * method wraps the <code>Connection</code>'s <code>getAutoCommit</code> method
252     * to allow an application to set the <code>JdbcRowSet</code> transaction behavior.
253     * <p>
254     * Sets the current auto-commit mode for this <code>Connection</code> object.
255     * @param autoCommit {@code true} to enable auto-commit; {@code false} to
256     * disable auto-commit
257     * @throws SQLException if a database access error occurs
258     * @see java.sql.Connection#setAutoCommit(boolean)
259     */
setAutoCommit(boolean autoCommit)260     public void setAutoCommit(boolean autoCommit) throws SQLException;
261 
262     /**
263      * Each <code>JdbcRowSet</code> contains a <code>Connection</code> object from
264      * the original <code>ResultSet</code> or JDBC properties passed to it.
265      * Undoes all changes made in the current transaction and releases any
266      * database locks currently held by this <code>Connection</code> object. This method
267      * should be used only when auto-commit mode has been disabled.
268      *
269      * @throws SQLException if a database access error occurs or this <code>Connection</code>
270      * object within this <code>JdbcRowSet</code> is in auto-commit mode.
271      * @see #rollback(Savepoint)
272      */
rollback()273      public void rollback() throws SQLException;
274 
275 
276     /**
277      * Each <code>JdbcRowSet</code> contains a <code>Connection</code> object from
278      * the original <code>ResultSet</code> or JDBC properties passed to it.
279      * Undoes all changes made in the current transaction to the last set savepoint
280      * and releases any database locks currently held by this <code>Connection</code>
281      * object. This method should be used only when auto-commit mode has been disabled.
282      * @param s The {@code Savepoint} to rollback to
283      * @throws SQLException if a database access error occurs or this <code>Connection</code>
284      * object within this <code>JdbcRowSet</code> is in auto-commit mode.
285      * @see #rollback
286      */
rollback(Savepoint s)287     public void rollback(Savepoint s) throws SQLException;
288 
289 }
290