ResultSet.java
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:36k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. package postgresql.jdbc2;
  2. // IMPORTANT NOTE: This file implements the JDBC 2 version of the driver.
  3. // If you make any modifications to this file, you must make sure that the
  4. // changes are also made (if relevent) to the related JDBC 1 class in the
  5. // postgresql.jdbc1 package.
  6. import java.lang.*;
  7. import java.io.*;
  8. import java.math.*;
  9. import java.text.*;
  10. import java.util.*;
  11. import java.sql.*;
  12. import postgresql.Field;
  13. import postgresql.largeobject.*;
  14. import postgresql.util.*;
  15. /**
  16.  * A ResultSet provides access to a table of data generated by executing a
  17.  * Statement.  The table rows are retrieved in sequence.  Within a row its
  18.  * column values can be accessed in any order.
  19.  *
  20.  * <P>A ResultSet maintains a cursor pointing to its current row of data.  
  21.  * Initially the cursor is positioned before the first row.  The 'next'
  22.  * method moves the cursor to the next row.
  23.  *
  24.  * <P>The getXXX methods retrieve column values for the current row.  You can
  25.  * retrieve values either using the index number of the column, or by using
  26.  * the name of the column.  In general using the column index will be more
  27.  * efficient.  Columns are numbered from 1.
  28.  *
  29.  * <P>For maximum portability, ResultSet columns within each row should be read
  30.  * in left-to-right order and each column should be read only once.
  31.  *
  32.  *<P> For the getXXX methods, the JDBC driver attempts to convert the
  33.  * underlying data to the specified Java type and returns a suitable Java
  34.  * value.  See the JDBC specification for allowable mappings from SQL types
  35.  * to Java types with the ResultSet getXXX methods.
  36.  *
  37.  * <P>Column names used as input to getXXX methods are case insenstive.  When
  38.  * performing a getXXX using a column name, if several columns have the same
  39.  * name, then the value of the first matching column will be returned.  The
  40.  * column name option is designed to be used when column names are used in the
  41.  * SQL Query.  For columns that are NOT explicitly named in the query, it is
  42.  * best to use column numbers.  If column names were used there is no way for
  43.  * the programmer to guarentee that they actually refer to the intended
  44.  * columns.
  45.  *
  46.  * <P>A ResultSet is automatically closed by the Statement that generated it 
  47.  * when that Statement is closed, re-executed, or is used to retrieve the 
  48.  * next result from a sequence of multiple results.
  49.  *
  50.  * <P>The number, types and properties of a ResultSet's columns are provided by
  51.  * the ResultSetMetaData object returned by the getMetaData method.
  52.  *
  53.  * @see ResultSetMetaData
  54.  * @see java.sql.ResultSet
  55.  */
  56. public class ResultSet extends postgresql.ResultSet implements java.sql.ResultSet 
  57. {
  58.   /**
  59.    * Create a new ResultSet - Note that we create ResultSets to
  60.    * represent the results of everything.
  61.    *
  62.    * @param fields an array of Field objects (basically, the
  63.    * ResultSet MetaData)
  64.    * @param tuples Vector of the actual data
  65.    * @param status the status string returned from the back end
  66.    * @param updateCount the number of rows affected by the operation
  67.    * @param cursor the positioned update/delete cursor name
  68.    */
  69.   public ResultSet(Connection conn, Field[] fields, Vector tuples, String status, int updateCount)
  70.   {
  71.       super(conn,fields,tuples,status,updateCount);
  72.   }
  73.   
  74.   /**
  75.    * A ResultSet is initially positioned before its first row,
  76.    * the first call to next makes the first row the current row;
  77.    * the second call makes the second row the current row, etc.
  78.    *
  79.    * <p>If an input stream from the previous row is open, it is
  80.    * implicitly closed.  The ResultSet's warning chain is cleared
  81.    * when a new row is read
  82.    *
  83.    * @return true if the new current is valid; false if there are no
  84.    * more rows
  85.    * @exception SQLException if a database access error occurs
  86.    */
  87.   public boolean next() throws SQLException
  88.   {
  89.     if (++current_row >= rows.size())
  90.       return false;
  91.     this_row = (byte [][])rows.elementAt(current_row);
  92.     return true;
  93.   }
  94.   
  95.   /**
  96.    * In some cases, it is desirable to immediately release a ResultSet
  97.    * database and JDBC resources instead of waiting for this to happen
  98.    * when it is automatically closed.  The close method provides this
  99.    * immediate release.
  100.    *
  101.    * <p><B>Note:</B> A ResultSet is automatically closed by the Statement
  102.    * the Statement that generated it when that Statement is closed,
  103.    * re-executed, or is used to retrieve the next result from a sequence
  104.    * of multiple results.  A ResultSet is also automatically closed 
  105.    * when it is garbage collected.
  106.    *
  107.    * @exception SQLException if a database access error occurs
  108.    */
  109.   public void close() throws SQLException
  110.   {
  111.     // No-op
  112.   }
  113.   
  114.   /**
  115.    * A column may have the value of SQL NULL; wasNull() reports whether
  116.    * the last column read had this special value.  Note that you must
  117.    * first call getXXX on a column to try to read its value and then
  118.    * call wasNull() to find if the value was SQL NULL
  119.    *
  120.    * @return true if the last column read was SQL NULL
  121.    * @exception SQLException if a database access error occurred
  122.    */
  123.   public boolean wasNull() throws SQLException
  124.   {
  125.     return wasNullFlag;
  126.   }
  127.   
  128.   /**
  129.    * Get the value of a column in the current row as a Java String
  130.    *
  131.    * @param columnIndex the first column is 1, the second is 2...
  132.    * @return the column value, null for SQL NULL
  133.    * @exception SQLException if a database access error occurs
  134.    */
  135.   public String getString(int columnIndex) throws SQLException
  136.   {
  137.     //byte[] bytes = getBytes(columnIndex);
  138.     //
  139.     //if (bytes == null)
  140.     //return null;
  141.     //return new String(bytes);
  142.     if (columnIndex < 1 || columnIndex > fields.length)
  143.       throw new PSQLException("postgresql.res.colrange");
  144.     wasNullFlag = (this_row[columnIndex - 1] == null);
  145.     if(wasNullFlag)
  146.       return null;
  147.     return new String(this_row[columnIndex - 1]);
  148.   }
  149.   
  150.   /**
  151.    * Get the value of a column in the current row as a Java boolean
  152.    *
  153.    * @param columnIndex the first column is 1, the second is 2...
  154.    * @return the column value, false for SQL NULL
  155.    * @exception SQLException if a database access error occurs
  156.    */
  157.   public boolean getBoolean(int columnIndex) throws SQLException
  158.   {
  159.     String s = getString(columnIndex);
  160.     
  161.     if (s != null)
  162.       {
  163. int c = s.charAt(0);
  164. return ((c == 't') || (c == 'T'));
  165.       }
  166.     return false; // SQL NULL
  167.   }
  168.   
  169.   /**
  170.    * Get the value of a column in the current row as a Java byte.
  171.    *
  172.    * @param columnIndex the first column is 1, the second is 2,...
  173.    * @return the column value; 0 if SQL NULL
  174.    * @exception SQLException if a database access error occurs
  175.    */
  176.   public byte getByte(int columnIndex) throws SQLException
  177.   {
  178.     String s = getString(columnIndex);
  179.     
  180.     if (s != null)
  181.       {
  182. try
  183.   {
  184.     return Byte.parseByte(s);
  185.   } catch (NumberFormatException e) {
  186.     throw new PSQLException("postgresql.res.badbyte",s);
  187.   }
  188.       }
  189.     return 0; // SQL NULL
  190.   }
  191.   
  192.   /**
  193.    * Get the value of a column in the current row as a Java short.
  194.    *
  195.    * @param columnIndex the first column is 1, the second is 2,...
  196.    * @return the column value; 0 if SQL NULL
  197.    * @exception SQLException if a database access error occurs
  198.    */
  199.   public short getShort(int columnIndex) throws SQLException
  200.   {
  201.     String s = getString(columnIndex);
  202.     
  203.     if (s != null)
  204.       {
  205. try
  206.   {
  207.     return Short.parseShort(s);
  208.   } catch (NumberFormatException e) {
  209.     throw new PSQLException("postgresql.res.badshort",s);
  210.   }
  211.       }
  212.     return 0; // SQL NULL
  213.   }
  214.   
  215.   /**
  216.    * Get the value of a column in the current row as a Java int.
  217.    *
  218.    * @param columnIndex the first column is 1, the second is 2,...
  219.    * @return the column value; 0 if SQL NULL
  220.    * @exception SQLException if a database access error occurs
  221.    */
  222.   public int getInt(int columnIndex) throws SQLException
  223.   {
  224.     String s = getString(columnIndex);
  225.     
  226.     if (s != null)
  227.       {
  228. try
  229.   {
  230.     return Integer.parseInt(s);
  231.   } catch (NumberFormatException e) {
  232.     throw new PSQLException ("postgresql.res.badint",s);
  233.   }
  234.       }
  235.     return 0; // SQL NULL
  236.   }
  237.   
  238.   /**
  239.    * Get the value of a column in the current row as a Java long.
  240.    *
  241.    * @param columnIndex the first column is 1, the second is 2,...
  242.    * @return the column value; 0 if SQL NULL
  243.    * @exception SQLException if a database access error occurs
  244.    */
  245.   public long getLong(int columnIndex) throws SQLException
  246.   {
  247.     String s = getString(columnIndex);
  248.     
  249.     if (s != null)
  250.       {
  251. try
  252.   {
  253.     return Long.parseLong(s);
  254.   } catch (NumberFormatException e) {
  255.     throw new PSQLException ("postgresql.res.badlong",s);
  256.   }
  257.       }
  258.     return 0; // SQL NULL
  259.   }
  260.   
  261.   /**
  262.    * Get the value of a column in the current row as a Java float.
  263.    *
  264.    * @param columnIndex the first column is 1, the second is 2,...
  265.    * @return the column value; 0 if SQL NULL
  266.    * @exception SQLException if a database access error occurs
  267.    */
  268.   public float getFloat(int columnIndex) throws SQLException
  269.   {
  270.     String s = getString(columnIndex);
  271.     
  272.     if (s != null)
  273.       {
  274. try
  275.   {
  276.     return Float.valueOf(s).floatValue();
  277.   } catch (NumberFormatException e) {
  278.     throw new PSQLException ("postgresql.res.badfloat",s);
  279.   }
  280.       }
  281.     return 0; // SQL NULL
  282.   }
  283.   
  284.   /**
  285.    * Get the value of a column in the current row as a Java double.
  286.    *
  287.    * @param columnIndex the first column is 1, the second is 2,...
  288.    * @return the column value; 0 if SQL NULL
  289.    * @exception SQLException if a database access error occurs
  290.    */
  291.   public double getDouble(int columnIndex) throws SQLException
  292.   {
  293.     String s = getString(columnIndex);
  294.     
  295.     if (s != null)
  296.       {
  297. try
  298.   {
  299.     return Double.valueOf(s).doubleValue();
  300.   } catch (NumberFormatException e) {
  301.     throw new PSQLException ("postgresql.res.baddouble",s);
  302.   }
  303.       }
  304.     return 0; // SQL NULL
  305.   }
  306.   
  307.   /**
  308.    * Get the value of a column in the current row as a 
  309.    * java.lang.BigDecimal object
  310.    *
  311.    * @param columnIndex  the first column is 1, the second is 2...
  312.    * @param scale the number of digits to the right of the decimal
  313.    * @return the column value; if the value is SQL NULL, null
  314.    * @exception SQLException if a database access error occurs
  315.    * @deprecated
  316.    */
  317.   public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException
  318.   {
  319.     String s = getString(columnIndex);
  320.     BigDecimal val;
  321.     
  322.     if (s != null)
  323.       {
  324. try
  325.   {
  326.     val = new BigDecimal(s);
  327.   } catch (NumberFormatException e) {
  328.     throw new PSQLException ("postgresql.res.badbigdec",s);
  329.   }
  330.   try
  331.     {
  332.       return val.setScale(scale);
  333.     } catch (ArithmeticException e) {
  334.       throw new PSQLException ("postgresql.res.badbigdec",s);
  335.     }
  336.       }
  337.     return null; // SQL NULL
  338.   }
  339.   
  340.   /**
  341.    * Get the value of a column in the current row as a Java byte array.
  342.    *
  343.    * <p>In normal use, the bytes represent the raw values returned by the
  344.    * backend. However, if the column is an OID, then it is assumed to
  345.    * refer to a Large Object, and that object is returned as a byte array.
  346.    *
  347.    * <p><b>Be warned</b> If the large object is huge, then you may run out
  348.    * of memory.
  349.    *
  350.    * @param columnIndex the first column is 1, the second is 2, ...
  351.    * @return the column value; if the value is SQL NULL, the result
  352.    * is null
  353.    * @exception SQLException if a database access error occurs
  354.    */
  355.   public byte[] getBytes(int columnIndex) throws SQLException
  356.   {
  357.     if (columnIndex < 1 || columnIndex > fields.length)
  358.       throw new PSQLException("postgresql.res.colrange");
  359.     wasNullFlag = (this_row[columnIndex - 1] == null);
  360.     
  361.     // Handle OID's as BLOBS
  362.     if(!wasNullFlag)
  363.       if( fields[columnIndex - 1].getOID() == 26) {
  364. LargeObjectManager lom = connection.getLargeObjectAPI();
  365. LargeObject lob = lom.open(getInt(columnIndex));
  366. byte buf[] = lob.read(lob.size());
  367. lob.close();
  368. return buf;
  369.       }
  370.     
  371.     return this_row[columnIndex - 1];
  372.   }
  373.   
  374.   /**
  375.    * Get the value of a column in the current row as a java.sql.Date
  376.    * object
  377.    *
  378.    * @param columnIndex the first column is 1, the second is 2...
  379.    * @return the column value; null if SQL NULL
  380.    * @exception SQLException if a database access error occurs
  381.    */
  382.   public java.sql.Date getDate(int columnIndex) throws SQLException
  383.   {
  384.     String s = getString(columnIndex);
  385.     if(s==null)
  386.       return null;
  387.     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  388.     try {
  389.       return new java.sql.Date(df.parse(s).getTime());
  390.     } catch (ParseException e) {
  391.       throw new PSQLException("postgresql.res.baddate",new Integer(e.getErrorOffset()),s);
  392.     }
  393.   }
  394.   
  395.   /**
  396.    * Get the value of a column in the current row as a java.sql.Time
  397.    * object
  398.    *
  399.    * @param columnIndex the first column is 1, the second is 2...
  400.    * @return the column value; null if SQL NULL
  401.    * @exception SQLException if a database access error occurs
  402.    */
  403.   public Time getTime(int columnIndex) throws SQLException
  404.   {
  405.     String s = getString(columnIndex);
  406.     
  407.     if (s != null)
  408.       {
  409. try
  410.   {
  411.     if (s.length() != 5 && s.length() != 8)
  412.       throw new NumberFormatException("Wrong Length!");
  413.     int hr = Integer.parseInt(s.substring(0,2));
  414.     int min = Integer.parseInt(s.substring(3,5));
  415.     int sec = (s.length() == 5) ? 0 : Integer.parseInt(s.substring(6));
  416.     return new Time(hr, min, sec);
  417.   } catch (NumberFormatException e) {
  418.     throw new PSQLException ("postgresql.res.badtime",s);
  419.   }
  420.       }
  421.     return null; // SQL NULL
  422.   }
  423.   
  424.   /**
  425.    * Get the value of a column in the current row as a 
  426.    * java.sql.Timestamp object
  427.    *
  428.    * @param columnIndex the first column is 1, the second is 2...
  429.    * @return the column value; null if SQL NULL
  430.    * @exception SQLException if a database access error occurs
  431.    */
  432.   public Timestamp getTimestamp(int columnIndex) throws SQLException
  433.   {
  434.     String s = getString(columnIndex);
  435.     if(s==null)
  436. return null;
  437.     
  438.     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzz");
  439.     
  440.     try {
  441. return new Timestamp(df.parse(s).getTime());
  442.     } catch(ParseException e) {
  443. throw new PSQLException("postgresql.res.badtimestamp",new Integer(e.getErrorOffset()),s);
  444.     }
  445.   }
  446.   
  447.   /**
  448.    * A column value can be retrieved as a stream of ASCII characters
  449.    * and then read in chunks from the stream.  This method is 
  450.    * particular suitable for retrieving large LONGVARCHAR values.
  451.    * The JDBC driver will do any necessary conversion from the
  452.    * database format into ASCII.
  453.    *
  454.    * <p><B>Note:</B> All the data in the returned stream must be read
  455.    * prior to getting the value of any other column.  The next call
  456.    * to a get method implicitly closes the stream.  Also, a stream
  457.    * may return 0 for available() whether there is data available
  458.    * or not.
  459.    *
  460.    *<p> We implement an ASCII stream as a Binary stream - we should really
  461.    * do the data conversion, but I cannot be bothered to implement this
  462.    * right now.
  463.    *
  464.    * @param columnIndex the first column is 1, the second is 2, ...
  465.    * @return a Java InputStream that delivers the database column
  466.    *  value as a stream of one byte ASCII characters.  If the
  467.    * value is SQL NULL then the result is null
  468.    * @exception SQLException if a database access error occurs
  469.    * @see getBinaryStream
  470.    */
  471.   public InputStream getAsciiStream(int columnIndex) throws SQLException
  472.   {
  473.     return getBinaryStream(columnIndex);
  474.   }
  475.   
  476.   /**
  477.    * A column value can also be retrieved as a stream of Unicode
  478.    * characters. We implement this as a binary stream.
  479.    *
  480.    * ** DEPRECATED IN JDBC 2 **
  481.    *
  482.    * @param columnIndex the first column is 1, the second is 2...
  483.    * @return a Java InputStream that delivers the database column value
  484.    *  as a stream of two byte Unicode characters.  If the value is
  485.    * SQL NULL, then the result is null
  486.    * @exception SQLException if a database access error occurs
  487.    * @see getAsciiStream
  488.    * @see getBinaryStream
  489.    * @deprecated
  490.    */
  491.   public InputStream getUnicodeStream(int columnIndex) throws SQLException
  492.   {
  493.     return getBinaryStream(columnIndex);
  494.   }
  495.   
  496.   /**
  497.    * A column value can also be retrieved as a binary strea.  This
  498.    * method is suitable for retrieving LONGVARBINARY values.
  499.    *
  500.    * @param columnIndex the first column is 1, the second is 2...
  501.    * @return a Java InputStream that delivers the database column value
  502.    * as a stream of bytes.  If the value is SQL NULL, then the result
  503.    * is null
  504.    * @exception SQLException if a database access error occurs
  505.    * @see getAsciiStream
  506.    * @see getUnicodeStream
  507.    */
  508.   public InputStream getBinaryStream(int columnIndex) throws SQLException
  509.   {
  510.     byte b[] = getBytes(columnIndex);
  511.     
  512.     if (b != null)
  513.       return new ByteArrayInputStream(b);
  514.     return null; // SQL NULL
  515.   }
  516.   
  517.   /**
  518.    * The following routines simply convert the columnName into
  519.    * a columnIndex and then call the appropriate routine above.
  520.    *
  521.    * @param columnName is the SQL name of the column
  522.    * @return the column value
  523.    * @exception SQLException if a database access error occurs
  524.    */
  525.   public String getString(String columnName) throws SQLException
  526.   {
  527.     return getString(findColumn(columnName));
  528.   }
  529.   
  530.   public boolean getBoolean(String columnName) throws SQLException
  531.   {
  532.     return getBoolean(findColumn(columnName));
  533.   }
  534.   
  535.   public byte getByte(String columnName) throws SQLException
  536.   {
  537.     
  538.     return getByte(findColumn(columnName));
  539.   }
  540.   
  541.   public short getShort(String columnName) throws SQLException
  542.   {
  543.     return getShort(findColumn(columnName));
  544.   }
  545.   
  546.   public int getInt(String columnName) throws SQLException
  547.   {
  548.     return getInt(findColumn(columnName));
  549.   }
  550.   
  551.   public long getLong(String columnName) throws SQLException
  552.   {
  553.     return getLong(findColumn(columnName));
  554.   }
  555.   
  556.   public float getFloat(String columnName) throws SQLException
  557.   {
  558.     return getFloat(findColumn(columnName));
  559.   }
  560.   
  561.   public double getDouble(String columnName) throws SQLException
  562.   {
  563.     return getDouble(findColumn(columnName));
  564.   }
  565.   
  566.     /**
  567.      * @deprecated
  568.      */
  569.   public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException
  570.   {
  571.     return getBigDecimal(findColumn(columnName), scale);
  572.   }
  573.   
  574.   public byte[] getBytes(String columnName) throws SQLException
  575.   {
  576.     return getBytes(findColumn(columnName));
  577.   }
  578.   
  579.   public java.sql.Date getDate(String columnName) throws SQLException
  580.   {
  581.     return getDate(findColumn(columnName));
  582.   }
  583.   
  584.   public Time getTime(String columnName) throws SQLException
  585.   {
  586.     return getTime(findColumn(columnName));
  587.   }
  588.   
  589.   public Timestamp getTimestamp(String columnName) throws SQLException
  590.   {
  591.     return getTimestamp(findColumn(columnName));
  592.   }
  593.   
  594.   public InputStream getAsciiStream(String columnName) throws SQLException
  595.   {
  596.     return getAsciiStream(findColumn(columnName));
  597.   }
  598.   
  599.     /**
  600.      *
  601.      * ** DEPRECATED IN JDBC 2 **
  602.      *
  603.      * @deprecated
  604.      */
  605.   public InputStream getUnicodeStream(String columnName) throws SQLException
  606.   {
  607.     return getUnicodeStream(findColumn(columnName));
  608.   }
  609.   
  610.   public InputStream getBinaryStream(String columnName) throws SQLException
  611.   {
  612.     return getBinaryStream(findColumn(columnName));
  613.   }
  614.   
  615.   /**
  616.    * The first warning reported by calls on this ResultSet is
  617.    * returned.  Subsequent ResultSet warnings will be chained
  618.    * to this SQLWarning.
  619.    *
  620.    * <p>The warning chain is automatically cleared each time a new
  621.    * row is read.
  622.    *
  623.    * <p><B>Note:</B> This warning chain only covers warnings caused by
  624.    * ResultSet methods.  Any warnings caused by statement methods
  625.    * (such as reading OUT parameters) will be chained on the
  626.    * Statement object.
  627.    *
  628.    * @return the first SQLWarning or null;
  629.    * @exception SQLException if a database access error occurs.
  630.    */
  631.   public SQLWarning getWarnings() throws SQLException
  632.   {
  633.     return warnings;
  634.   }
  635.   
  636.   /**
  637.    * After this call, getWarnings returns null until a new warning
  638.    * is reported for this ResultSet
  639.    *
  640.    * @exception SQLException if a database access error occurs
  641.    */
  642.   public void clearWarnings() throws SQLException
  643.   {
  644.     warnings = null;
  645.   }
  646.   
  647.   /**
  648.    * Get the name of the SQL cursor used by this ResultSet
  649.    *
  650.    * <p>In SQL, a result table is retrieved though a cursor that is
  651.    * named.  The current row of a result can be updated or deleted
  652.    * using a positioned update/delete statement that references
  653.    * the cursor name.
  654.    *
  655.    * <p>JDBC supports this SQL feature by providing the name of the
  656.    * SQL cursor used by a ResultSet.  The current row of a ResulSet
  657.    * is also the current row of this SQL cursor.
  658.    *
  659.    * <p><B>Note:</B> If positioned update is not supported, a SQLException
  660.    * is thrown.
  661.    *
  662.    * @return the ResultSet's SQL cursor name.
  663.    * @exception SQLException if a database access error occurs
  664.    */
  665.   public String getCursorName() throws SQLException
  666.   {
  667.     return connection.getCursorName();
  668.   }
  669.   
  670.   /**
  671.    * The numbers, types and properties of a ResultSet's columns are
  672.    * provided by the getMetaData method
  673.    *
  674.    * @return a description of the ResultSet's columns
  675.    * @exception SQLException if a database access error occurs
  676.    */
  677.   public java.sql.ResultSetMetaData getMetaData() throws SQLException
  678.   {
  679.     return new ResultSetMetaData(rows, fields);
  680.   }
  681.   
  682.   /**
  683.    * Get the value of a column in the current row as a Java object
  684.    *
  685.    * <p>This method will return the value of the given column as a
  686.    * Java object.  The type of the Java object will be the default
  687.    * Java Object type corresponding to the column's SQL type, following
  688.    * the mapping specified in the JDBC specification.
  689.    *
  690.    * <p>This method may also be used to read database specific abstract
  691.    * data types.
  692.    *
  693.    * @param columnIndex the first column is 1, the second is 2...
  694.    * @return a Object holding the column value
  695.    * @exception SQLException if a database access error occurs
  696.    */
  697.   public Object getObject(int columnIndex) throws SQLException
  698.   {
  699.     Field field;
  700.     
  701.     if (columnIndex < 1 || columnIndex > fields.length)
  702.       throw new PSQLException("postgresql.res.colrange");
  703.     field = fields[columnIndex - 1];
  704.     
  705.     // some fields can be null, mainly from those returned by MetaData methods
  706.     if(field==null) {
  707.       wasNullFlag=true;
  708.       return null;
  709.     }
  710.     
  711.     switch (field.getSQLType())
  712.       {
  713.       case Types.BIT:
  714. return new Boolean(getBoolean(columnIndex));
  715.       case Types.SMALLINT:
  716. return new Integer(getInt(columnIndex));
  717.       case Types.INTEGER:
  718. return new Integer(getInt(columnIndex));
  719.       case Types.BIGINT:
  720. return new Long(getLong(columnIndex));
  721.       case Types.NUMERIC:
  722. return getBigDecimal(columnIndex, 0);
  723.       case Types.REAL:
  724. return new Float(getFloat(columnIndex));
  725.       case Types.DOUBLE:
  726. return new Double(getDouble(columnIndex));
  727.       case Types.CHAR:
  728.       case Types.VARCHAR:
  729. return getString(columnIndex);
  730.       case Types.DATE:
  731. return getDate(columnIndex);
  732.       case Types.TIME:
  733. return getTime(columnIndex);
  734.       case Types.TIMESTAMP:
  735. return getTimestamp(columnIndex);
  736.       default:
  737. return connection.getObject(field.getTypeName(), getString(columnIndex));
  738.       }
  739.   }
  740.   
  741.   /**
  742.    * Get the value of a column in the current row as a Java object
  743.    *
  744.    *<p> This method will return the value of the given column as a
  745.    * Java object.  The type of the Java object will be the default
  746.    * Java Object type corresponding to the column's SQL type, following
  747.    * the mapping specified in the JDBC specification.
  748.    *
  749.    * <p>This method may also be used to read database specific abstract
  750.    * data types.
  751.    *
  752.    * @param columnName is the SQL name of the column
  753.    * @return a Object holding the column value
  754.    * @exception SQLException if a database access error occurs
  755.    */
  756.   public Object getObject(String columnName) throws SQLException
  757.   {
  758.     return getObject(findColumn(columnName));
  759.   }
  760.   
  761.   /**
  762.    * Map a ResultSet column name to a ResultSet column index
  763.    *
  764.    * @param columnName the name of the column
  765.    * @return the column index
  766.    * @exception SQLException if a database access error occurs
  767.    */
  768.   public int findColumn(String columnName) throws SQLException
  769.   {
  770.     int i;
  771.     
  772.     for (i = 0 ; i < fields.length; ++i)
  773.       if (fields[i].name.equalsIgnoreCase(columnName))
  774. return (i+1);
  775.     throw new PSQLException ("postgresql.res.colname",columnName);
  776.   }
  777.     
  778.     // ** JDBC 2 Extensions **
  779.     
  780.     public boolean absolute(int index) throws SQLException
  781.     {
  782. if (index < 0 || index > rows.size())
  783.     return false;
  784. this_row = (byte [][])rows.elementAt(index);
  785. return true;
  786.     }
  787.     
  788.     public void afterLast() throws SQLException
  789.     {
  790. throw postgresql.Driver.notImplemented();
  791.     }
  792.     
  793.     public void beforeFirst() throws SQLException
  794.     {
  795. throw postgresql.Driver.notImplemented();
  796.     }
  797.     
  798.     public void cancelRowUpdates() throws SQLException
  799.     {
  800. throw postgresql.Driver.notImplemented();
  801.     }
  802.     
  803.     public void deleteRow() throws SQLException
  804.     {
  805. throw postgresql.Driver.notImplemented();
  806.     }
  807.     
  808.     public boolean first() throws SQLException
  809.     {
  810. if (rows.size() <= 0)
  811.     return false;
  812. current_row = 0;
  813. this_row = (byte [][])rows.elementAt(current_row);
  814. return true;
  815.     }
  816.     
  817.     public Array getArray(String colName) throws SQLException
  818.     {
  819. return getArray(findColumn(colName));
  820.     }
  821.     
  822.     public Array getArray(int i) throws SQLException
  823.     {
  824. throw postgresql.Driver.notImplemented();
  825.     }
  826.     
  827.     public java.math.BigDecimal getBigDecimal(int columnIndex) throws SQLException
  828.     {
  829. throw postgresql.Driver.notImplemented();
  830.     }
  831.     
  832.     public java.math.BigDecimal getBigDecimal(String columnName) throws SQLException
  833.     {
  834. return getBigDecimal(findColumn(columnName));
  835.     }
  836.     
  837.     public Blob getBlob(String columnName) throws SQLException
  838.     {
  839. return getBlob(findColumn(columnName));
  840.     }
  841.     
  842.     public Blob getBlob(int i) throws SQLException
  843.     {
  844. throw postgresql.Driver.notImplemented();
  845.     }
  846.     
  847.     public java.io.Reader getCharacterStream(String columnName) throws SQLException
  848.     {
  849. return getCharacterStream(findColumn(columnName));
  850.     }
  851.     
  852.     public java.io.Reader getCharacterStream(int i) throws SQLException
  853.     {
  854. throw postgresql.Driver.notImplemented();
  855.     }
  856.     
  857.     public Clob getClob(String columnName) throws SQLException
  858.     {
  859. return getClob(findColumn(columnName));
  860.     }
  861.     
  862.     public Clob getClob(int i) throws SQLException
  863.     {
  864. throw postgresql.Driver.notImplemented();
  865.     }
  866.     
  867.     public int getConcurrency() throws SQLException
  868.     {
  869. throw postgresql.Driver.notImplemented();
  870.     }
  871.     
  872.     public java.sql.Date getDate(int i,java.util.Calendar cal) throws SQLException
  873.     {
  874. throw postgresql.Driver.notImplemented();
  875.     }
  876.     
  877.     public Time getTime(int i,java.util.Calendar cal) throws SQLException
  878.     {
  879. throw postgresql.Driver.notImplemented();
  880.     }
  881.     
  882.     public Timestamp getTimestamp(int i,java.util.Calendar cal) throws SQLException
  883.     {
  884. throw postgresql.Driver.notImplemented();
  885.     }
  886.     
  887.     public java.sql.Date getDate(String c,java.util.Calendar cal) throws SQLException
  888.     {
  889. return getDate(findColumn(c),cal);
  890.     }
  891.     
  892.     public Time getTime(String c,java.util.Calendar cal) throws SQLException
  893.     {
  894. return getTime(findColumn(c),cal);
  895.     }
  896.     
  897.     public Timestamp getTimestamp(String c,java.util.Calendar cal) throws SQLException
  898.     {
  899. return getTimestamp(findColumn(c),cal);
  900.     }
  901.     
  902.     public int getFetchDirection() throws SQLException
  903.     {
  904. throw postgresql.Driver.notImplemented();
  905.     }
  906.     
  907.     public int getFetchSize() throws SQLException
  908.     {
  909. throw postgresql.Driver.notImplemented();
  910.     }
  911.     
  912.     public int getKeysetSize() throws SQLException
  913.     {
  914. throw postgresql.Driver.notImplemented();
  915.     }
  916.     
  917.     public Object getObject(String columnName,java.util.Map map) throws SQLException
  918.     {
  919. return getObject(findColumn(columnName),map);
  920.     }
  921.     
  922.     public Object getObject(int i,java.util.Map map) throws SQLException
  923.     {
  924. throw postgresql.Driver.notImplemented();
  925.     }
  926.     
  927.     public Ref getRef(String columnName) throws SQLException
  928.     {
  929. return getRef(findColumn(columnName));
  930.     }
  931.     
  932.     public Ref getRef(int i) throws SQLException
  933.     {
  934. throw postgresql.Driver.notImplemented();
  935.     }
  936.     
  937.     public int getRow() throws SQLException
  938.     {
  939. return current_row;
  940.     }
  941.     
  942.     // This one needs some thought, as not all ResultSets come from a statement
  943.     public java.sql.Statement getStatement() throws SQLException
  944.     {
  945. throw postgresql.Driver.notImplemented();
  946.     }
  947.     
  948.     public int getType() throws SQLException
  949.     {
  950. throw postgresql.Driver.notImplemented();
  951.     }
  952.     
  953.     public void insertRow() throws SQLException
  954.     {
  955. throw postgresql.Driver.notImplemented();
  956.     }
  957.     
  958.     public boolean isAfterLast() throws SQLException
  959.     {
  960. throw postgresql.Driver.notImplemented();
  961.     }
  962.     
  963.     public boolean isBeforeFirst() throws SQLException
  964.     {
  965. throw postgresql.Driver.notImplemented();
  966.     }
  967.     
  968.     public boolean isFirst() throws SQLException
  969.     {
  970. throw postgresql.Driver.notImplemented();
  971.     }
  972.     
  973.     public boolean isLast() throws SQLException
  974.     {
  975. throw postgresql.Driver.notImplemented();
  976.     }
  977.     
  978.     public boolean last() throws SQLException
  979.     {
  980. if (rows.size() <= 0)
  981.     return false;
  982. current_row = rows.size() - 1;
  983. this_row = (byte [][])rows.elementAt(current_row);
  984. return true;
  985.     }
  986.     
  987.     public void moveToCurrentRow() throws SQLException
  988.     {
  989. throw postgresql.Driver.notImplemented();
  990.     }
  991.     
  992.     public void moveToInsertRow() throws SQLException
  993.     {
  994. throw postgresql.Driver.notImplemented();
  995.     }
  996.     
  997.     public boolean previous() throws SQLException
  998.     {
  999. if (--current_row < 0)
  1000.     return false;
  1001. this_row = (byte [][])rows.elementAt(current_row);
  1002. return true;
  1003.     }
  1004.     
  1005.     public void refreshRow() throws SQLException
  1006.     {
  1007. throw postgresql.Driver.notImplemented();
  1008.     }
  1009.     
  1010.     public boolean relative(int rows) throws SQLException
  1011.     {
  1012. throw postgresql.Driver.notImplemented();
  1013.     }
  1014.     
  1015.     public boolean rowDeleted() throws SQLException
  1016.     {
  1017. throw postgresql.Driver.notImplemented();
  1018.     }
  1019.     
  1020.     public boolean rowInserted() throws SQLException
  1021.     {
  1022. throw postgresql.Driver.notImplemented();
  1023.     }
  1024.     
  1025.     public boolean rowUpdated() throws SQLException
  1026.     {
  1027. throw postgresql.Driver.notImplemented();
  1028.     }
  1029.     
  1030.     public void setFetchDirection(int direction) throws SQLException
  1031.     {
  1032. throw postgresql.Driver.notImplemented();
  1033.     }
  1034.     
  1035.     public void setFetchSize(int rows) throws SQLException
  1036.     {
  1037. throw postgresql.Driver.notImplemented();
  1038.     }
  1039.     
  1040.     public void setKeysetSize(int keys) throws SQLException
  1041.     {
  1042. throw postgresql.Driver.notImplemented();
  1043.     }
  1044.     
  1045.     public void updateAsciiStream(int columnIndex,
  1046.   java.io.InputStream x,
  1047.   int length
  1048.   ) throws SQLException
  1049.     {
  1050. throw postgresql.Driver.notImplemented();
  1051.     }
  1052.     
  1053.     public void updateAsciiStream(String columnName,
  1054.   java.io.InputStream x,
  1055.   int length
  1056.   ) throws SQLException
  1057.     {
  1058. updateAsciiStream(findColumn(columnName),x,length);
  1059.     }
  1060.     
  1061.     public void updateBigDecimal(int columnIndex,
  1062.   java.math.BigDecimal x
  1063.   ) throws SQLException
  1064.     {
  1065. throw postgresql.Driver.notImplemented();
  1066.     }
  1067.     
  1068.     public void updateBigDecimal(String columnName,
  1069.   java.math.BigDecimal x
  1070.   ) throws SQLException
  1071.     {
  1072. updateBigDecimal(findColumn(columnName),x);
  1073.     }
  1074.     
  1075.     public void updateBinaryStream(int columnIndex,
  1076.   java.io.InputStream x,
  1077.   int length
  1078.   ) throws SQLException
  1079.     {
  1080. throw postgresql.Driver.notImplemented();
  1081.     }
  1082.     
  1083.     public void updateBinaryStream(String columnName,
  1084.   java.io.InputStream x,
  1085.   int length
  1086.   ) throws SQLException
  1087.     {
  1088. updateBinaryStream(findColumn(columnName),x,length);
  1089.     }
  1090.     
  1091.     public void updateBoolean(int columnIndex,boolean x) throws SQLException
  1092.     {
  1093. throw postgresql.Driver.notImplemented();
  1094.     }
  1095.     
  1096.     public void updateBoolean(String columnName,boolean x) throws SQLException
  1097.     {
  1098. updateBoolean(findColumn(columnName),x);
  1099.     }
  1100.     
  1101.     public void updateByte(int columnIndex,byte x) throws SQLException
  1102.     {
  1103. throw postgresql.Driver.notImplemented();
  1104.     }
  1105.     
  1106.     public void updateByte(String columnName,byte x) throws SQLException
  1107.     {
  1108. updateByte(findColumn(columnName),x);
  1109.     }
  1110.     
  1111.     public void updateBytes(String columnName,byte[] x) throws SQLException
  1112.     {
  1113. updateBytes(findColumn(columnName),x);
  1114.     }
  1115.     
  1116.     public void updateBytes(int columnIndex,byte[] x) throws SQLException
  1117.     {
  1118. throw postgresql.Driver.notImplemented();
  1119.     }
  1120.     
  1121.     public void updateCharacterStream(int columnIndex,
  1122.       java.io.Reader x,
  1123.       int length
  1124.       ) throws SQLException
  1125.     {
  1126. throw postgresql.Driver.notImplemented();
  1127.     }
  1128.     
  1129.     public void updateCharacterStream(String columnName,
  1130.       java.io.Reader x,
  1131.       int length
  1132.       ) throws SQLException
  1133.     {
  1134. updateCharacterStream(findColumn(columnName),x,length);
  1135.     }
  1136.     
  1137.     public void updateDate(int columnIndex,java.sql.Date x) throws SQLException
  1138.     {
  1139. throw postgresql.Driver.notImplemented();
  1140.     }
  1141.     
  1142.     public void updateDate(String columnName,java.sql.Date x) throws SQLException
  1143.     {
  1144. updateDate(findColumn(columnName),x);
  1145.     }
  1146.     
  1147.     public void updateDouble(int columnIndex,double x) throws SQLException
  1148.     {
  1149. throw postgresql.Driver.notImplemented();
  1150.     }
  1151.     
  1152.     public void updateDouble(String columnName,double x) throws SQLException
  1153.     {
  1154. updateDouble(findColumn(columnName),x);
  1155.     }
  1156.     
  1157.     public void updateFloat(int columnIndex,float x) throws SQLException
  1158.     {
  1159. throw postgresql.Driver.notImplemented();
  1160.     }
  1161.     
  1162.     public void updateFloat(String columnName,float x) throws SQLException
  1163.     {
  1164. updateFloat(findColumn(columnName),x);
  1165.     }
  1166.     
  1167.     public void updateInt(int columnIndex,int x) throws SQLException
  1168.     {
  1169. throw postgresql.Driver.notImplemented();
  1170.     }
  1171.     
  1172.     public void updateInt(String columnName,int x) throws SQLException
  1173.     {
  1174. updateInt(findColumn(columnName),x);
  1175.     }
  1176.     
  1177.     public void updateLong(int columnIndex,long x) throws SQLException
  1178.     {
  1179. throw postgresql.Driver.notImplemented();
  1180.     }
  1181.     
  1182.     public void updateLong(String columnName,long x) throws SQLException
  1183.     {
  1184. updateLong(findColumn(columnName),x);
  1185.     }
  1186.     
  1187.     public void updateNull(int columnIndex) throws SQLException
  1188.     {
  1189. throw postgresql.Driver.notImplemented();
  1190.     }
  1191.     
  1192.     public void updateNull(String columnName) throws SQLException
  1193.     {
  1194. updateNull(findColumn(columnName));
  1195.     }
  1196.     
  1197.     public void updateObject(int columnIndex,Object x) throws SQLException
  1198.     {
  1199. throw postgresql.Driver.notImplemented();
  1200.     }
  1201.     
  1202.     public void updateObject(String columnName,Object x) throws SQLException
  1203.     {
  1204. updateObject(findColumn(columnName),x);
  1205.     }
  1206.     
  1207.     public void updateObject(int columnIndex,Object x,int scale) throws SQLException
  1208.     {
  1209. throw postgresql.Driver.notImplemented();
  1210.     }
  1211.     
  1212.     public void updateObject(String columnName,Object x,int scale) throws SQLException
  1213.     {
  1214. updateObject(findColumn(columnName),x,scale);
  1215.     }
  1216.     
  1217.     public void updateRow() throws SQLException
  1218.     {
  1219. throw postgresql.Driver.notImplemented();
  1220.     }
  1221.     
  1222.     public void updateShort(int columnIndex,short x) throws SQLException
  1223.     {
  1224. throw postgresql.Driver.notImplemented();
  1225.     }
  1226.     
  1227.     public void updateShort(String columnName,short x) throws SQLException
  1228.     {
  1229. updateShort(findColumn(columnName),x);
  1230.     }
  1231.     
  1232.     public void updateString(int columnIndex,String x) throws SQLException
  1233.     {
  1234. throw postgresql.Driver.notImplemented();
  1235.     }
  1236.     
  1237.     public void updateString(String columnName,String x) throws SQLException
  1238.     {
  1239. updateString(findColumn(columnName),x);
  1240.     }
  1241.     
  1242.     public void updateTime(int columnIndex,Time x) throws SQLException
  1243.     {
  1244. throw postgresql.Driver.notImplemented();
  1245.     }
  1246.     
  1247.     public void updateTime(String columnName,Time x) throws SQLException
  1248.     {
  1249. updateTime(findColumn(columnName),x);
  1250.     }
  1251.     
  1252.     public void updateTimestamp(int columnIndex,Timestamp x) throws SQLException
  1253.     {
  1254. throw postgresql.Driver.notImplemented();
  1255.     }
  1256.     
  1257.     public void updateTimestamp(String columnName,Timestamp x) throws SQLException
  1258.     {
  1259. updateTimestamp(findColumn(columnName),x);
  1260.     }
  1261.     
  1262. }