/*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.rowset.internal;
import java.sql.*;
import java.io.*;
import java.lang.*;
import java.util.*;
A class that keeps track of a row's values. A Row
object
maintains an array of current column values and an array of original
column values, and it provides methods for getting and setting the
value of a column. It also keeps track of which columns have
changed and whether the change was a delete, insert, or update.
Note that column numbers for rowsets start at 1
,
whereas the first element of an array or bitset is 0
.
The argument for the method getColumnUpdated
refers to
the column number in the rowset (the first column is 1
);
the argument for setColumnUpdated
refers to the index
into the rowset's internal bitset (the first bit is 0
).
/**
* A class that keeps track of a row's values. A <code>Row</code> object
* maintains an array of current column values and an array of original
* column values, and it provides methods for getting and setting the
* value of a column. It also keeps track of which columns have
* changed and whether the change was a delete, insert, or update.
* <P>
* Note that column numbers for rowsets start at <code>1</code>,
* whereas the first element of an array or bitset is <code>0</code>.
* The argument for the method <code>getColumnUpdated</code> refers to
* the column number in the rowset (the first column is <code>1</code>);
* the argument for <code>setColumnUpdated</code> refers to the index
* into the rowset's internal bitset (the first bit is <code>0</code>).
*/
public class Row extends BaseRow implements Serializable, Cloneable {
static final long serialVersionUID = 5047859032611314762L;
An array containing the current column values for this Row
object.
@serial
/**
* An array containing the current column values for this <code>Row</code>
* object.
* @serial
*/
private Object[] currentVals;
A BitSet
object containing a flag for each column in
this Row
object, with each flag indicating whether or
not the value in the column has been changed.
@serial
/**
* A <code>BitSet</code> object containing a flag for each column in
* this <code>Row</code> object, with each flag indicating whether or
* not the value in the column has been changed.
* @serial
*/
private BitSet colsChanged;
A boolean
indicating whether or not this Row
object has been deleted. true
indicates that it has
been deleted; false
indicates that it has not.
@serial
/**
* A <code>boolean</code> indicating whether or not this <code>Row</code>
* object has been deleted. <code>true</code> indicates that it has
* been deleted; <code>false</code> indicates that it has not.
* @serial
*/
private boolean deleted;
A boolean
indicating whether or not this Row
object has been updated. true
indicates that it has
been updated; false
indicates that it has not.
@serial
/**
* A <code>boolean</code> indicating whether or not this <code>Row</code>
* object has been updated. <code>true</code> indicates that it has
* been updated; <code>false</code> indicates that it has not.
* @serial
*/
private boolean updated;
A boolean
indicating whether or not this Row
object has been inserted. true
indicates that it has
been inserted; false
indicates that it has not.
@serial
/**
* A <code>boolean</code> indicating whether or not this <code>Row</code>
* object has been inserted. <code>true</code> indicates that it has
* been inserted; <code>false</code> indicates that it has not.
* @serial
*/
private boolean inserted;
The number of columns in this Row
object.
@serial
/**
* The number of columns in this <code>Row</code> object.
* @serial
*/
private int numCols;
Creates a new Row
object with the given number of columns.
The newly-created row includes an array of original values,
an array for storing its current values, and a BitSet
object for keeping track of which column values have been changed.
/**
* Creates a new <code>Row</code> object with the given number of columns.
* The newly-created row includes an array of original values,
* an array for storing its current values, and a <code>BitSet</code>
* object for keeping track of which column values have been changed.
*/
public Row(int numCols) {
origVals = new Object[numCols];
currentVals = new Object[numCols];
colsChanged = new BitSet(numCols);
this.numCols = numCols;
}
Creates a new Row
object with the given number of columns
and with its array of original values initialized to the given array.
The new Row
object also has an array for storing its
current values and a BitSet
object for keeping track
of which column values have been changed.
/**
* Creates a new <code>Row</code> object with the given number of columns
* and with its array of original values initialized to the given array.
* The new <code>Row</code> object also has an array for storing its
* current values and a <code>BitSet</code> object for keeping track
* of which column values have been changed.
*/
public Row(int numCols, Object[] vals) {
origVals = new Object[numCols];
System.arraycopy(vals, 0, origVals, 0, numCols);
currentVals = new Object[numCols];
colsChanged = new BitSet(numCols);
this.numCols = numCols;
}
This method is called internally by the CachedRowSet.populate
methods.
Params: - idx – the number of the column in this
Row
object
that is to be set; the index of the first column is
1
- val – the new value to be set
/**
*
* This method is called internally by the <code>CachedRowSet.populate</code>
* methods.
*
* @param idx the number of the column in this <code>Row</code> object
* that is to be set; the index of the first column is
* <code>1</code>
* @param val the new value to be set
*/
public void initColumnObject(int idx, Object val) {
origVals[idx - 1] = val;
}
This method is called internally by the CachedRowSet.updateXXX
methods.
Params: - idx – the number of the column in this
Row
object
that is to be set; the index of the first column is
1
- val – the new value to be set
/**
*
* This method is called internally by the <code>CachedRowSet.updateXXX</code>
* methods.
*
* @param idx the number of the column in this <code>Row</code> object
* that is to be set; the index of the first column is
* <code>1</code>
* @param val the new value to be set
*/
public void setColumnObject(int idx, Object val) {
currentVals[idx - 1] = val;
setColUpdated(idx - 1);
}
Retrieves the column value stored in the designated column of this
Row
object.
Params: - columnIndex – the index of the column value to be retrieved;
the index of the first column is
1
Throws: - SQLException – if there is a database access error
Returns: an Object
in the Java programming language that
represents the value stored in the designated column
/**
* Retrieves the column value stored in the designated column of this
* <code>Row</code> object.
*
* @param columnIndex the index of the column value to be retrieved;
* the index of the first column is <code>1</code>
* @return an <code>Object</code> in the Java programming language that
* represents the value stored in the designated column
* @throws SQLException if there is a database access error
*/
public Object getColumnObject(int columnIndex) throws SQLException {
if (getColUpdated(columnIndex - 1)) {
return(currentVals[columnIndex - 1]); // maps to array!!
} else {
return(origVals[columnIndex - 1]); // maps to array!!
}
}
Indicates whether the designated column of this Row
object
has been changed.
Params: - idx – the index into the
BitSet
object maintained by
this Row
object to keep track of which column
values have been modified; the index of the first bit is
0
Returns: true
if the designated column value has been changed;
false
otherwise
/**
* Indicates whether the designated column of this <code>Row</code> object
* has been changed.
* @param idx the index into the <code>BitSet</code> object maintained by
* this <code>Row</code> object to keep track of which column
* values have been modified; the index of the first bit is
* <code>0</code>
* @return <code>true</code> if the designated column value has been changed;
* <code>false</code> otherwise
*
*/
public boolean getColUpdated(int idx) {
return colsChanged.get(idx);
}
Sets this Row
object's deleted
field
to true
.
See Also: - getDeleted
/**
* Sets this <code>Row</code> object's <code>deleted</code> field
* to <code>true</code>.
*
* @see #getDeleted
*/
public void setDeleted() { // %%% was public
deleted = true;
}
Retrieves the value of this Row
object's deleted
field,
which will be true
if one or more of its columns has been
deleted.
See Also: Returns: true
if a column value has been deleted; false
otherwise
/**
* Retrieves the value of this <code>Row</code> object's <code>deleted</code> field,
* which will be <code>true</code> if one or more of its columns has been
* deleted.
* @return <code>true</code> if a column value has been deleted; <code>false</code>
* otherwise
*
* @see #setDeleted
*/
public boolean getDeleted() {
return(deleted);
}
Sets the deleted
field for this Row
object to
false
.
/**
* Sets the <code>deleted</code> field for this <code>Row</code> object to
* <code>false</code>.
*/
public void clearDeleted() {
deleted = false;
}
Sets the value of this Row
object's inserted
field
to true
.
See Also: - getInserted
/**
* Sets the value of this <code>Row</code> object's <code>inserted</code> field
* to <code>true</code>.
*
* @see #getInserted
*/
public void setInserted() {
inserted = true;
}
Retrieves the value of this Row
object's inserted
field,
which will be true
if this row has been inserted.
See Also: Returns: true
if this row has been inserted; false
otherwise
/**
* Retrieves the value of this <code>Row</code> object's <code>inserted</code> field,
* which will be <code>true</code> if this row has been inserted.
* @return <code>true</code> if this row has been inserted; <code>false</code>
* otherwise
*
* @see #setInserted
*/
public boolean getInserted() {
return(inserted);
}
Sets the inserted
field for this Row
object to
false
.
/**
* Sets the <code>inserted</code> field for this <code>Row</code> object to
* <code>false</code>.
*/
public void clearInserted() { // %%% was public
inserted = false;
}
Retrieves the value of this Row
object's
updated
field.
See Also: Returns: true
if this Row
object has been
updated; false
if it has not
/**
* Retrieves the value of this <code>Row</code> object's
* <code>updated</code> field.
* @return <code>true</code> if this <code>Row</code> object has been
* updated; <code>false</code> if it has not
*
* @see #setUpdated
*/
public boolean getUpdated() {
return(updated);
}
Sets the updated
field for this Row
object to
true
if one or more of its column values has been changed.
See Also: - getUpdated
/**
* Sets the <code>updated</code> field for this <code>Row</code> object to
* <code>true</code> if one or more of its column values has been changed.
*
* @see #getUpdated
*/
public void setUpdated() {
// only mark something as updated if one or
// more of the columns has been changed.
for (int i = 0; i < numCols; i++) {
if (getColUpdated(i) == true) {
updated = true;
return;
}
}
}
Sets the bit at the given index into this Row
object's internal
BitSet
object, indicating that the corresponding column value
(column idx
+ 1) has been changed.
Params: - idx – the index into the
BitSet
object maintained by
this Row
object; the first bit is at index
0
/**
* Sets the bit at the given index into this <code>Row</code> object's internal
* <code>BitSet</code> object, indicating that the corresponding column value
* (column <code>idx</code> + 1) has been changed.
*
* @param idx the index into the <code>BitSet</code> object maintained by
* this <code>Row</code> object; the first bit is at index
* <code>0</code>
*
*/
private void setColUpdated(int idx) {
colsChanged.set(idx);
}
Sets the updated
field for this Row
object to
false
, sets all the column values in this Row
object's internal array of current values to null
, and clears
all of the bits in the BitSet
object maintained by this
Row
object.
/**
* Sets the <code>updated</code> field for this <code>Row</code> object to
* <code>false</code>, sets all the column values in this <code>Row</code>
* object's internal array of current values to <code>null</code>, and clears
* all of the bits in the <code>BitSet</code> object maintained by this
* <code>Row</code> object.
*/
public void clearUpdated() {
updated = false;
for (int i = 0; i < numCols; i++) {
currentVals[i] = null;
colsChanged.clear(i);
}
}
Sets the column values in this Row
object's internal
array of original values with the values in its internal array of
current values, sets all the values in this Row
object's internal array of current values to null
,
clears all the bits in this Row
object's internal bitset,
and sets its updated
field to false
.
This method is called internally by the CachedRowSet
method makeRowOriginal
.
/**
* Sets the column values in this <code>Row</code> object's internal
* array of original values with the values in its internal array of
* current values, sets all the values in this <code>Row</code>
* object's internal array of current values to <code>null</code>,
* clears all the bits in this <code>Row</code> object's internal bitset,
* and sets its <code>updated</code> field to <code>false</code>.
* <P>
* This method is called internally by the <code>CachedRowSet</code>
* method <code>makeRowOriginal</code>.
*/
public void moveCurrentToOrig() {
for (int i = 0; i < numCols; i++) {
if (getColUpdated(i) == true) {
origVals[i] = currentVals[i];
currentVals[i] = null;
colsChanged.clear(i);
}
}
updated = false;
}
Returns the row on which the cursor is positioned.
Returns: the Row
object on which the CachedRowSet
implementation objects's cursor is positioned
/**
* Returns the row on which the cursor is positioned.
*
* @return the <code>Row</code> object on which the <code>CachedRowSet</code>
* implementation objects's cursor is positioned
*/
public BaseRow getCurrentRow() {
return null;
}
}