ResultSet.java
上传用户:sxlinghang
上传日期:2022-07-20
资源大小:1405k
文件大小:140k
源码类别:

数据库编程

开发平台:

Java

  1.     /**
  2.      * The first warning reported by calls on this ResultSet is returned.
  3.      * Subsequent ResultSet warnings will be chained to this
  4.      * java.sql.SQLWarning.
  5.      * 
  6.      * <p>
  7.      * The warning chain is automatically cleared each time a new row is read.
  8.      * </p>
  9.      * 
  10.      * <p>
  11.      * <B>Note:</B> This warning chain only covers warnings caused by ResultSet
  12.      * methods.  Any warnings caused by statement methods (such as reading OUT
  13.      * parameters) will be chained on the Statement object.
  14.      * </p>
  15.      *
  16.      * @return the first java.sql.SQLWarning or null;
  17.      *
  18.      * @exception java.sql.SQLException if a database access error occurs.
  19.      */
  20.     public java.sql.SQLWarning getWarnings() throws java.sql.SQLException {
  21.         return warningChain;
  22.     }
  23.     /**
  24.      * JDBC 2.0
  25.      * 
  26.      * <p>
  27.      * Move to an absolute row number in the result set.
  28.      * </p>
  29.      * 
  30.      * <p>
  31.      * If row is positive, moves to an absolute row with respect to the
  32.      * beginning of the result set.  The first row is row 1, the second is row
  33.      * 2, etc.
  34.      * </p>
  35.      * 
  36.      * <p>
  37.      * If row is negative, moves to an absolute row position with respect to
  38.      * the end of result set.  For example, calling absolute(-1) positions the
  39.      * cursor on the last row, absolute(-2) indicates the next-to-last row,
  40.      * etc.
  41.      * </p>
  42.      * 
  43.      * <p>
  44.      * An attempt to position the cursor beyond the first/last row in the
  45.      * result set, leaves the cursor before/after the first/last row,
  46.      * respectively.
  47.      * </p>
  48.      * 
  49.      * <p>
  50.      * Note: Calling absolute(1) is the same as calling first(). Calling
  51.      * absolute(-1) is the same as calling last().
  52.      * </p>
  53.      *
  54.      * @param row the row number to move to
  55.      *
  56.      * @return true if on the result set, false if off.
  57.      *
  58.      * @exception SQLException if a database-access error occurs, or row is 0,
  59.      *            or result set type is TYPE_FORWARD_ONLY.
  60.      */
  61.     public boolean absolute(int row) throws SQLException {
  62.         if (Driver.TRACE) {
  63.             Object[] args = { new Integer(row) };
  64.             Debug.methodCall(this, "absolute", args);
  65.         }
  66.         checkClosed();
  67.         boolean b;
  68.         if (rowData.size() == 0) {
  69.             b = false;
  70.         } else {
  71.             if (row == 0) {
  72.                 throw new SQLException("Cannot absolute position to row 0",
  73.                     SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  74.             }
  75.             if (onInsertRow) {
  76.                 onInsertRow = false;
  77.             }
  78.             if (doingUpdates) {
  79.                 doingUpdates = false;
  80.             }
  81.             if (row == 1) {
  82.                 b = first();
  83.             } else if (row == -1) {
  84.                 b = last();
  85.             } else if (row > rowData.size()) {
  86.                 afterLast();
  87.                 b = false;
  88.             } else {
  89.                 if (row < 0) {
  90.                     // adjust to reflect after end of result set
  91.                     int newRowPosition = rowData.size() + row + 1;
  92.                     if (newRowPosition <= 0) {
  93.                         beforeFirst();
  94.                         b = false;
  95.                     } else {
  96.                         b = absolute(newRowPosition);
  97.                     }
  98.                 } else {
  99.                     row--; // adjust for index difference
  100.                     rowData.setCurrentRow(row);
  101.                     thisRow = (byte[][]) rowData.getAt(row);
  102.                     b = true;
  103.                 }
  104.             }
  105.         }
  106.         if (Driver.TRACE) {
  107.             Debug.returnValue(this, "absolute", new Boolean(b));
  108.         }
  109.         return b;
  110.     }
  111.     /**
  112.      * JDBC 2.0
  113.      * 
  114.      * <p>
  115.      * Moves to the end of the result set, just after the last row.  Has no
  116.      * effect if the result set contains no rows.
  117.      * </p>
  118.      *
  119.      * @exception SQLException if a database-access error occurs, or result set
  120.      *            type is TYPE_FORWARD_ONLY.
  121.      */
  122.     public void afterLast() throws SQLException {
  123.         if (Driver.TRACE) {
  124.             Object[] args = {  };
  125.             Debug.methodCall(this, "afterLast", args);
  126.         }
  127.         checkClosed();
  128.         if (onInsertRow) {
  129.             onInsertRow = false;
  130.         }
  131.         if (doingUpdates) {
  132.             doingUpdates = false;
  133.         }
  134.         if (rowData.size() != 0) {
  135.             rowData.afterLast();
  136.             thisRow = null;
  137.         }
  138.     }
  139.     /**
  140.      * JDBC 2.0
  141.      * 
  142.      * <p>
  143.      * Moves to the front of the result set, just before the first row. Has no
  144.      * effect if the result set contains no rows.
  145.      * </p>
  146.      *
  147.      * @exception SQLException if a database-access error occurs, or result set
  148.      *            type is TYPE_FORWARD_ONLY
  149.      */
  150.     public void beforeFirst() throws SQLException {
  151.         if (Driver.TRACE) {
  152.             Object[] args = {  };
  153.             Debug.methodCall(this, "beforeFirst", args);
  154.         }
  155.         checkClosed();
  156.         if (onInsertRow) {
  157.             onInsertRow = false;
  158.         }
  159.         if (doingUpdates) {
  160.             doingUpdates = false;
  161.         }
  162.         if (rowData.size() == 0) {
  163.             return;
  164.         } else {
  165.             rowData.beforeFirst();
  166.             thisRow = null;
  167.         }
  168.     }
  169.     /**
  170.      * JDBC 2.0 The cancelRowUpdates() method may be called after calling an
  171.      * updateXXX() method(s) and before calling updateRow() to rollback the
  172.      * updates made to a row.  If no updates have been made or updateRow() has
  173.      * already been called, then this method has no effect.
  174.      *
  175.      * @exception SQLException if a database-access error occurs, or if called
  176.      *            when on the insert row.
  177.      * @throws NotUpdatable DOCUMENT ME!
  178.      */
  179.     public void cancelRowUpdates() throws SQLException {
  180.         throw new NotUpdatable();
  181.     }
  182.     /**
  183.      * After this call, getWarnings returns null until a new warning is
  184.      * reported for this ResultSet
  185.      *
  186.      * @exception java.sql.SQLException if a database access error occurs
  187.      */
  188.     public void clearWarnings() throws java.sql.SQLException {
  189.         warningChain = null;
  190.     }
  191.     /**
  192.      * In some cases, it is desirable to immediately release a ResultSet
  193.      * database and JDBC resources instead of waiting for this to happen when
  194.      * it is automatically closed.  The close method provides this immediate
  195.      * release.
  196.      * 
  197.      * <p>
  198.      * <B>Note:</B> A ResultSet is automatically closed by the Statement the
  199.      * Statement that generated it when that Statement is closed, re-executed,
  200.      * or is used to retrieve the next result from a sequence of multiple
  201.      * results.  A ResultSet is also automatically closed when it is garbage
  202.      * collected.
  203.      * </p>
  204.      *
  205.      * @exception java.sql.SQLException if a database access error occurs
  206.      */
  207.     public void close() throws java.sql.SQLException {
  208.         realClose(true);
  209.     }
  210.     /**
  211.      * JDBC 2.0 Delete the current row from the result set and the underlying
  212.      * database.  Cannot be called when on the insert row.
  213.      *
  214.      * @exception SQLException if a database-access error occurs, or if called
  215.      *            when on the insert row.
  216.      * @throws NotUpdatable DOCUMENT ME!
  217.      */
  218.     public void deleteRow() throws SQLException {
  219.         throw new NotUpdatable();
  220.     }
  221.     /**
  222.      * Map a ResultSet column name to a ResultSet column index
  223.      *
  224.      * @param columnName the name of the column
  225.      *
  226.      * @return the column index
  227.      *
  228.      * @exception java.sql.SQLException if a database access error occurs
  229.      */
  230.     public int findColumn(String columnName) throws java.sql.SQLException {
  231.         Integer index;
  232.         synchronized (this) {
  233.             if (!hasBuiltIndexMapping) {
  234.                 buildIndexMapping();
  235.             }
  236.         }
  237.         index = (Integer) columnNameToIndex.get(columnName);
  238.         if (index == null) {
  239.             index = (Integer) fullColumnNameToIndex.get(columnName);
  240.         }
  241.         if (index != null) {
  242.             return index.intValue() + 1;
  243.         } else {
  244.             // Try this inefficient way, now
  245.             String columnNameUC = columnName.toUpperCase();
  246.             for (int i = 0; i < fields.length; i++) {
  247.                 if (fields[i].getName().toUpperCase().equals(columnNameUC)) {
  248.                     return i + 1;
  249.                 } else if (fields[i].getFullName().toUpperCase().equals(columnNameUC)) {
  250.                     return i + 1;
  251.                 }
  252.             }
  253.             throw new java.sql.SQLException("Column '" + columnName
  254.                 + "' not found.", SQLError.SQL_STATE_COLUMN_NOT_FOUND);
  255.         }
  256.     }
  257.     /**
  258.      * JDBC 2.0
  259.      * 
  260.      * <p>
  261.      * Moves to the first row in the result set.
  262.      * </p>
  263.      *
  264.      * @return true if on a valid row, false if no rows in the result set.
  265.      *
  266.      * @exception SQLException if a database-access error occurs, or result set
  267.      *            type is TYPE_FORWARD_ONLY.
  268.      */
  269.     public boolean first() throws SQLException {
  270.         if (Driver.TRACE) {
  271.             Object[] args = {  };
  272.             Debug.methodCall(this, "first", args);
  273.         }
  274.         checkClosed();
  275.         if (onInsertRow) {
  276.             onInsertRow = false;
  277.         }
  278.         if (rowData.isEmpty()) {
  279.             return false;
  280.         } else {
  281.             if (doingUpdates) {
  282.                 doingUpdates = false;
  283.             }
  284.             rowData.beforeFirst();
  285.             thisRow = rowData.next();
  286.             return true;
  287.         }
  288.     }
  289.     /**
  290.      * JDBC 2.0 Insert the contents of the insert row into the result set and
  291.      * the database.  Must be on the insert row when this method is called.
  292.      *
  293.      * @exception SQLException if a database-access error occurs, if called
  294.      *            when not on the insert row, or if all non-nullable columns
  295.      *            in the insert row have not been given a value
  296.      * @throws NotUpdatable DOCUMENT ME!
  297.      */
  298.     public void insertRow() throws SQLException {
  299.         throw new NotUpdatable();
  300.     }
  301.     /**
  302.      * JDBC 2.0
  303.      * 
  304.      * <p>
  305.      * Moves to the last row in the result set.
  306.      * </p>
  307.      *
  308.      * @return true if on a valid row, false if no rows in the result set.
  309.      *
  310.      * @exception SQLException if a database-access error occurs, or result set
  311.      *            type is TYPE_FORWARD_ONLY.
  312.      */
  313.     public boolean last() throws SQLException {
  314.         if (Driver.TRACE) {
  315.             Object[] args = {  };
  316.             Debug.methodCall(this, "last", args);
  317.         }
  318.         checkClosed();
  319.         if (rowData.size() == 0) {
  320.             return false;
  321.         } else {
  322.             if (onInsertRow) {
  323.                 onInsertRow = false;
  324.             }
  325.             if (doingUpdates) {
  326.                 doingUpdates = false;
  327.             }
  328.             rowData.beforeLast();
  329.             thisRow = rowData.next();
  330.             return true;
  331.         }
  332.     }
  333.     /**
  334.      * JDBC 2.0 Move the cursor to the remembered cursor position, usually the
  335.      * current row.  Has no effect unless the cursor is on the insert row.
  336.      *
  337.      * @exception SQLException if a database-access error occurs, or the result
  338.      *            set is not updatable
  339.      * @throws NotUpdatable DOCUMENT ME!
  340.      */
  341.     public void moveToCurrentRow() throws SQLException {
  342.         throw new NotUpdatable();
  343.     }
  344.     /**
  345.      * JDBC 2.0 Move to the insert row.  The current cursor position is
  346.      * remembered while the cursor is positioned on the insert row. The insert
  347.      * row is a special row associated with an updatable result set.  It is
  348.      * essentially a buffer where a new row may be constructed by calling the
  349.      * updateXXX() methods prior to inserting the row into the result set.
  350.      * Only the updateXXX(), getXXX(), and insertRow() methods may be called
  351.      * when the cursor is on the insert row.  All of the columns in a result
  352.      * set must be given a value each time this method is called before
  353.      * calling insertRow().  UpdateXXX()must be called before getXXX() on a
  354.      * column.
  355.      *
  356.      * @exception SQLException if a database-access error occurs, or the result
  357.      *            set is not updatable
  358.      * @throws NotUpdatable DOCUMENT ME!
  359.      */
  360.     public void moveToInsertRow() throws SQLException {
  361.         throw new NotUpdatable();
  362.     }
  363.     /**
  364.      * A ResultSet is initially positioned before its first row, the first call
  365.      * to next makes the first row the current row; the second call makes the
  366.      * second row the current row, etc.
  367.      * 
  368.      * <p>
  369.      * If an input stream from the previous row is open, it is implicitly
  370.      * closed.  The ResultSet's warning chain is cleared when a new row is
  371.      * read
  372.      * </p>
  373.      *
  374.      * @return true if the new current is valid; false if there are no more
  375.      *         rows
  376.      *
  377.      * @exception java.sql.SQLException if a database access error occurs
  378.      */
  379.     public boolean next() throws java.sql.SQLException {
  380.         if (Driver.TRACE) {
  381.             Object[] args = {  };
  382.             Debug.methodCall(this, "next", args);
  383.         }
  384.         checkClosed();
  385.         if (onInsertRow) {
  386.             onInsertRow = false;
  387.         }
  388.         if (doingUpdates) {
  389.             doingUpdates = false;
  390.         }
  391.         boolean b;
  392.         if (!reallyResult()) {
  393.             throw new java.sql.SQLException("ResultSet is from UPDATE. No Data",
  394.                 SQLError.SQL_STATE_GENERAL_ERROR);
  395.         }
  396.         if (rowData.size() == 0) {
  397.             b = false;
  398.         } else {
  399.             if (!rowData.hasNext()) {
  400.                 // force scroll past end
  401.                 rowData.next();
  402.                 b = false;
  403.             } else {
  404.                 clearWarnings();
  405.                 thisRow = rowData.next();
  406.                 b = true;
  407.             }
  408.         }
  409.         if (Driver.TRACE) {
  410.             Debug.returnValue(this, "next", new Boolean(b));
  411.         }
  412.         return b;
  413.     }
  414.     /**
  415.      * The prev method is not part of JDBC, but because of the architecture of
  416.      * this driver it is possible to move both forward and backward within the
  417.      * result set.
  418.      * 
  419.      * <p>
  420.      * If an input stream from the previous row is open, it is implicitly
  421.      * closed.  The ResultSet's warning chain is cleared when a new row is
  422.      * read
  423.      * </p>
  424.      *
  425.      * @return true if the new current is valid; false if there are no more
  426.      *         rows
  427.      *
  428.      * @exception java.sql.SQLException if a database access error occurs
  429.      */
  430.     public boolean prev() throws java.sql.SQLException {
  431.         checkClosed();
  432.         int rowIndex = rowData.getCurrentRowNumber();
  433.         if ((rowIndex - 1) >= 0) {
  434.             rowIndex--;
  435.             rowData.setCurrentRow(rowIndex);
  436.             thisRow = (byte[][]) rowData.getAt(rowIndex);
  437.             return true;
  438.         } else if ((rowIndex - 1) == -1) {
  439.             rowIndex--;
  440.             rowData.setCurrentRow(rowIndex);
  441.             thisRow = null;
  442.             return false;
  443.         } else {
  444.             return false;
  445.         }
  446.     }
  447.     /**
  448.      * JDBC 2.0
  449.      * 
  450.      * <p>
  451.      * Moves to the previous row in the result set.
  452.      * </p>
  453.      * 
  454.      * <p>
  455.      * Note: previous() is not the same as relative(-1) since it makes sense to
  456.      * call previous() when there is no current row.
  457.      * </p>
  458.      *
  459.      * @return true if on a valid row, false if off the result set.
  460.      *
  461.      * @exception SQLException if a database-access error occurs, or result set
  462.      *            type is TYPE_FORWAR_DONLY.
  463.      */
  464.     public boolean previous() throws SQLException {
  465.         if (Driver.TRACE) {
  466.             Object[] args = {  };
  467.             Debug.methodCall(this, "previous", args);
  468.         }
  469.         if (onInsertRow) {
  470.             onInsertRow = false;
  471.         }
  472.         if (doingUpdates) {
  473.             doingUpdates = false;
  474.         }
  475.         return prev();
  476.     }
  477.     /**
  478.      * JDBC 2.0 Refresh the value of the current row with its current value in
  479.      * the database.  Cannot be called when on the insert row. The
  480.      * refreshRow() method provides a way for an application to explicitly
  481.      * tell the JDBC driver to refetch a row(s) from the database.  An
  482.      * application may want to call refreshRow() when caching or prefetching
  483.      * is being done by the JDBC driver to fetch the latest value of a row
  484.      * from the database.  The JDBC driver may actually refresh multiple rows
  485.      * at once if the fetch size is greater than one. All values are refetched
  486.      * subject to the transaction isolation level and cursor sensitivity.  If
  487.      * refreshRow() is called after calling updateXXX(), but before calling
  488.      * updateRow() then the updates made to the row are lost.  Calling
  489.      * refreshRow() frequently will likely slow performance.
  490.      *
  491.      * @exception SQLException if a database-access error occurs, or if called
  492.      *            when on the insert row.
  493.      * @throws NotUpdatable DOCUMENT ME!
  494.      */
  495.     public void refreshRow() throws SQLException {
  496.         throw new NotUpdatable();
  497.     }
  498.     /**
  499.      * JDBC 2.0
  500.      * 
  501.      * <p>
  502.      * Moves a relative number of rows, either positive or negative. Attempting
  503.      * to move beyond the first/last row in the result set positions the
  504.      * cursor before/after the the first/last row. Calling relative(0) is
  505.      * valid, but does not change the cursor position.
  506.      * </p>
  507.      * 
  508.      * <p>
  509.      * Note: Calling relative(1) is different than calling next() since is
  510.      * makes sense to call next() when there is no current row, for example,
  511.      * when the cursor is positioned before the first row or after the last
  512.      * row of the result set.
  513.      * </p>
  514.      *
  515.      * @param rows the number of relative rows to move the cursor.
  516.      *
  517.      * @return true if on a row, false otherwise.
  518.      *
  519.      * @throws SQLException if a database-access error occurs, or there is no
  520.      *         current row, or result set type is TYPE_FORWARD_ONLY.
  521.      */
  522.     public boolean relative(int rows) throws SQLException {
  523.         if (Driver.TRACE) {
  524.             Object[] args = { new Integer(rows) };
  525.             Debug.methodCall(this, "relative", args);
  526.         }
  527.         checkClosed();
  528.         if (rowData.size() == 0) {
  529.             return false;
  530.         }
  531.         rowData.moveRowRelative(rows);
  532.         thisRow = rowData.getAt(rowData.getCurrentRowNumber());
  533.         boolean b = (!rowData.isAfterLast() && !rowData.isBeforeFirst());
  534.         if (Driver.TRACE) {
  535.             Debug.returnValue(this, "relative", new Boolean(b));
  536.         }
  537.         return b;
  538.     }
  539.     /**
  540.      * JDBC 2.0 Determine if this row has been deleted.  A deleted row may
  541.      * leave a visible "hole" in a result set.  This method can be used to
  542.      * detect holes in a result set.  The value returned depends on whether or
  543.      * not the result set can detect deletions.
  544.      *
  545.      * @return true if deleted and deletes are detected
  546.      *
  547.      * @exception SQLException if a database-access error occurs
  548.      * @throws NotImplemented DOCUMENT ME!
  549.      *
  550.      * @see DatabaseMetaData#deletesAreDetected
  551.      */
  552.     public boolean rowDeleted() throws SQLException {
  553.         throw new NotImplemented();
  554.     }
  555.     /**
  556.      * JDBC 2.0 Determine if the current row has been inserted.  The value
  557.      * returned depends on whether or not the result set can detect visible
  558.      * inserts.
  559.      *
  560.      * @return true if inserted and inserts are detected
  561.      *
  562.      * @exception SQLException if a database-access error occurs
  563.      * @throws NotImplemented DOCUMENT ME!
  564.      *
  565.      * @see DatabaseMetaData#insertsAreDetected
  566.      */
  567.     public boolean rowInserted() throws SQLException {
  568.         throw new NotImplemented();
  569.     }
  570.     //---------------------------------------------------------------------
  571.     // Updates
  572.     //---------------------------------------------------------------------
  573.     /**
  574.      * JDBC 2.0 Determine if the current row has been updated.  The value
  575.      * returned depends on whether or not the result set can detect updates.
  576.      *
  577.      * @return true if the row has been visibly updated by the owner or
  578.      *         another, and updates are detected
  579.      *
  580.      * @exception SQLException if a database-access error occurs
  581.      * @throws NotImplemented DOCUMENT ME!
  582.      *
  583.      * @see DatabaseMetaData#updatesAreDetected
  584.      */
  585.     public boolean rowUpdated() throws SQLException {
  586.         throw new NotImplemented();
  587.     }
  588.     /**
  589.      * @see ResultSet#updateArray(int, Array)
  590.      */
  591.     public void updateArray(int arg0, Array arg1) throws SQLException {
  592.         throw new NotImplemented();
  593.     }
  594.     /**
  595.      * @see ResultSet#updateArray(String, Array)
  596.      */
  597.     public void updateArray(String arg0, Array arg1) throws SQLException {
  598.         throw new NotImplemented();
  599.     }
  600.     /**
  601.      * JDBC 2.0 Update a column with an ascii stream value. The updateXXX()
  602.      * methods are used to update column values in the current row, or the
  603.      * insert row.  The updateXXX() methods do not update the underlying
  604.      * database, instead the updateRow() or insertRow() methods are called to
  605.      * update the database.
  606.      *
  607.      * @param columnIndex the first column is 1, the second is 2, ...
  608.      * @param x the new column value
  609.      * @param length the length of the stream
  610.      *
  611.      * @exception SQLException if a database-access error occurs
  612.      * @throws NotUpdatable DOCUMENT ME!
  613.      */
  614.     public void updateAsciiStream(int columnIndex, java.io.InputStream x,
  615.         int length) throws SQLException {
  616.         throw new NotUpdatable();
  617.     }
  618.     /**
  619.      * JDBC 2.0 Update a column with an ascii stream value. The updateXXX()
  620.      * methods are used to update column values in the current row, or the
  621.      * insert row.  The updateXXX() methods do not update the underlying
  622.      * database, instead the updateRow() or insertRow() methods are called to
  623.      * update the database.
  624.      *
  625.      * @param columnName the name of the column
  626.      * @param x the new column value
  627.      * @param length of the stream
  628.      *
  629.      * @exception SQLException if a database-access error occurs
  630.      */
  631.     public void updateAsciiStream(String columnName, java.io.InputStream x,
  632.         int length) throws SQLException {
  633.         updateAsciiStream(findColumn(columnName), x, length);
  634.     }
  635.     /**
  636.      * JDBC 2.0 Update a column with a BigDecimal value. The updateXXX()
  637.      * methods are used to update column values in the current row, or the
  638.      * insert row.  The updateXXX() methods do not update the underlying
  639.      * database, instead the updateRow() or insertRow() methods are called to
  640.      * update the database.
  641.      *
  642.      * @param columnIndex the first column is 1, the second is 2, ...
  643.      * @param x the new column value
  644.      *
  645.      * @exception SQLException if a database-access error occurs
  646.      * @throws NotUpdatable DOCUMENT ME!
  647.      */
  648.     public void updateBigDecimal(int columnIndex, BigDecimal x)
  649.         throws SQLException {
  650.         throw new NotUpdatable();
  651.     }
  652.     /**
  653.      * JDBC 2.0 Update a column with a BigDecimal value. The updateXXX()
  654.      * methods are used to update column values in the current row, or the
  655.      * insert row.  The updateXXX() methods do not update the underlying
  656.      * database, instead the updateRow() or insertRow() methods are called to
  657.      * update the database.
  658.      *
  659.      * @param columnName the name of the column
  660.      * @param x the new column value
  661.      *
  662.      * @exception SQLException if a database-access error occurs
  663.      */
  664.     public void updateBigDecimal(String columnName, BigDecimal x)
  665.         throws SQLException {
  666.         updateBigDecimal(findColumn(columnName), x);
  667.     }
  668.     /**
  669.      * JDBC 2.0 Update a column with a binary stream value. The updateXXX()
  670.      * methods are used to update column values in the current row, or the
  671.      * insert row.  The updateXXX() methods do not update the underlying
  672.      * database, instead the updateRow() or insertRow() methods are called to
  673.      * update the database.
  674.      *
  675.      * @param columnIndex the first column is 1, the second is 2, ...
  676.      * @param x the new column value
  677.      * @param length the length of the stream
  678.      *
  679.      * @exception SQLException if a database-access error occurs
  680.      * @throws NotUpdatable DOCUMENT ME!
  681.      */
  682.     public void updateBinaryStream(int columnIndex, java.io.InputStream x,
  683.         int length) throws SQLException {
  684.         throw new NotUpdatable();
  685.     }
  686.     /**
  687.      * JDBC 2.0 Update a column with a binary stream value. The updateXXX()
  688.      * methods are used to update column values in the current row, or the
  689.      * insert row.  The updateXXX() methods do not update the underlying
  690.      * database, instead the updateRow() or insertRow() methods are called to
  691.      * update the database.
  692.      *
  693.      * @param columnName the name of the column
  694.      * @param x the new column value
  695.      * @param length of the stream
  696.      *
  697.      * @exception SQLException if a database-access error occurs
  698.      */
  699.     public void updateBinaryStream(String columnName, java.io.InputStream x,
  700.         int length) throws SQLException {
  701.         updateBinaryStream(findColumn(columnName), x, length);
  702.     }
  703.     /**
  704.      * @see ResultSet#updateBlob(int, Blob)
  705.      */
  706.     public void updateBlob(int arg0, java.sql.Blob arg1)
  707.         throws SQLException {
  708.         throw new NotUpdatable();
  709.     }
  710.     /**
  711.      * @see ResultSet#updateBlob(String, Blob)
  712.      */
  713.     public void updateBlob(String arg0, java.sql.Blob arg1)
  714.         throws SQLException {
  715.         throw new NotUpdatable();
  716.     }
  717.     /**
  718.      * JDBC 2.0 Update a column with a boolean value. The updateXXX() methods
  719.      * are used to update column values in the current row, or the insert row.
  720.      * The updateXXX() methods do not update the underlying database, instead
  721.      * the updateRow() or insertRow() methods are called to update the
  722.      * database.
  723.      *
  724.      * @param columnIndex the first column is 1, the second is 2, ...
  725.      * @param x the new column value
  726.      *
  727.      * @exception SQLException if a database-access error occurs
  728.      * @throws NotUpdatable DOCUMENT ME!
  729.      */
  730.     public void updateBoolean(int columnIndex, boolean x)
  731.         throws SQLException {
  732.         throw new NotUpdatable();
  733.     }
  734.     /**
  735.      * JDBC 2.0 Update a column with a boolean value. The updateXXX() methods
  736.      * are used to update column values in the current row, or the insert row.
  737.      * The updateXXX() methods do not update the underlying database, instead
  738.      * the updateRow() or insertRow() methods are called to update the
  739.      * database.
  740.      *
  741.      * @param columnName the name of the column
  742.      * @param x the new column value
  743.      *
  744.      * @exception SQLException if a database-access error occurs
  745.      */
  746.     public void updateBoolean(String columnName, boolean x)
  747.         throws SQLException {
  748.         updateBoolean(findColumn(columnName), x);
  749.     }
  750.     /**
  751.      * JDBC 2.0 Update a column with a byte value. The updateXXX() methods are
  752.      * used to update column values in the current row, or the insert row. The
  753.      * updateXXX() methods do not update the underlying database, instead the
  754.      * updateRow() or insertRow() methods are called to update the database.
  755.      *
  756.      * @param columnIndex the first column is 1, the second is 2, ...
  757.      * @param x the new column value
  758.      *
  759.      * @exception SQLException if a database-access error occurs
  760.      * @throws NotUpdatable DOCUMENT ME!
  761.      */
  762.     public void updateByte(int columnIndex, byte x) throws SQLException {
  763.         throw new NotUpdatable();
  764.     }
  765.     /**
  766.      * JDBC 2.0 Update a column with a byte value. The updateXXX() methods are
  767.      * used to update column values in the current row, or the insert row. The
  768.      * updateXXX() methods do not update the underlying database, instead the
  769.      * updateRow() or insertRow() methods are called to update the database.
  770.      *
  771.      * @param columnName the name of the column
  772.      * @param x the new column value
  773.      *
  774.      * @exception SQLException if a database-access error occurs
  775.      */
  776.     public void updateByte(String columnName, byte x) throws SQLException {
  777.         updateByte(findColumn(columnName), x);
  778.     }
  779.     /**
  780.      * JDBC 2.0 Update a column with a byte array value. The updateXXX()
  781.      * methods are used to update column values in the current row, or the
  782.      * insert row.  The updateXXX() methods do not update the underlying
  783.      * database, instead the updateRow() or insertRow() methods are called to
  784.      * update the database.
  785.      *
  786.      * @param columnIndex the first column is 1, the second is 2, ...
  787.      * @param x the new column value
  788.      *
  789.      * @exception SQLException if a database-access error occurs
  790.      * @throws NotUpdatable DOCUMENT ME!
  791.      */
  792.     public void updateBytes(int columnIndex, byte[] x)
  793.         throws SQLException {
  794.         throw new NotUpdatable();
  795.     }
  796.     /**
  797.      * JDBC 2.0 Update a column with a byte array value. The updateXXX()
  798.      * methods are used to update column values in the current row, or the
  799.      * insert row.  The updateXXX() methods do not update the underlying
  800.      * database, instead the updateRow() or insertRow() methods are called to
  801.      * update the database.
  802.      *
  803.      * @param columnName the name of the column
  804.      * @param x the new column value
  805.      *
  806.      * @exception SQLException if a database-access error occurs
  807.      */
  808.     public void updateBytes(String columnName, byte[] x)
  809.         throws SQLException {
  810.         updateBytes(findColumn(columnName), x);
  811.     }
  812.     /**
  813.      * JDBC 2.0 Update a column with a character stream value. The updateXXX()
  814.      * methods are used to update column values in the current row, or the
  815.      * insert row.  The updateXXX() methods do not update the underlying
  816.      * database, instead the updateRow() or insertRow() methods are called to
  817.      * update the database.
  818.      *
  819.      * @param columnIndex the first column is 1, the second is 2, ...
  820.      * @param x the new column value
  821.      * @param length the length of the stream
  822.      *
  823.      * @exception SQLException if a database-access error occurs
  824.      * @throws NotUpdatable DOCUMENT ME!
  825.      */
  826.     public void updateCharacterStream(int columnIndex, java.io.Reader x,
  827.         int length) throws SQLException {
  828.         throw new NotUpdatable();
  829.     }
  830.     /**
  831.      * JDBC 2.0 Update a column with a character stream value. The updateXXX()
  832.      * methods are used to update column values in the current row, or the
  833.      * insert row.  The updateXXX() methods do not update the underlying
  834.      * database, instead the updateRow() or insertRow() methods are called to
  835.      * update the database.
  836.      *
  837.      * @param columnName the name of the column
  838.      * @param reader the stream to update the column with
  839.      * @param length of the stream
  840.      *
  841.      * @throws SQLException if a database-access error occurs
  842.      */
  843.     public void updateCharacterStream(String columnName, java.io.Reader reader,
  844.         int length) throws SQLException {
  845.         updateCharacterStream(findColumn(columnName), reader, length);
  846.     }
  847.     /**
  848.      * @see ResultSet#updateClob(int, Clob)
  849.      */
  850.     public void updateClob(int arg0, java.sql.Clob arg1) throws SQLException {
  851. throw new NotUpdatable();
  852.     }
  853.     /**
  854.      * @see ResultSet#updateClob(String, Clob)
  855.      */
  856.     public void updateClob(String columnName, java.sql.Clob clob) throws SQLException {
  857.         updateClob(findColumn(columnName), clob);
  858.     }
  859.     /**
  860.      * JDBC 2.0 Update a column with a Date value. The updateXXX() methods are
  861.      * used to update column values in the current row, or the insert row. The
  862.      * updateXXX() methods do not update the underlying database, instead the
  863.      * updateRow() or insertRow() methods are called to update the database.
  864.      *
  865.      * @param columnIndex the first column is 1, the second is 2, ...
  866.      * @param x the new column value
  867.      *
  868.      * @exception SQLException if a database-access error occurs
  869.      * @throws NotUpdatable DOCUMENT ME!
  870.      */
  871.     public void updateDate(int columnIndex, java.sql.Date x)
  872.         throws SQLException {
  873.         throw new NotUpdatable();
  874.     }
  875.     /**
  876.      * JDBC 2.0 Update a column with a Date value. The updateXXX() methods are
  877.      * used to update column values in the current row, or the insert row. The
  878.      * updateXXX() methods do not update the underlying database, instead the
  879.      * updateRow() or insertRow() methods are called to update the database.
  880.      *
  881.      * @param columnName the name of the column
  882.      * @param x the new column value
  883.      *
  884.      * @exception SQLException if a database-access error occurs
  885.      */
  886.     public void updateDate(String columnName, java.sql.Date x)
  887.         throws SQLException {
  888.         updateDate(findColumn(columnName), x);
  889.     }
  890.     /**
  891.      * JDBC 2.0 Update a column with a Double value. The updateXXX() methods
  892.      * are used to update column values in the current row, or the insert row.
  893.      * The updateXXX() methods do not update the underlying database, instead
  894.      * the updateRow() or insertRow() methods are called to update the
  895.      * database.
  896.      *
  897.      * @param columnIndex the first column is 1, the second is 2, ...
  898.      * @param x the new column value
  899.      *
  900.      * @exception SQLException if a database-access error occurs
  901.      * @throws NotUpdatable DOCUMENT ME!
  902.      */
  903.     public void updateDouble(int columnIndex, double x)
  904.         throws SQLException {
  905.         throw new NotUpdatable();
  906.     }
  907.     /**
  908.      * JDBC 2.0 Update a column with a double value. The updateXXX() methods
  909.      * are used to update column values in the current row, or the insert row.
  910.      * The updateXXX() methods do not update the underlying database, instead
  911.      * the updateRow() or insertRow() methods are called to update the
  912.      * database.
  913.      *
  914.      * @param columnName the name of the column
  915.      * @param x the new column value
  916.      *
  917.      * @exception SQLException if a database-access error occurs
  918.      */
  919.     public void updateDouble(String columnName, double x)
  920.         throws SQLException {
  921.         updateDouble(findColumn(columnName), x);
  922.     }
  923.     /**
  924.      * JDBC 2.0 Update a column with a float value. The updateXXX() methods are
  925.      * used to update column values in the current row, or the insert row. The
  926.      * updateXXX() methods do not update the underlying database, instead the
  927.      * updateRow() or insertRow() methods are called to update the database.
  928.      *
  929.      * @param columnIndex the first column is 1, the second is 2, ...
  930.      * @param x the new column value
  931.      *
  932.      * @exception SQLException if a database-access error occurs
  933.      * @throws NotUpdatable DOCUMENT ME!
  934.      */
  935.     public void updateFloat(int columnIndex, float x) throws SQLException {
  936.         throw new NotUpdatable();
  937.     }
  938.     /**
  939.      * JDBC 2.0 Update a column with a float value. The updateXXX() methods are
  940.      * used to update column values in the current row, or the insert row. The
  941.      * updateXXX() methods do not update the underlying database, instead the
  942.      * updateRow() or insertRow() methods are called to update the database.
  943.      *
  944.      * @param columnName the name of the column
  945.      * @param x the new column value
  946.      *
  947.      * @exception SQLException if a database-access error occurs
  948.      */
  949.     public void updateFloat(String columnName, float x)
  950.         throws SQLException {
  951.         updateFloat(findColumn(columnName), x);
  952.     }
  953.     /**
  954.      * JDBC 2.0 Update a column with an integer value. The updateXXX() methods
  955.      * are used to update column values in the current row, or the insert row.
  956.      * The updateXXX() methods do not update the underlying database, instead
  957.      * the updateRow() or insertRow() methods are called to update the
  958.      * database.
  959.      *
  960.      * @param columnIndex the first column is 1, the second is 2, ...
  961.      * @param x the new column value
  962.      *
  963.      * @exception SQLException if a database-access error occurs
  964.      * @throws NotUpdatable DOCUMENT ME!
  965.      */
  966.     public void updateInt(int columnIndex, int x) throws SQLException {
  967.         throw new NotUpdatable();
  968.     }
  969.     /**
  970.      * JDBC 2.0 Update a column with an integer value. The updateXXX() methods
  971.      * are used to update column values in the current row, or the insert row.
  972.      * The updateXXX() methods do not update the underlying database, instead
  973.      * the updateRow() or insertRow() methods are called to update the
  974.      * database.
  975.      *
  976.      * @param columnName the name of the column
  977.      * @param x the new column value
  978.      *
  979.      * @exception SQLException if a database-access error occurs
  980.      */
  981.     public void updateInt(String columnName, int x) throws SQLException {
  982.         updateInt(findColumn(columnName), x);
  983.     }
  984.     /**
  985.      * JDBC 2.0 Update a column with a long value. The updateXXX() methods are
  986.      * used to update column values in the current row, or the insert row. The
  987.      * updateXXX() methods do not update the underlying database, instead the
  988.      * updateRow() or insertRow() methods are called to update the database.
  989.      *
  990.      * @param columnIndex the first column is 1, the second is 2, ...
  991.      * @param x the new column value
  992.      *
  993.      * @exception SQLException if a database-access error occurs
  994.      * @throws NotUpdatable DOCUMENT ME!
  995.      */
  996.     public void updateLong(int columnIndex, long x) throws SQLException {
  997.         throw new NotUpdatable();
  998.     }
  999.     /**
  1000.      * JDBC 2.0 Update a column with a long value. The updateXXX() methods are
  1001.      * used to update column values in the current row, or the insert row. The
  1002.      * updateXXX() methods do not update the underlying database, instead the
  1003.      * updateRow() or insertRow() methods are called to update the database.
  1004.      *
  1005.      * @param columnName the name of the column
  1006.      * @param x the new column value
  1007.      *
  1008.      * @exception SQLException if a database-access error occurs
  1009.      */
  1010.     public void updateLong(String columnName, long x) throws SQLException {
  1011.         updateLong(findColumn(columnName), x);
  1012.     }
  1013.     /**
  1014.      * JDBC 2.0 Give a nullable column a null value. The updateXXX() methods
  1015.      * are used to update column values in the current row, or the insert row.
  1016.      * The updateXXX() methods do not update the underlying database, instead
  1017.      * the updateRow() or insertRow() methods are called to update the
  1018.      * database.
  1019.      *
  1020.      * @param columnIndex the first column is 1, the second is 2, ...
  1021.      *
  1022.      * @exception SQLException if a database-access error occurs
  1023.      * @throws NotUpdatable DOCUMENT ME!
  1024.      */
  1025.     public void updateNull(int columnIndex) throws SQLException {
  1026.         throw new NotUpdatable();
  1027.     }
  1028.     /**
  1029.      * JDBC 2.0 Update a column with a null value. The updateXXX() methods are
  1030.      * used to update column values in the current row, or the insert row. The
  1031.      * updateXXX() methods do not update the underlying database, instead the
  1032.      * updateRow() or insertRow() methods are called to update the database.
  1033.      *
  1034.      * @param columnName the name of the column
  1035.      *
  1036.      * @exception SQLException if a database-access error occurs
  1037.      */
  1038.     public void updateNull(String columnName) throws SQLException {
  1039.         updateNull(findColumn(columnName));
  1040.     }
  1041.     /**
  1042.      * JDBC 2.0 Update a column with an Object value. The updateXXX() methods
  1043.      * are used to update column values in the current row, or the insert row.
  1044.      * The updateXXX() methods do not update the underlying database, instead
  1045.      * the updateRow() or insertRow() methods are called to update the
  1046.      * database.
  1047.      *
  1048.      * @param columnIndex the first column is 1, the second is 2, ...
  1049.      * @param x the new column value
  1050.      * @param scale For java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types
  1051.      *        this is the number of digits after the decimal.  For all other
  1052.      *        types this value will be ignored.
  1053.      *
  1054.      * @exception SQLException if a database-access error occurs
  1055.      * @throws NotUpdatable DOCUMENT ME!
  1056.      */
  1057.     public void updateObject(int columnIndex, Object x, int scale)
  1058.         throws SQLException {
  1059.         throw new NotUpdatable();
  1060.     }
  1061.     /**
  1062.      * JDBC 2.0 Update a column with an Object value. The updateXXX() methods
  1063.      * are used to update column values in the current row, or the insert row.
  1064.      * The updateXXX() methods do not update the underlying database, instead
  1065.      * the updateRow() or insertRow() methods are called to update the
  1066.      * database.
  1067.      *
  1068.      * @param columnIndex the first column is 1, the second is 2, ...
  1069.      * @param x the new column value
  1070.      *
  1071.      * @exception SQLException if a database-access error occurs
  1072.      * @throws NotUpdatable DOCUMENT ME!
  1073.      */
  1074.     public void updateObject(int columnIndex, Object x)
  1075.         throws SQLException {
  1076.         throw new NotUpdatable();
  1077.     }
  1078.     /**
  1079.      * JDBC 2.0 Update a column with an Object value. The updateXXX() methods
  1080.      * are used to update column values in the current row, or the insert row.
  1081.      * The updateXXX() methods do not update the underlying database, instead
  1082.      * the updateRow() or insertRow() methods are called to update the
  1083.      * database.
  1084.      *
  1085.      * @param columnName the name of the column
  1086.      * @param x the new column value
  1087.      * @param scale For java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types
  1088.      *        this is the number of digits after the decimal.  For all other
  1089.      *        types this value will be ignored.
  1090.      *
  1091.      * @exception SQLException if a database-access error occurs
  1092.      */
  1093.     public void updateObject(String columnName, Object x, int scale)
  1094.         throws SQLException {
  1095.         updateObject(findColumn(columnName), x);
  1096.     }
  1097.     /**
  1098.      * JDBC 2.0 Update a column with an Object value. The updateXXX() methods
  1099.      * are used to update column values in the current row, or the insert row.
  1100.      * The updateXXX() methods do not update the underlying database, instead
  1101.      * the updateRow() or insertRow() methods are called to update the
  1102.      * database.
  1103.      *
  1104.      * @param columnName the name of the column
  1105.      * @param x the new column value
  1106.      *
  1107.      * @exception SQLException if a database-access error occurs
  1108.      */
  1109.     public void updateObject(String columnName, Object x)
  1110.         throws SQLException {
  1111.         updateObject(findColumn(columnName), x);
  1112.     }
  1113.     /**
  1114.      * @see ResultSet#updateRef(int, Ref)
  1115.      */
  1116.     public void updateRef(int arg0, Ref arg1) throws SQLException {
  1117.         throw new NotImplemented();
  1118.     }
  1119.     /**
  1120.      * @see ResultSet#updateRef(String, Ref)
  1121.      */
  1122.     public void updateRef(String arg0, Ref arg1) throws SQLException {
  1123.         throw new NotImplemented();
  1124.     }
  1125.     /**
  1126.      * JDBC 2.0 Update the underlying database with the new contents of the
  1127.      * current row.  Cannot be called when on the insert row.
  1128.      *
  1129.      * @exception SQLException if a database-access error occurs, or if called
  1130.      *            when on the insert row
  1131.      * @throws NotUpdatable DOCUMENT ME!
  1132.      */
  1133.     public void updateRow() throws SQLException {
  1134.         throw new NotUpdatable();
  1135.     }
  1136.     /**
  1137.      * JDBC 2.0 Update a column with a short value. The updateXXX() methods are
  1138.      * used to update column values in the current row, or the insert row. The
  1139.      * updateXXX() methods do not update the underlying database, instead the
  1140.      * updateRow() or insertRow() methods are called to update the database.
  1141.      *
  1142.      * @param columnIndex the first column is 1, the second is 2, ...
  1143.      * @param x the new column value
  1144.      *
  1145.      * @exception SQLException if a database-access error occurs
  1146.      * @throws NotUpdatable DOCUMENT ME!
  1147.      */
  1148.     public void updateShort(int columnIndex, short x) throws SQLException {
  1149.         throw new NotUpdatable();
  1150.     }
  1151.     /**
  1152.      * JDBC 2.0 Update a column with a short value. The updateXXX() methods are
  1153.      * used to update column values in the current row, or the insert row. The
  1154.      * updateXXX() methods do not update the underlying database, instead the
  1155.      * updateRow() or insertRow() methods are called to update the database.
  1156.      *
  1157.      * @param columnName the name of the column
  1158.      * @param x the new column value
  1159.      *
  1160.      * @exception SQLException if a database-access error occurs
  1161.      */
  1162.     public void updateShort(String columnName, short x)
  1163.         throws SQLException {
  1164.         updateShort(findColumn(columnName), x);
  1165.     }
  1166.     /**
  1167.      * JDBC 2.0 Update a column with a String value. The updateXXX() methods
  1168.      * are used to update column values in the current row, or the insert row.
  1169.      * The updateXXX() methods do not update the underlying database, instead
  1170.      * the updateRow() or insertRow() methods are called to update the
  1171.      * database.
  1172.      *
  1173.      * @param columnIndex the first column is 1, the second is 2, ...
  1174.      * @param x the new column value
  1175.      *
  1176.      * @exception SQLException if a database-access error occurs
  1177.      * @throws NotUpdatable DOCUMENT ME!
  1178.      */
  1179.     public void updateString(int columnIndex, String x)
  1180.         throws SQLException {
  1181.         throw new NotUpdatable();
  1182.     }
  1183.     /**
  1184.      * JDBC 2.0 Update a column with a String value. The updateXXX() methods
  1185.      * are used to update column values in the current row, or the insert row.
  1186.      * The updateXXX() methods do not update the underlying database, instead
  1187.      * the updateRow() or insertRow() methods are called to update the
  1188.      * database.
  1189.      *
  1190.      * @param columnName the name of the column
  1191.      * @param x the new column value
  1192.      *
  1193.      * @exception SQLException if a database-access error occurs
  1194.      */
  1195.     public void updateString(String columnName, String x)
  1196.         throws SQLException {
  1197.         updateString(findColumn(columnName), x);
  1198.     }
  1199.     /**
  1200.      * JDBC 2.0 Update a column with a Time value. The updateXXX() methods are
  1201.      * used to update column values in the current row, or the insert row. The
  1202.      * updateXXX() methods do not update the underlying database, instead the
  1203.      * updateRow() or insertRow() methods are called to update the database.
  1204.      *
  1205.      * @param columnIndex the first column is 1, the second is 2, ...
  1206.      * @param x the new column value
  1207.      *
  1208.      * @exception SQLException if a database-access error occurs
  1209.      * @throws NotUpdatable DOCUMENT ME!
  1210.      */
  1211.     public void updateTime(int columnIndex, java.sql.Time x)
  1212.         throws SQLException {
  1213.         throw new NotUpdatable();
  1214.     }
  1215.     /**
  1216.      * JDBC 2.0 Update a column with a Time value. The updateXXX() methods are
  1217.      * used to update column values in the current row, or the insert row. The
  1218.      * updateXXX() methods do not update the underlying database, instead the
  1219.      * updateRow() or insertRow() methods are called to update the database.
  1220.      *
  1221.      * @param columnName the name of the column
  1222.      * @param x the new column value
  1223.      *
  1224.      * @exception SQLException if a database-access error occurs
  1225.      */
  1226.     public void updateTime(String columnName, java.sql.Time x)
  1227.         throws SQLException {
  1228.         updateTime(findColumn(columnName), x);
  1229.     }
  1230.     /**
  1231.      * JDBC 2.0 Update a column with a Timestamp value. The updateXXX() methods
  1232.      * are used to update column values in the current row, or the insert row.
  1233.      * The updateXXX() methods do not update the underlying database, instead
  1234.      * the updateRow() or insertRow() methods are called to update the
  1235.      * database.
  1236.      *
  1237.      * @param columnIndex the first column is 1, the second is 2, ...
  1238.      * @param x the new column value
  1239.      *
  1240.      * @exception SQLException if a database-access error occurs
  1241.      * @throws NotUpdatable DOCUMENT ME!
  1242.      */
  1243.     public void updateTimestamp(int columnIndex, java.sql.Timestamp x)
  1244.         throws SQLException {
  1245.         throw new NotUpdatable();
  1246.     }
  1247.     /**
  1248.      * JDBC 2.0 Update a column with a Timestamp value. The updateXXX() methods
  1249.      * are used to update column values in the current row, or the insert row.
  1250.      * The updateXXX() methods do not update the underlying database, instead
  1251.      * the updateRow() or insertRow() methods are called to update the
  1252.      * database.
  1253.      *
  1254.      * @param columnName the name of the column
  1255.      * @param x the new column value
  1256.      *
  1257.      * @exception SQLException if a database-access error occurs
  1258.      */
  1259.     public void updateTimestamp(String columnName, java.sql.Timestamp x)
  1260.         throws SQLException {
  1261.         updateTimestamp(findColumn(columnName), x);
  1262.     }
  1263.     /**
  1264.      * A column may have the value of SQL NULL; wasNull() reports whether the
  1265.      * last column read had this special value.  Note that you must first call
  1266.      * getXXX on a column to try to read its value and then call wasNull() to
  1267.      * find if the value was SQL NULL
  1268.      *
  1269.      * @return true if the last column read was SQL NULL
  1270.      *
  1271.      * @exception java.sql.SQLException if a database access error occurred
  1272.      */
  1273.     public boolean wasNull() throws java.sql.SQLException {
  1274.         return wasNullFlag;
  1275.     }
  1276.     ///////////////////////////////////////////
  1277.     //
  1278.     // These number conversion routines save
  1279.     // a ton of "new()s", especially for the heavily
  1280.     // used getInt() and getDouble() methods
  1281.     //
  1282.     ///////////////////////////////////////////
  1283.     /**
  1284.      * Converts a string representation of a number to a double. Need a faster
  1285.      * way to do this.
  1286.      *
  1287.      * @param colIndex the 1-based index of the column to retrieve a double
  1288.      *        from.
  1289.      *
  1290.      * @return the double value represented by the string in buf
  1291.      *
  1292.      * @throws SQLException if an error occurs
  1293.      */
  1294.     protected double getDoubleInternal(int colIndex) throws SQLException {
  1295.         String s = "";
  1296.         try {
  1297.             s = getString(colIndex);
  1298.             if ((s == null) || (s.length() == 0)) {
  1299.                 return 0;
  1300.             }
  1301.             double d = Double.parseDouble(s);
  1302.             if (this.useStrictFloatingPoint) {
  1303.                 // Fix endpoint rounding precision loss in MySQL server
  1304.                 if (d == 2.147483648E9) {
  1305.                     // Fix Odd end-point rounding on MySQL
  1306.                     d = 2.147483647E9;
  1307.                 } else if (d == 1.0000000036275E-15) {
  1308.                     // Fix odd end-point rounding on MySQL
  1309.                     d = 1.0E-15;
  1310.                 } else if (d == 9.999999869911E14) {
  1311.                     d = 9.99999999999999E14;
  1312.                 } else if (d == 1.4012984643248E-45) {
  1313.                     d = 1.4E-45;
  1314.                 } else if (d == 1.4013E-45) {
  1315.                     d = 1.4E-45;
  1316.                 } else if (d == 3.4028234663853E37) {
  1317.                     d = 3.4028235E37;
  1318.                 } else if (d == -2.14748E9) {
  1319.                     d = -2.147483648E9;
  1320.                 } else if (d == 3.40282E37) {
  1321.                     d = 3.4028235E37;
  1322.                 }
  1323.             }
  1324.             return d;
  1325.         } catch (NumberFormatException e) {
  1326.             throw new SQLException("Bad format for number '" + s + "'");
  1327.         }
  1328.     }
  1329.     /**
  1330.      * Sets the first character of the query that this result set was created
  1331.      * from.
  1332.      *
  1333.      * @param c the first character of the query...uppercased
  1334.      */
  1335.     protected void setFirstCharOfQuery(char c) {
  1336.         this.firstCharOfQuery = c;
  1337.     }
  1338.     /**
  1339.      * Returns the first character of the query that this result set was
  1340.      * created from.
  1341.      *
  1342.      * @return the first character of the query...uppercased
  1343.      */
  1344.     protected char getFirstCharOfQuery() {
  1345.         return this.firstCharOfQuery;
  1346.     }
  1347.     /**
  1348.      * Sets the concurrency (JDBC2)
  1349.      *
  1350.      * @param concurrencyFlag CONCUR_UPDATABLE or CONCUR_READONLY
  1351.      */
  1352.     protected void setResultSetConcurrency(int concurrencyFlag) {
  1353.         resultSetConcurrency = concurrencyFlag;
  1354.     }
  1355.     /**
  1356.      * Sets the result set type for (JDBC2)
  1357.      *
  1358.      * @param typeFlag SCROLL_SENSITIVE or SCROLL_INSENSITIVE (we only support
  1359.      *        SCROLL_INSENSITIVE)
  1360.      */
  1361.     protected void setResultSetType(int typeFlag) {
  1362.         resultSetType = typeFlag;
  1363.     }
  1364.     /**
  1365.      * Sets server info (if any)
  1366.      *
  1367.      * @param info the server info message
  1368.      */
  1369.     protected void setServerInfo(String info) {
  1370.         this.serverInfo = info;
  1371.     }
  1372.     /**
  1373.      * Returns the server info (if any), or null if none.
  1374.      *
  1375.      * @return server info created for this ResultSet
  1376.      */
  1377.     protected String getServerInfo() {
  1378.         return this.serverInfo;
  1379.     }
  1380.     /**
  1381.      * Builds a hash between column names and their indices for fast retrieval.
  1382.      */
  1383.     protected void buildIndexMapping() {
  1384.         int numFields = fields.length;
  1385.         columnNameToIndex = new HashMap();
  1386.         fullColumnNameToIndex = new HashMap();
  1387.         // We do this in reverse order, so that the 'first' column
  1388.         // with a given name ends up as the final mapping in the
  1389.         // hashtable...
  1390.         //
  1391.         // Quoting the JDBC Spec:
  1392.         //
  1393. // "Column names used as input to getter
  1394. // methods are case insensitive. When a getter method is called with a column
  1395. // name and several columns have the same name, the value of the first
  1396. // matching column will be returned. "
  1397.         //
  1398.         
  1399. for (int i =  numFields-1; i>= 0 ; i--) {
  1400.             Integer index = new Integer(i);
  1401.             String columnName = fields[i].getName();
  1402.             String fullColumnName = fields[i].getFullName();
  1403.             if (columnName != null) {
  1404.                 columnNameToIndex.put(columnName, index);
  1405.                 columnNameToIndex.put(columnName.toUpperCase(), index);
  1406.                 columnNameToIndex.put(columnName.toLowerCase(), index);
  1407.             }
  1408.             if (fullColumnName != null) {
  1409.                 fullColumnNameToIndex.put(fullColumnName, index);
  1410.                 fullColumnNameToIndex.put(fullColumnName.toUpperCase(), index);
  1411.                 fullColumnNameToIndex.put(fullColumnName.toLowerCase(), index);
  1412.             }
  1413.         }
  1414.         // set the flag to prevent rebuilding...
  1415.         hasBuiltIndexMapping = true;
  1416.     }
  1417.     /**
  1418.      * Ensures that the result set is not closed
  1419.      *
  1420.      * @throws SQLException if the result set is closed
  1421.      */
  1422.     protected void checkClosed() throws SQLException {
  1423.         if (isClosed) {
  1424.             throw new SQLException("Operation not allowed after ResultSet closed",
  1425.                 SQLError.SQL_STATE_GENERAL_ERROR);
  1426.         }
  1427.     }
  1428.     /**
  1429.      * Ensures that the cursor is positioned on a valid row and that the result
  1430.      * set is not closed
  1431.      *
  1432.      * @throws SQLException if the result set is not in a valid state for
  1433.      *         traversal
  1434.      */
  1435.     protected void checkRowPos() throws SQLException {
  1436.         checkClosed();
  1437.         if (!rowData.isDynamic() && (rowData.size() == 0)) {
  1438.             throw new SQLException("Illegal operation on empty result set",
  1439.                 SQLError.SQL_STATE_GENERAL_ERROR);
  1440.         }
  1441.         if (rowData.isBeforeFirst()) {
  1442.             throw new SQLException("Before start of result set", SQLError.SQL_STATE_GENERAL_ERROR);
  1443.         }
  1444.         if (rowData.isAfterLast()) {
  1445.             throw new SQLException("After end of result set", SQLError.SQL_STATE_GENERAL_ERROR);
  1446.         }
  1447.     }
  1448.     protected void realClose(boolean closeRowData) throws SQLException {
  1449.         try {
  1450.             if (closeRowData && (this.rowData != null)) {
  1451.                 rowData.close();
  1452.             }
  1453.         } finally {
  1454.          this.defaultTimeZone = null;
  1455.             this.rowData = null;
  1456.             this.isClosed = true;
  1457.         }
  1458.     }
  1459.     void setStatement(com.mysql.jdbc.Statement stmt) {
  1460.         owningStatement = stmt;
  1461.     }
  1462.     long getUpdateCount() {
  1463.         return updateCount;
  1464.     }
  1465.     long getUpdateID() {
  1466.         return updateId;
  1467.     }
  1468.     boolean reallyResult() {
  1469.         return reallyResult;
  1470.     }
  1471.     /**
  1472.      * Get the value of a column in the current row as a java.sql.Time object
  1473.      * in the given timezone
  1474.      *
  1475.      * @param columnIndex the first column is 1, the second is 2...
  1476.      * @param tz the Timezone to use
  1477.      *
  1478.      * @return the column value; null if SQL NULL
  1479.      *
  1480.      * @exception java.sql.SQLException if a database access error occurs
  1481.      */
  1482.     private Time getTimeInternal(int columnIndex, TimeZone tz)
  1483.         throws java.sql.SQLException {
  1484.         int hr = 0;
  1485.         int min = 0;
  1486.         int sec = 0;
  1487.         try {
  1488.             String timeAsString = getString(columnIndex);
  1489.             if (timeAsString == null) {
  1490.                 return null;
  1491.             } else {
  1492.                 int length = timeAsString.length();
  1493.                 if ((length > 0) && (timeAsString.charAt(0) == '0')
  1494.                         && (timeAsString.equals("0000-00-00")
  1495.                         || timeAsString.equals("0000-00-00 00:00:00")
  1496.                         || timeAsString.equals("00000000000000"))) {
  1497.                     wasNullFlag = true;
  1498.                     return null;
  1499.                 }
  1500.                 Field timeColField = fields[columnIndex - 1];
  1501.                 if (timeColField.getMysqlType() == MysqlDefs.FIELD_TYPE_TIMESTAMP) {
  1502.                     // It's a timestamp
  1503.                     switch (length) {
  1504.                     case 14:
  1505.                     case 12: {
  1506.                         hr = Integer.parseInt(timeAsString.substring(length - 6,
  1507.                                     length - 4));
  1508.                         min = Integer.parseInt(timeAsString.substring(length
  1509.                                     - 4, length - 2));
  1510.                         sec = Integer.parseInt(timeAsString.substring(length
  1511.                                     - 2, length));
  1512.                     }
  1513.                     break;
  1514.                     case 10: {
  1515.                         hr = Integer.parseInt(timeAsString.substring(6, 8));
  1516.                         min = Integer.parseInt(timeAsString.substring(8, 10));
  1517.                         sec = 0;
  1518.                     }
  1519.                     break;
  1520.                     default:
  1521.                         throw new SQLException(
  1522.                             "Timestamp too small to convert to Time value in column "
  1523.                             + columnIndex + "(" + fields[columnIndex - 1]
  1524.                             + ").", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  1525.                     } /* endswitch */
  1526.                     SQLWarning precisionLost = new SQLWarning(
  1527.                             "Precision lost converting TIMESTAMP to Time with getTime() on column "
  1528.                             + columnIndex + "(" + fields[columnIndex - 1]
  1529.                             + ").");
  1530.                     if (warningChain == null) {
  1531.                         warningChain = precisionLost;
  1532.                     } else {
  1533.                         warningChain.setNextWarning(precisionLost);
  1534.                     }
  1535.                 } else if (timeColField.getMysqlType() == MysqlDefs.FIELD_TYPE_DATETIME) {
  1536.                     hr = Integer.parseInt(timeAsString.substring(11, 13));
  1537.                     min = Integer.parseInt(timeAsString.substring(14, 16));
  1538.                     sec = Integer.parseInt(timeAsString.substring(17, 19));
  1539.                     SQLWarning precisionLost = new SQLWarning(
  1540.                             "Precision lost converting DATETIME to Time with getTime() on column "
  1541.                             + columnIndex + "(" + fields[columnIndex - 1]
  1542.                             + ").");
  1543.                     if (warningChain == null) {
  1544.                         warningChain = precisionLost;
  1545.                     } else {
  1546.                         warningChain.setNextWarning(precisionLost);
  1547.                     }
  1548.                 } else {
  1549.                     // convert a String to a Time
  1550.                     if ((length != 5) && (length != 8)) {
  1551.                         throw new SQLException("Bad format for Time '"
  1552.                             + timeAsString + "' in column " + columnIndex + "("
  1553.                             + fields[columnIndex - 1] + ").", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  1554.                     }
  1555.                     hr = Integer.parseInt(timeAsString.substring(0, 2));
  1556.                     min = Integer.parseInt(timeAsString.substring(3, 5));
  1557.                     sec = (length == 5) ? 0
  1558.                                         : Integer.parseInt(timeAsString
  1559.                             .substring(6));
  1560.                 }
  1561.                 return TimeUtil.changeTimezone(this.connection,
  1562.                     fastTimeCreate(null, hr, min, sec),
  1563.                     connection.getServerTimezone(), tz);
  1564.             }
  1565.         } catch (Exception ex) {
  1566.             throw new java.sql.SQLException(ex.getClass().getName(), SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  1567.         }
  1568.     }
  1569.     /**
  1570.      * Get the value of a column in the current row as a java.sql.Timestamp
  1571.      * object in the given timezone
  1572.      *
  1573.      * @param columnIndex the first column is 1, the second is 2...
  1574.      * @param tz the timezone to use
  1575.      *
  1576.      * @return the column value; null if SQL NULL
  1577.      *
  1578.      * @exception java.sql.SQLException if a database access error occurs
  1579.      */
  1580.     private Timestamp getTimestampInternal(int columnIndex, TimeZone tz)
  1581.         throws java.sql.SQLException {
  1582.         String timestampValue = getString(columnIndex);
  1583.         try {
  1584.             if (timestampValue == null) {
  1585.                 return null;
  1586.             } else {
  1587.                 int length = timestampValue.length();
  1588.                 if ((length > 0) && (timestampValue.charAt(0) == '0')
  1589.                         && (timestampValue.equals("0000-00-00")
  1590.                         || timestampValue.equals("0000-00-00 00:00:00")
  1591.                         || timestampValue.equals("00000000000000")
  1592.                         || timestampValue.equals("0"))) {
  1593.                     wasNullFlag = true;
  1594.                     return null;
  1595.                 } else if (fields[columnIndex - 1].getMysqlType() == MysqlDefs.FIELD_TYPE_YEAR) {
  1596.                     return TimeUtil.changeTimezone(this.connection,
  1597.                         fastTimestampCreate(null,
  1598.                             Integer.parseInt(timestampValue.substring(0, 4))
  1599.                             - 1900, 0, 1, 0, 0, 0, 0),
  1600.                         connection.getServerTimezone(), tz);
  1601.                 } else {
  1602.                     // Convert from TIMESTAMP or DATE
  1603.                     switch (length) {
  1604.                     case 19: {
  1605.                         int year = Integer.parseInt(timestampValue.substring(
  1606.                                     0, 4));
  1607.                         int month = Integer.parseInt(timestampValue.substring(
  1608.                                     5, 7));
  1609.                         int day = Integer.parseInt(timestampValue.substring(8,
  1610.                                     10));
  1611.                         int hour = Integer.parseInt(timestampValue.substring(
  1612.                                     11, 13));
  1613.                         int minutes = Integer.parseInt(timestampValue.substring(
  1614.                                     14, 16));
  1615.                         int seconds = Integer.parseInt(timestampValue.substring(
  1616.                                     17, 19));
  1617.                         return TimeUtil.changeTimezone(this.connection,
  1618.                             fastTimestampCreate(null, year - 1900, month - 1,
  1619.                                 day, hour, minutes, seconds, 0),
  1620.                             connection.getServerTimezone(), tz);
  1621.                     }
  1622.                     case 14: {
  1623.                         int year = Integer.parseInt(timestampValue.substring(
  1624.                                     0, 4));
  1625.                         int month = Integer.parseInt(timestampValue.substring(
  1626.                                     4, 6));
  1627.                         int day = Integer.parseInt(timestampValue.substring(6, 8));
  1628.                         int hour = Integer.parseInt(timestampValue.substring(
  1629.                                     8, 10));
  1630.                         int minutes = Integer.parseInt(timestampValue.substring(
  1631.                                     10, 12));
  1632.                         int seconds = Integer.parseInt(timestampValue.substring(
  1633.                                     12, 14));
  1634.                         return TimeUtil.changeTimezone(this.connection,
  1635.                             fastTimestampCreate(null, year - 1900, month - 1,
  1636.                                 day, hour, minutes, seconds, 0),
  1637.                             connection.getServerTimezone(), tz);
  1638.                     }
  1639.                     case 12: {
  1640.                         int year = Integer.parseInt(timestampValue.substring(
  1641.                                     0, 2));
  1642.                         if (year <= 69) {
  1643.                             year = (year + 100);
  1644.                         }
  1645.                         int month = Integer.parseInt(timestampValue.substring(
  1646.                                     2, 4));
  1647.                         int day = Integer.parseInt(timestampValue.substring(4, 6));
  1648.                         int hour = Integer.parseInt(timestampValue.substring(
  1649.                                     6, 8));
  1650.                         int minutes = Integer.parseInt(timestampValue.substring(
  1651.                                     8, 10));
  1652.                         int seconds = Integer.parseInt(timestampValue.substring(
  1653.                                     10, 12));
  1654.                         return TimeUtil.changeTimezone(this.connection,
  1655.                             fastTimestampCreate(null, year, month - 1, day,
  1656.                                 hour, minutes, seconds, 0),
  1657.                             connection.getServerTimezone(), tz);
  1658.                     }
  1659.                     case 10: {
  1660.                         int year;
  1661.                         int month;
  1662.                         int day;
  1663.                         int hour;
  1664.                         int minutes;
  1665.                         if ((this.fields[columnIndex - 1].getMysqlType() == MysqlDefs.FIELD_TYPE_DATE)
  1666.                                 || (timestampValue.indexOf("-") != -1)) {
  1667.                             year = Integer.parseInt(timestampValue.substring(
  1668.                                         0, 4)) - 1900;
  1669.                             month = Integer.parseInt(timestampValue.substring(
  1670.                                         5, 7));
  1671.                             day = Integer.parseInt(timestampValue.substring(8,
  1672.                                         10));
  1673.                             hour = 0;
  1674.                             minutes = 0;
  1675.                         } else {
  1676.                             year = Integer.parseInt(timestampValue.substring(
  1677.                                         0, 2));
  1678.                             if (year <= 69) {
  1679.                                 year = (year + 100);
  1680.                             }
  1681.                             month = Integer.parseInt(timestampValue.substring(
  1682.                                         2, 4));
  1683.                             day = Integer.parseInt(timestampValue.substring(4, 6));
  1684.                             hour = Integer.parseInt(timestampValue.substring(
  1685.                                         6, 8));
  1686.                             minutes = Integer.parseInt(timestampValue.substring(
  1687.                                         8, 10));
  1688.                         }
  1689.                         return TimeUtil.changeTimezone(this.connection,
  1690.                             fastTimestampCreate(null, year, month - 1, day,
  1691.                                 hour, minutes, 0, 0),
  1692.                             connection.getServerTimezone(), tz);
  1693.                     }
  1694.                     case 8: {
  1695.                         int year = Integer.parseInt(timestampValue.substring(
  1696.                                     0, 4));
  1697.                         int month = Integer.parseInt(timestampValue.substring(
  1698.                                     4, 6));
  1699.                         int day = Integer.parseInt(timestampValue.substring(6, 8));
  1700.                         return TimeUtil.changeTimezone(this.connection,
  1701.                             fastTimestampCreate(null, year - 1900, month - 1,
  1702.                                 day, 0, 0, 0, 0),
  1703.                             connection.getServerTimezone(), tz);
  1704.                     }
  1705.                     case 6: {
  1706.                         int year = Integer.parseInt(timestampValue.substring(
  1707.                                     0, 2));
  1708.                         if (year <= 69) {
  1709.                             year = (year + 100);
  1710.                         }
  1711.                         int month = Integer.parseInt(timestampValue.substring(
  1712.                                     2, 4));
  1713.                         int day = Integer.parseInt(timestampValue.substring(4, 6));
  1714.                         return TimeUtil.changeTimezone(this.connection,
  1715.                             fastTimestampCreate(null, year, month - 1, day, 0,
  1716.                                 0, 0, 0), connection.getServerTimezone(), tz);
  1717.                     }
  1718.                     case 4: {
  1719.                         int year = Integer.parseInt(timestampValue.substring(
  1720.                                     0, 2));
  1721.                         if (year <= 69) {
  1722.                             year = (year + 100);
  1723.                         }
  1724.                         int month = Integer.parseInt(timestampValue.substring(
  1725.                                     2, 4));
  1726.                         return TimeUtil.changeTimezone(this.connection,
  1727.                             fastTimestampCreate(null, year, month - 1, 1, 0, 0,
  1728.                                 0, 0), connection.getServerTimezone(), tz);
  1729.                     }
  1730.                     case 2: {
  1731.                         int year = Integer.parseInt(timestampValue.substring(
  1732.                                     0, 2));
  1733.                         if (year <= 69) {
  1734.                             year = (year + 100);
  1735.                         }
  1736.                         return TimeUtil.changeTimezone(this.connection,
  1737.                             fastTimestampCreate(null, year, 0, 1, 0, 0, 0, 0),
  1738.                             connection.getServerTimezone(), tz);
  1739.                     }
  1740.                     default:
  1741.                         throw new java.sql.SQLException(
  1742.                             "Bad format for Timestamp '" + timestampValue
  1743.                             + "' in column " + columnIndex + "("
  1744.                             + fields[columnIndex - 1] + ").", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  1745.                     }
  1746.                 }
  1747.             }
  1748.         } catch (Exception e) {
  1749.             throw new java.sql.SQLException("Cannot convert value '"
  1750.                 + timestampValue + "' from column " + columnIndex + "("
  1751.                 + timestampValue + " ) to TIMESTAMP.", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  1752.         }
  1753.     }
  1754.     private synchronized Date fastDateCreate(Calendar cal, int year, int month,
  1755.         int day) {
  1756.         if (cal == null) {
  1757.             if (this.fastDateCal == null) {
  1758.                 this.fastDateCal = new GregorianCalendar();
  1759.                 this.fastDateCal.setTimeZone(this.defaultTimeZone);
  1760.             }
  1761.             cal = this.fastDateCal;
  1762.         }
  1763.         cal.clear();
  1764.         cal.set(year + 1900, month, day, 0, 0, 0);
  1765.         long dateAsMillis = 0;
  1766.         try {
  1767.             dateAsMillis = cal.getTimeInMillis();
  1768.         } catch (IllegalAccessError iae) {
  1769.             // Must be on JDK-1.3.1 or older....
  1770.             dateAsMillis = cal.getTime().getTime();
  1771.         }
  1772.         return new Date(dateAsMillis);
  1773.     }
  1774.     private synchronized Time fastTimeCreate(Calendar cal, int hour,
  1775.         int minute, int second) {
  1776.         if (cal == null) {
  1777.             if (this.fastDateCal == null) {
  1778.                 this.fastDateCal = new GregorianCalendar();
  1779.                 this.fastDateCal.setTimeZone(this.defaultTimeZone);
  1780.             }
  1781.             cal = this.fastDateCal;
  1782.         }
  1783.         cal.clear();
  1784.         // Set 'date' to epoch of Jan 1, 1970
  1785.         cal.set(1970, 0, 1, hour, minute, second);
  1786.         long timeAsMillis = 0;
  1787.         try {
  1788.             timeAsMillis = cal.getTimeInMillis();
  1789.         } catch (IllegalAccessError iae) {
  1790.             // Must be on JDK-1.3.1 or older....
  1791.             timeAsMillis = cal.getTime().getTime();
  1792.         }
  1793.         return new Time(timeAsMillis);
  1794.     }
  1795.     private synchronized Timestamp fastTimestampCreate(Calendar cal, int year,
  1796.         int month, int day, int hour, int minute, int seconds, int secondsPart) {
  1797.         if (cal == null) {
  1798.             if (this.fastDateCal == null) {
  1799.                 this.fastDateCal = new GregorianCalendar();
  1800.                 this.fastDateCal.setTimeZone(this.defaultTimeZone);
  1801.             }
  1802.             cal = this.fastDateCal;
  1803.         }
  1804.         cal.clear();
  1805.         cal.set(year + 1900, month, day, hour, minute, seconds);
  1806.         long tsAsMillis = 0;
  1807.         try {
  1808.             tsAsMillis = cal.getTimeInMillis();
  1809.         } catch (IllegalAccessError iae) {
  1810.             // Must be on JDK-1.3.1 or older....
  1811.             tsAsMillis = cal.getTime().getTime();
  1812.         }
  1813.         Timestamp ts = new Timestamp(tsAsMillis);
  1814.         ts.setNanos(secondsPart);
  1815.         return ts;
  1816.     }
  1817. }