summaryrefslogtreecommitdiff
path: root/src/interfaces/jdbc/org/postgresql/jdbc2/UpdateableResultSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/jdbc/org/postgresql/jdbc2/UpdateableResultSet.java')
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/UpdateableResultSet.java1389
1 files changed, 0 insertions, 1389 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/UpdateableResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/UpdateableResultSet.java
deleted file mode 100644
index 6f6f67d839..0000000000
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/UpdateableResultSet.java
+++ /dev/null
@@ -1,1389 +0,0 @@
-package org.postgresql.jdbc2;
-
-// IMPORTANT NOTE: This is the begining of supporting updateable ResultSets.
-//
-// This is because here we should be updateable, so any unimplemented methods
-// must say so.
-//
-// Also you'll notice that the String columnName based calls are not present.
-// They are not required as they are in the super class.
-//
-
-import java.lang.*;
-import java.io.*;
-import java.math.*;
-import java.text.*;
-import java.util.*;
-import java.sql.*;
-import org.postgresql.Field;
-import org.postgresql.largeobject.*;
-import org.postgresql.util.*;
-import org.postgresql.Driver;
-
-/*
- * @see ResultSet
- * @see ResultSetMetaData
- * @see java.sql.ResultSet
- */
-public class UpdateableResultSet extends org.postgresql.jdbc2.Jdbc2ResultSet
-{
-
-
- class PrimaryKey
- {
- int index; // where in the result set is this primaryKey
- String name; // what is the columnName of this primary Key
-
- PrimaryKey( int index, String name)
- {
- this.index = index;
- this.name = name;
- }
- Object getValue() throws SQLException
- {
- return getObject(index);
- }
- };
-
- private boolean usingOID = false; // are we using the OID for the primary key?
-
- private Vector primaryKeys; // list of primary keys
-
- private int numKeys = 0;
-
- private boolean singleTable = false;
-
- protected String tableName = null;
-
- /**
- * PreparedStatement used to delete data
- */
-
- protected java.sql.PreparedStatement updateStatement = null;
-
- /**
- * PreparedStatement used to insert data
- */
-
- protected java.sql.PreparedStatement insertStatement = null;
-
- /**
- * PreparedStatement used to delete data
- */
-
- protected java.sql.PreparedStatement deleteStatement = null;
-
-
- /**
- * PreparedStatement used to refresh data
- */
- private java.sql.PreparedStatement selectStatement = null;
-
-
- /**
- * Is this result set updateable?
- */
-
- protected boolean updateable = false;
-
- /**
- * Are we in the middle of doing updates to the current row?
- */
-
- protected boolean doingUpdates = false;
-
-
- /**
- * Are we on the insert row?
- */
-
- protected boolean onInsertRow = false;
-
-
- protected Hashtable updateValues = new Hashtable();
-
- // The Row Buffer will be used to cache updated rows..then we shall sync this with the rows vector
-
-
- /*
- * Create a new ResultSet - Note that we create ResultSets to
- * represent the results of everything.
- *
- * @param fields an array of Field objects (basically, the
- * ResultSet MetaData)
- * @param tuples Vector of the actual data
- * @param status the status string returned from the back end
- * @param updateCount the number of rows affected by the operation
- * @param cursor the positioned update/delete cursor name
- */
- public UpdateableResultSet(Jdbc2Connection conn, Field[] fields, Vector tuples, String status, int updateCount, long insertOID, boolean binaryCursor)
- {
- super(conn, fields, tuples, status, updateCount, insertOID, binaryCursor);
- }
-
- /**
- *
- * @throws SQLException
- */
- public synchronized void cancelRowUpdates() throws SQLException
- {
- if (doingUpdates)
- {
- doingUpdates = false;
-
- clearRowBuffer();
- }
- }
-
- /**
- *
- * @throws SQLException
- */
- public synchronized void deleteRow() throws SQLException
- {
- if ( !isUpdateable() )
- {
- throw new PSQLException( "postgresql.updateable.notupdateable" );
- }
-
- if (onInsertRow)
- {
- throw new PSQLException( "postgresql.updateable.oninsertrow" );
- }
-
- if (rows.size() == 0)
- {
- throw new PSQLException( "postgresql.updateable.emptydelete" );
- }
- if (isBeforeFirst())
- {
- throw new PSQLException( "postgresql.updateable.beforestartdelete" );
- }
- if (isAfterLast())
- {
- throw new PSQLException( "postgresql.updateable.afterlastdelete" );
- }
-
-
- int numKeys = primaryKeys.size();
- if ( deleteStatement == null )
- {
-
-
- StringBuffer deleteSQL= new StringBuffer("DELETE FROM " ).append(tableName).append(" where " );
-
- for ( int i=0; i < numKeys ; i++ )
- {
- deleteSQL.append( ((PrimaryKey)primaryKeys.get(i)).name ).append( " = ? " );
- if ( i < numKeys-1 )
- {
- deleteSQL.append( " and " );
- }
- }
-
- deleteStatement = ((java.sql.Connection)connection).prepareStatement(deleteSQL.toString());
- }
- deleteStatement.clearParameters();
-
- for ( int i =0; i < numKeys; i++ )
- {
- deleteStatement.setObject(i+1, ((PrimaryKey)primaryKeys.get(i)).getValue());
- }
-
-
- deleteStatement.executeUpdate();
-
- rows.removeElementAt(current_row);
- }
-
-
- /**
- *
- * @return
- * @throws SQLException
- */
- public int getConcurrency() throws SQLException
- {
- // New in 7.1 - The updateable ResultSet class will now return
- // CONCURuPDATEABLE.
- return CONCUR_UPDATABLE;
- }
-
- /**
- *
- * @throws SQLException
- */
-
- public synchronized void insertRow() throws SQLException
- {
- if ( !isUpdateable() )
- {
- throw new PSQLException( "postgresql.updateable.notupdateable" );
- }
-
- if (!onInsertRow)
- {
- throw new PSQLException( "postgresql.updateable.notoninsertrow" );
- }
- else
- {
-
- // loop through the keys in the insertTable and create the sql statement
- // we have to create the sql every time since the user could insert different
- // columns each time
-
- StringBuffer insertSQL=new StringBuffer("INSERT INTO ").append(tableName).append(" (");
- StringBuffer paramSQL = new StringBuffer(") values (" );
-
- Enumeration columnNames = updateValues.keys();
- int numColumns = updateValues.size();
-
- for ( int i=0; columnNames.hasMoreElements() ; i++ )
- {
- String columnName = (String)columnNames.nextElement();
-
- insertSQL.append( columnName );
- if ( i < numColumns - 1 )
- {
- insertSQL.append(", ");
- paramSQL.append("?,");
- }
- else
- {
- paramSQL.append("?)");
- }
-
- }
-
- insertSQL.append(paramSQL.toString());
- insertStatement = ((java.sql.Connection)connection).prepareStatement(insertSQL.toString());
-
- Enumeration keys = updateValues.keys();
-
- for( int i=1; keys.hasMoreElements() ; i++)
- {
- String key = (String)keys.nextElement();
- insertStatement.setObject(i, updateValues.get( key ) );
- }
-
- insertStatement.executeUpdate();
-
- if ( usingOID )
- {
- // we have to get the last inserted OID and put it in the resultset
-
- long insertedOID = ((AbstractJdbc2Statement)insertStatement).getLastOID();
-
- updateValues.put("oid", new Long(insertedOID) );
-
- }
-
- // update the underlying row to the new inserted data
- updateRowBuffer();
-
- rows.addElement(rowBuffer);
-
- // we should now reflect the current data in this_row
- // that way getXXX will get the newly inserted data
- this_row = rowBuffer;
-
- // need to clear this in case of another insert
- clearRowBuffer();
-
-
- }
- }
-
-
- /**
- *
- * @throws SQLException
- */
-
- public synchronized void moveToCurrentRow() throws SQLException
- {
- this_row = (byte [][])rows.elementAt(current_row);
-
- rowBuffer=new byte[this_row.length][];
- System.arraycopy(this_row,0,rowBuffer,0,this_row.length);
-
- onInsertRow = false;
- doingUpdates = false;
- }
-
- /**
- *
- * @throws SQLException
- */
- public synchronized void moveToInsertRow() throws SQLException
- {
- // only sub-classes implement CONCURuPDATEABLE
- if (!updateable)
- {
- throw new PSQLException( "postgresql.updateable.notupdateable" );
- }
-
- if (insertStatement != null)
- {
- insertStatement = null;
- }
-
-
- // make sure the underlying data is null
- clearRowBuffer();
-
- onInsertRow = true;
- doingUpdates = false;
-
- }
-
- /**
- *
- * @throws SQLException
- */
- private synchronized void clearRowBuffer() throws SQLException
- {
- // rowBuffer is the temporary storage for the row
- rowBuffer=new byte[fields.length][];
-
- // clear the updateValues hashTable for the next set of updates
- updateValues.clear();
-
- }
-
-
- /**
- *
- * @return
- * @throws SQLException
- */
- public boolean rowDeleted() throws SQLException
- {
- // only sub-classes implement CONCURuPDATEABLE
- throw Driver.notImplemented();
- }
-
- /**
- *
- * @return
- * @throws SQLException
- */
- public boolean rowInserted() throws SQLException
- {
- // only sub-classes implement CONCURuPDATEABLE
- throw Driver.notImplemented();
- }
-
- /**
- *
- * @return
- * @throws SQLException
- */
- public boolean rowUpdated() throws SQLException
- {
- // only sub-classes implement CONCURuPDATEABLE
- throw Driver.notImplemented();
- }
-
- /**
- *
- * @param columnIndex
- * @param x
- * @param length
- * @throws SQLException
- */
- public synchronized void updateAsciiStream(int columnIndex,
- java.io.InputStream x,
- int length
- ) throws SQLException
- {
-
- byte[] theData=null;
-
- try
- {
- x.read(theData,0,length);
- }
- catch (NullPointerException ex )
- {
- throw new PSQLException("postgresql.updateable.inputstream");
- }
- catch (IOException ie)
- {
- throw new PSQLException("postgresql.updateable.ioerror" + ie);
- }
-
- doingUpdates = !onInsertRow;
-
- updateValues.put( fields[columnIndex-1].getName(), theData );
-
- }
-
- /**
- *
- * @param columnIndex
- * @param x
- * @throws SQLException
- */
- public synchronized void updateBigDecimal(int columnIndex,
- java.math.BigDecimal x )
- throws SQLException
- {
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), x );
-
- }
-
- /**
- *
- * @param columnIndex
- * @param x
- * @param length
- * @throws SQLException
- */
- public synchronized void updateBinaryStream(int columnIndex,
- java.io.InputStream x,
- int length
- ) throws SQLException
- {
-
-
- byte[] theData=null;
-
- try {
- x.read(theData,0,length);
-
- }
- catch( NullPointerException ex )
- {
- throw new PSQLException("postgresql.updateable.inputstream");
- }
- catch (IOException ie)
- {
- throw new PSQLException("postgresql.updateable.ioerror" + ie);
- }
-
- doingUpdates = !onInsertRow;
-
- updateValues.put( fields[columnIndex-1].getName(), theData );
-
- }
-
- /**
- *
- * @param columnIndex
- * @param x
- * @throws SQLException
- */
- public synchronized void updateBoolean(int columnIndex, boolean x) throws SQLException
- {
-
- if ( Driver.logDebug ) Driver.debug("updating boolean "+fields[columnIndex-1].getName()+"="+x);
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), new Boolean(x) );
-
- }
-
- /**
- *
- * @param columnIndex
- * @param x
- * @throws SQLException
- */
- public synchronized void updateByte(int columnIndex, byte x) throws SQLException
- {
-
- doingUpdates = true;
- updateValues.put( fields[columnIndex-1].getName(), String.valueOf(x) );
- }
-
- /**
- *
- * @param columnIndex
- * @param x
- * @throws SQLException
- */
- public synchronized void updateBytes(int columnIndex, byte[] x) throws SQLException
- {
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), x );
-
- }
-
- /**
- *
- * @param columnIndex
- * @param x
- * @param length
- * @throws SQLException
- */
- public synchronized void updateCharacterStream(int columnIndex,
- java.io.Reader x,
- int length
- ) throws SQLException
- {
-
-
- char[] theData=null;
-
- try
- {
- x.read(theData,0,length);
-
- }
- catch (NullPointerException ex)
- {
- throw new PSQLException("postgresql.updateable.inputstream");
- }
- catch (IOException ie)
- {
- throw new PSQLException("postgresql.updateable.ioerror" + ie);
- }
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), theData);
-
- }
-
- public synchronized void updateDate(int columnIndex, java.sql.Date x) throws SQLException
- {
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), x );
- }
-
- public synchronized void updateDouble(int columnIndex, double x) throws SQLException
- {
- if ( Driver.logDebug ) Driver.debug("updating double "+fields[columnIndex-1].getName()+"="+x);
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), new Double(x) );
-
- }
-
- public synchronized void updateFloat(int columnIndex, float x) throws SQLException
- {
- if ( Driver.logDebug ) Driver.debug("updating float "+fields[columnIndex-1].getName()+"="+x);
-
- doingUpdates = !onInsertRow;
-
- updateValues.put( fields[columnIndex-1].getName(), new Float(x) );
-
- }
-
- public synchronized void updateInt(int columnIndex, int x) throws SQLException
- {
- if ( Driver.logDebug ) Driver.debug("updating int "+fields[columnIndex-1].getName()+"="+x);
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), new Integer(x) );
-
- }
-
- public synchronized void updateLong(int columnIndex, long x) throws SQLException
- {
- if ( Driver.logDebug ) Driver.debug("updating long "+fields[columnIndex-1].getName()+"="+x);
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), new Long(x) );
-
- }
-
- public synchronized void updateNull(int columnIndex) throws SQLException
- {
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), null);
-
-
- }
-
- public synchronized void updateObject(int columnIndex, Object x) throws SQLException
- {
-
-
- if ( Driver.logDebug ) Driver.debug("updating object " + fields[columnIndex-1].getName() + " = " + x);
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), x );
- }
-
- public synchronized void updateObject(int columnIndex, Object x, int scale) throws SQLException
- {
-
- this.updateObject(columnIndex, x);
-
- }
-
-
- public void refreshRow() throws SQLException
- {
- if ( !isUpdateable() )
- {
- throw new PSQLException( "postgresql.updateable.notupdateable" );
- }
-
- try
- {
- StringBuffer selectSQL = new StringBuffer( "select ");
-
- final int numColumns = java.lang.reflect.Array.getLength(fields);
-
- for (int i=0; i < numColumns ; i++ )
- {
-
- selectSQL.append( fields[i].getName() );
-
- if ( i < numColumns - 1 )
- {
-
- selectSQL.append(", ");
- }
-
- }
- selectSQL.append(" from " ).append(tableName).append(" where ");
-
- int numKeys = primaryKeys.size();
-
- for ( int i = 0; i < numKeys; i++ )
- {
-
- PrimaryKey primaryKey = ((PrimaryKey)primaryKeys.get(i));
- selectSQL.append(primaryKey.name).append("= ?");
-
- if ( i < numKeys -1 )
- {
- selectSQL.append(" and ");
- }
- }
- if ( Driver.logDebug ) Driver.debug("selecting "+ selectSQL.toString());
- selectStatement = ((java.sql.Connection)connection).prepareStatement(selectSQL.toString());
-
-
- for( int j=0, i=1; j < numKeys; j++, i++)
- {
- selectStatement.setObject( i, ((PrimaryKey)primaryKeys.get(j)).getValue() );
- }
-
- Jdbc2ResultSet rs = (Jdbc2ResultSet) selectStatement.executeQuery();
-
- if( rs.first() )
- {
- rowBuffer = rs.rowBuffer;
- }
-
- rows.setElementAt( rowBuffer, current_row );
- if ( Driver.logDebug ) Driver.debug("done updates");
-
- rs.close();
- selectStatement.close();
- selectStatement = null;
-
- }
- catch (Exception e)
- {
- if ( Driver.logDebug ) Driver.debug(e.getClass().getName()+e);
- throw new SQLException( e.getMessage() );
- }
-
- }
- /**
- *
- * @throws SQLException
- */
- public synchronized void updateRow() throws SQLException
- {
- if ( !isUpdateable() )
- {
- throw new PSQLException( "postgresql.updateable.notupdateable" );
- }
-
- if (doingUpdates)
- {
-
- try
- {
-
- StringBuffer updateSQL=new StringBuffer("UPDATE "+tableName+" SET ");
-
- int numColumns = updateValues.size();
- Enumeration columns = updateValues.keys();
-
- for (int i=0; columns.hasMoreElements() ; i++ )
- {
-
- String column = (String)columns.nextElement();
- updateSQL.append( column + "= ?");
-
- if ( i < numColumns - 1 )
- {
-
- updateSQL.append(", ");
- }
-
- }
- updateSQL.append( " WHERE " );
-
- int numKeys = primaryKeys.size();
-
- for ( int i = 0; i < numKeys; i++ )
- {
-
- PrimaryKey primaryKey = ((PrimaryKey)primaryKeys.get(i));
- updateSQL.append(primaryKey.name).append("= ?");
-
- if ( i < numKeys -1 )
- {
- updateSQL.append(" and ");
- }
- }
- if ( Driver.logDebug ) Driver.debug("updating "+updateSQL.toString());
- updateStatement = ((java.sql.Connection)connection).prepareStatement(updateSQL.toString());
-
- int i = 0;
- Iterator iterator = updateValues.values().iterator();
- for (; iterator.hasNext(); i++)
- {
- updateStatement.setObject( i+1, iterator.next() );
-
- }
- for( int j=0; j < numKeys; j++, i++)
- {
- updateStatement.setObject( i+1, ((PrimaryKey)primaryKeys.get(j)).getValue() );
- }
-
- updateStatement.executeUpdate();
- updateStatement.close();
-
- updateStatement = null;
- updateRowBuffer();
-
-
- if ( Driver.logDebug ) Driver.debug("copying data");
- System.arraycopy(rowBuffer,0,this_row,0,rowBuffer.length);
-
- rows.setElementAt( rowBuffer, current_row );
- if ( Driver.logDebug ) Driver.debug("done updates");
-
- doingUpdates = false;
- }
- catch(Exception e)
- {
- if ( Driver.logDebug ) Driver.debug(e.getClass().getName()+e);
- throw new SQLException( e.getMessage() );
- }
-
- }
-
- }
-
- public synchronized void updateShort(int columnIndex, short x) throws SQLException
- {
- if ( Driver.logDebug ) Driver.debug("in update Short "+fields[columnIndex-1].getName()+" = "+x);
-
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), new Short(x) );
-
- }
-
- public synchronized void updateString(int columnIndex, String x) throws SQLException
- {
- if ( Driver.logDebug ) Driver.debug("in update String "+fields[columnIndex-1].getName()+" = "+x);
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), x );
-
- }
-
- public synchronized void updateTime(int columnIndex, Time x) throws SQLException
- {
- if ( Driver.logDebug ) Driver.debug("in update Time "+fields[columnIndex-1].getName()+" = "+x);
-
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), x );
-
- }
-
- public synchronized void updateTimestamp(int columnIndex, Timestamp x) throws SQLException
- {
- if ( Driver.logDebug ) Driver.debug("updating Timestamp "+fields[columnIndex-1].getName()+" = "+x);
-
- doingUpdates = !onInsertRow;
- updateValues.put( fields[columnIndex-1].getName(), x );
-
-
- }
-
- public synchronized void updateNull(String columnName) throws SQLException
- {
- updateNull(findColumn(columnName));
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a boolean value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateBoolean(String columnName, boolean x) throws SQLException
- {
- updateBoolean(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a byte value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateByte(String columnName, byte x) throws SQLException
- {
- updateByte(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a short value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateShort(String columnName, short x) throws SQLException
- {
- updateShort(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with an integer value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateInt(String columnName, int x) throws SQLException
- {
- updateInt(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a long value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateLong(String columnName, long x) throws SQLException
- {
- updateLong(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a float value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateFloat(String columnName, float x) throws SQLException
- {
- updateFloat(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a double value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateDouble(String columnName, double x) throws SQLException
- {
- updateDouble(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a BigDecimal value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateBigDecimal(String columnName, BigDecimal x)
- throws SQLException
- {
- updateBigDecimal(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a String value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateString(String columnName, String x) throws SQLException
- {
- updateString(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a byte array value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateBytes(String columnName, byte x[]) throws SQLException
- {
- updateBytes(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a Date value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateDate(String columnName, java.sql.Date x)
- throws SQLException
- {
- updateDate(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a Time value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateTime(String columnName, java.sql.Time x)
- throws SQLException
- {
- updateTime(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a Timestamp value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateTimestamp(String columnName, java.sql.Timestamp x)
- throws SQLException
- {
- updateTimestamp(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with an ascii stream value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @param length of the stream
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateAsciiStream(
- String columnName,
- java.io.InputStream x,
- int length)
- throws SQLException
- {
- updateAsciiStream(findColumn(columnName), x, length);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a binary stream value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @param length of the stream
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateBinaryStream(
- String columnName,
- java.io.InputStream x,
- int length)
- throws SQLException
- {
- updateBinaryStream(findColumn(columnName), x, length);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with a character stream value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @param length of the stream
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateCharacterStream(
- String columnName,
- java.io.Reader reader,
- int length)
- throws SQLException
- {
- updateCharacterStream(findColumn(columnName), reader,length);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with an Object value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @param scale For java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types
- * this is the number of digits after the decimal. For all other
- * types this value will be ignored.
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateObject(String columnName, Object x, int scale)
- throws SQLException
- {
- updateObject(findColumn(columnName), x);
- }
-
- /**
- * JDBC 2.0
- *
- * Update a column with an Object value.
- *
- * The updateXXX() methods are used to update column values in the
- * current row, or the insert row. The updateXXX() methods do not
- * update the underlying database, instead the updateRow() or insertRow()
- * methods are called to update the database.
- *
- * @param columnName the name of the column
- * @param x the new column value
- * @exception SQLException if a database-access error occurs
- */
-
- public synchronized void updateObject(String columnName, Object x) throws SQLException
- {
- updateObject(findColumn(columnName), x);
- }
-
-
-
- private int _findColumn( String columnName )
- {
- int i;
-
- final int flen = fields.length;
- for (i = 0 ; i < flen; ++i)
- {
- if (fields[i].getName().equalsIgnoreCase(columnName))
- {
- return (i + 1);
- }
- }
- return -1;
- }
-
-
- /**
- * Is this ResultSet updateable?
- */
-
- boolean isUpdateable() throws SQLException
- {
-
- if (updateable) return true;
-
- if ( Driver.logDebug ) Driver.debug("checking if rs is updateable");
-
- parseQuery();
-
- if ( singleTable == false )
- {
- if ( Driver.logDebug ) Driver.debug("not a single table");
- return false;
- }
-
- if ( Driver.logDebug ) Driver.debug("getting primary keys");
-
- //
- // Contains the primary key?
- //
-
- primaryKeys = new Vector();
-
- // this is not stricty jdbc spec, but it will make things much faster if used
- // the user has to select oid, * from table and then we will just use oid
-
-
- usingOID = false;
- int oidIndex = _findColumn( "oid" );
- int i = 0;
-
-
- // if we find the oid then just use it
-
- if ( oidIndex > 0 )
- {
- i++;
- primaryKeys.add( new PrimaryKey( oidIndex, "oid" ) );
- usingOID = true;
- }
- else
- {
- // otherwise go and get the primary keys and create a hashtable of keys
- java.sql.ResultSet rs = ((java.sql.Connection)connection).getMetaData().getPrimaryKeys("","",tableName);
-
-
- for( ; rs.next(); i++ )
- {
- String columnName = rs.getString(4); // get the columnName
-
- int index = findColumn( columnName );
-
- if ( index > 0 )
- {
- primaryKeys.add( new PrimaryKey(index, columnName ) ); // get the primary key information
- }
- }
-
- rs.close();
- }
-
- numKeys = primaryKeys.size();
-
- if ( Driver.logDebug ) Driver.debug( "no of keys=" + i );
-
- if ( i < 1 )
- {
- throw new SQLException("No Primary Keys");
- }
-
- updateable = primaryKeys.size() > 0;
-
- if ( Driver.logDebug ) Driver.debug( "checking primary key " + updateable );
-
- return updateable;
- }
-
-
- /**
- *
- */
- public void parseQuery()
- {
- StringTokenizer st=new StringTokenizer(sqlQuery," \r\t");
- boolean tableFound=false, tablesChecked = false;
- String name="";
-
- singleTable = true;
-
- while ( !tableFound && !tablesChecked && st.hasMoreTokens() )
- {
- name=st.nextToken();
- if ( !tableFound )
- {
- if (name.toLowerCase().equals("from"))
- {
- tableName=st.nextToken();
- tableFound=true;
- }
- }
- else
- {
- tablesChecked = true;
- // if the very next token is , then there are multiple tables
- singleTable = !name.equalsIgnoreCase(",");
- }
- }
- }
-
-
- private void updateRowBuffer() throws SQLException
- {
-
- Enumeration columns = updateValues.keys();
-
- while( columns.hasMoreElements() )
- {
- String columnName = (String)columns.nextElement();
- int columnIndex = _findColumn( columnName ) - 1;
-
- switch ( connection.getSQLType( fields[columnIndex].getPGType() ) )
- {
-
- case Types.DECIMAL:
- case Types.BIGINT:
- case Types.DOUBLE:
- case Types.BIT:
- case Types.VARCHAR:
- case Types.DATE:
- case Types.TIME:
- case Types.TIMESTAMP:
- case Types.SMALLINT:
- case Types.FLOAT:
- case Types.INTEGER:
- case Types.CHAR:
- case Types.NUMERIC:
- case Types.REAL:
- case Types.TINYINT:
-
- try
- {
- rowBuffer[columnIndex] = String.valueOf( updateValues.get( columnName ) ).getBytes(connection.getEncoding().name() );
- }
- catch ( UnsupportedEncodingException ex)
- {
- throw new SQLException("Unsupported Encoding "+connection.getEncoding().name());
- }
- case Types.NULL:
- continue;
- default:
- rowBuffer[columnIndex] = (byte [])updateValues.get( columnName );
- }
-
- }
- }
-
-}
-