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

数据库系统

开发平台:

Unix_Linux

  1. package postgresql.jdbc1;
  2. // IMPORTANT NOTE: This file implements the JDBC 1 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 2 class in the
  5. // postgresql.jdbc2 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.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.    */
  316.   public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException
  317.   {
  318.     String s = getString(columnIndex);
  319.     BigDecimal val;
  320.     
  321.     if (s != null)
  322.       {
  323. try
  324.   {
  325.     val = new BigDecimal(s);
  326.   } catch (NumberFormatException e) {
  327.     throw new PSQLException ("postgresql.res.badbigdec",s);
  328.   }
  329.   try
  330.     {
  331.       return val.setScale(scale);
  332.     } catch (ArithmeticException e) {
  333. throw new PSQLException ("postgresql.res.badbigdec",s);
  334.     }
  335.       }
  336.     return null; // SQL NULL
  337.   }
  338.   
  339.   /**
  340.    * Get the value of a column in the current row as a Java byte array.
  341.    *
  342.    * <p>In normal use, the bytes represent the raw values returned by the
  343.    * backend. However, if the column is an OID, then it is assumed to
  344.    * refer to a Large Object, and that object is returned as a byte array.
  345.    *
  346.    * <p><b>Be warned</b> If the large object is huge, then you may run out
  347.    * of memory.
  348.    *
  349.    * @param columnIndex the first column is 1, the second is 2, ...
  350.    * @return the column value; if the value is SQL NULL, the result
  351.    * is null
  352.    * @exception SQLException if a database access error occurs
  353.    */
  354.   public byte[] getBytes(int columnIndex) throws SQLException
  355.   {
  356.     if (columnIndex < 1 || columnIndex > fields.length)
  357.       throw new PSQLException("postgresql.res.colrange");
  358.     wasNullFlag = (this_row[columnIndex - 1] == null);
  359.     
  360.     // Handle OID's as BLOBS
  361.     if(!wasNullFlag)
  362.       if( fields[columnIndex - 1].getOID() == 26) {
  363. LargeObjectManager lom = connection.getLargeObjectAPI();
  364. LargeObject lob = lom.open(getInt(columnIndex));
  365. byte buf[] = lob.read(lob.size());
  366. lob.close();
  367. return buf;
  368.       }
  369.     
  370.     return this_row[columnIndex - 1];
  371.   }
  372.   
  373.   /**
  374.    * Get the value of a column in the current row as a java.sql.Date
  375.    * object
  376.    *
  377.    * @param columnIndex the first column is 1, the second is 2...
  378.    * @return the column value; null if SQL NULL
  379.    * @exception SQLException if a database access error occurs
  380.    */
  381.   public java.sql.Date getDate(int columnIndex) throws SQLException
  382.   {
  383.     String s = getString(columnIndex);
  384.     if(s==null)
  385.       return null;
  386.     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  387.     try {
  388.       return new java.sql.Date(df.parse(s).getTime());
  389.     } catch (ParseException e) {
  390.       throw new PSQLException("postgresql.res.baddate",new Integer(e.getErrorOffset()),s);
  391.     }
  392.   }
  393.   
  394.   /**
  395.    * Get the value of a column in the current row as a java.sql.Time
  396.    * object
  397.    *
  398.    * @param columnIndex the first column is 1, the second is 2...
  399.    * @return the column value; null if SQL NULL
  400.    * @exception SQLException if a database access error occurs
  401.    */
  402.   public Time getTime(int columnIndex) throws SQLException
  403.   {
  404.     String s = getString(columnIndex);
  405.     
  406.     if (s != null)
  407.       {
  408. try
  409.   {
  410.     if (s.length() != 5 && s.length() != 8)
  411.       throw new NumberFormatException("Wrong Length!");
  412.     int hr = Integer.parseInt(s.substring(0,2));
  413.     int min = Integer.parseInt(s.substring(3,5));
  414.     int sec = (s.length() == 5) ? 0 : Integer.parseInt(s.substring(6));
  415.     return new Time(hr, min, sec);
  416.   } catch (NumberFormatException e) {
  417.     throw new PSQLException ("postgresql.res.badtime",s);
  418.   }
  419.       }
  420.     return null; // SQL NULL
  421.   }
  422.   
  423.   /**
  424.    * Get the value of a column in the current row as a 
  425.    * java.sql.Timestamp object
  426.    *
  427.    * @param columnIndex the first column is 1, the second is 2...
  428.    * @return the column value; null if SQL NULL
  429.    * @exception SQLException if a database access error occurs
  430.    */
  431.   public Timestamp getTimestamp(int columnIndex) throws SQLException
  432.   {
  433.     String s = getString(columnIndex);
  434.     if(s==null)
  435. return null;
  436.     
  437.     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzz");
  438.     
  439.     try {
  440. return new Timestamp(df.parse(s).getTime());
  441.     } catch(ParseException e) {
  442. throw new PSQLException("postgresql.res.badtimestamp",new Integer(e.getErrorOffset()),s);
  443.     }
  444.   }
  445.   
  446.   /**
  447.    * A column value can be retrieved as a stream of ASCII characters
  448.    * and then read in chunks from the stream.  This method is 
  449.    * particular suitable for retrieving large LONGVARCHAR values.
  450.    * The JDBC driver will do any necessary conversion from the
  451.    * database format into ASCII.
  452.    *
  453.    * <p><B>Note:</B> All the data in the returned stream must be read
  454.    * prior to getting the value of any other column.  The next call
  455.    * to a get method implicitly closes the stream.  Also, a stream
  456.    * may return 0 for available() whether there is data available
  457.    * or not.
  458.    *
  459.    *<p> We implement an ASCII stream as a Binary stream - we should really
  460.    * do the data conversion, but I cannot be bothered to implement this
  461.    * right now.
  462.    *
  463.    * @param columnIndex the first column is 1, the second is 2, ...
  464.    * @return a Java InputStream that delivers the database column
  465.    *  value as a stream of one byte ASCII characters.  If the
  466.    * value is SQL NULL then the result is null
  467.    * @exception SQLException if a database access error occurs
  468.    * @see getBinaryStream
  469.    */
  470.   public InputStream getAsciiStream(int columnIndex) throws SQLException
  471.   {
  472.     return getBinaryStream(columnIndex);
  473.   }
  474.   
  475.   /**
  476.    * A column value can also be retrieved as a stream of Unicode
  477.    * characters. We implement this as a binary stream.
  478.    *
  479.    * @param columnIndex the first column is 1, the second is 2...
  480.    * @return a Java InputStream that delivers the database column value
  481.    *  as a stream of two byte Unicode characters.  If the value is
  482.    * SQL NULL, then the result is null
  483.    * @exception SQLException if a database access error occurs
  484.    * @see getAsciiStream
  485.    * @see getBinaryStream
  486.    */
  487.   public InputStream getUnicodeStream(int columnIndex) throws SQLException
  488.   {
  489.     return getBinaryStream(columnIndex);
  490.   }
  491.   
  492.   /**
  493.    * A column value can also be retrieved as a binary strea.  This
  494.    * method is suitable for retrieving LONGVARBINARY values.
  495.    *
  496.    * @param columnIndex the first column is 1, the second is 2...
  497.    * @return a Java InputStream that delivers the database column value
  498.    * as a stream of bytes.  If the value is SQL NULL, then the result
  499.    * is null
  500.    * @exception SQLException if a database access error occurs
  501.    * @see getAsciiStream
  502.    * @see getUnicodeStream
  503.    */
  504.   public InputStream getBinaryStream(int columnIndex) throws SQLException
  505.   {
  506.     byte b[] = getBytes(columnIndex);
  507.     
  508.     if (b != null)
  509.       return new ByteArrayInputStream(b);
  510.     return null; // SQL NULL
  511.   }
  512.   
  513.   /**
  514.    * The following routines simply convert the columnName into
  515.    * a columnIndex and then call the appropriate routine above.
  516.    *
  517.    * @param columnName is the SQL name of the column
  518.    * @return the column value
  519.    * @exception SQLException if a database access error occurs
  520.    */
  521.   public String getString(String columnName) throws SQLException
  522.   {
  523.     return getString(findColumn(columnName));
  524.   }
  525.   
  526.   public boolean getBoolean(String columnName) throws SQLException
  527.   {
  528.     return getBoolean(findColumn(columnName));
  529.   }
  530.   
  531.   public byte getByte(String columnName) throws SQLException
  532.   {
  533.     
  534.     return getByte(findColumn(columnName));
  535.   }
  536.   
  537.   public short getShort(String columnName) throws SQLException
  538.   {
  539.     return getShort(findColumn(columnName));
  540.   }
  541.   
  542.   public int getInt(String columnName) throws SQLException
  543.   {
  544.     return getInt(findColumn(columnName));
  545.   }
  546.   
  547.   public long getLong(String columnName) throws SQLException
  548.   {
  549.     return getLong(findColumn(columnName));
  550.   }
  551.   
  552.   public float getFloat(String columnName) throws SQLException
  553.   {
  554.     return getFloat(findColumn(columnName));
  555.   }
  556.   
  557.   public double getDouble(String columnName) throws SQLException
  558.   {
  559.     return getDouble(findColumn(columnName));
  560.   }
  561.   
  562.   public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException
  563.   {
  564.     return getBigDecimal(findColumn(columnName), scale);
  565.   }
  566.   
  567.   public byte[] getBytes(String columnName) throws SQLException
  568.   {
  569.     return getBytes(findColumn(columnName));
  570.   }
  571.   
  572.   public java.sql.Date getDate(String columnName) throws SQLException
  573.   {
  574.     return getDate(findColumn(columnName));
  575.   }
  576.   
  577.   public Time getTime(String columnName) throws SQLException
  578.   {
  579.     return getTime(findColumn(columnName));
  580.   }
  581.   
  582.   public Timestamp getTimestamp(String columnName) throws SQLException
  583.   {
  584.     return getTimestamp(findColumn(columnName));
  585.   }
  586.   
  587.   public InputStream getAsciiStream(String columnName) throws SQLException
  588.   {
  589.     return getAsciiStream(findColumn(columnName));
  590.   }
  591.   
  592.   public InputStream getUnicodeStream(String columnName) throws SQLException
  593.   {
  594.     return getUnicodeStream(findColumn(columnName));
  595.   }
  596.   
  597.   public InputStream getBinaryStream(String columnName) throws SQLException
  598.   {
  599.     return getBinaryStream(findColumn(columnName));
  600.   }
  601.   
  602.   /**
  603.    * The first warning reported by calls on this ResultSet is
  604.    * returned.  Subsequent ResultSet warnings will be chained
  605.    * to this SQLWarning.
  606.    *
  607.    * <p>The warning chain is automatically cleared each time a new
  608.    * row is read.
  609.    *
  610.    * <p><B>Note:</B> This warning chain only covers warnings caused by
  611.    * ResultSet methods.  Any warnings caused by statement methods
  612.    * (such as reading OUT parameters) will be chained on the
  613.    * Statement object.
  614.    *
  615.    * @return the first SQLWarning or null;
  616.    * @exception SQLException if a database access error occurs.
  617.    */
  618.   public SQLWarning getWarnings() throws SQLException
  619.   {
  620.     return warnings;
  621.   }
  622.   
  623.   /**
  624.    * After this call, getWarnings returns null until a new warning
  625.    * is reported for this ResultSet
  626.    *
  627.    * @exception SQLException if a database access error occurs
  628.    */
  629.   public void clearWarnings() throws SQLException
  630.   {
  631.     warnings = null;
  632.   }
  633.   
  634.   /**
  635.    * Get the name of the SQL cursor used by this ResultSet
  636.    *
  637.    * <p>In SQL, a result table is retrieved though a cursor that is
  638.    * named.  The current row of a result can be updated or deleted
  639.    * using a positioned update/delete statement that references
  640.    * the cursor name.
  641.    *
  642.    * <p>JDBC supports this SQL feature by providing the name of the
  643.    * SQL cursor used by a ResultSet.  The current row of a ResulSet
  644.    * is also the current row of this SQL cursor.
  645.    *
  646.    * <p><B>Note:</B> If positioned update is not supported, a SQLException
  647.    * is thrown.
  648.    *
  649.    * @return the ResultSet's SQL cursor name.
  650.    * @exception SQLException if a database access error occurs
  651.    */
  652.   public String getCursorName() throws SQLException
  653.   {
  654.     return connection.getCursorName();
  655.   }
  656.   
  657.   /**
  658.    * The numbers, types and properties of a ResultSet's columns are
  659.    * provided by the getMetaData method
  660.    *
  661.    * @return a description of the ResultSet's columns
  662.    * @exception SQLException if a database access error occurs
  663.    */
  664.   public java.sql.ResultSetMetaData getMetaData() throws SQLException
  665.   {
  666.     return new ResultSetMetaData(rows, fields);
  667.   }
  668.   
  669.   /**
  670.    * Get the value of a column in the current row as a Java object
  671.    *
  672.    * <p>This method will return the value of the given column as a
  673.    * Java object.  The type of the Java object will be the default
  674.    * Java Object type corresponding to the column's SQL type, following
  675.    * the mapping specified in the JDBC specification.
  676.    *
  677.    * <p>This method may also be used to read database specific abstract
  678.    * data types.
  679.    *
  680.    * @param columnIndex the first column is 1, the second is 2...
  681.    * @return a Object holding the column value
  682.    * @exception SQLException if a database access error occurs
  683.    */
  684.   public Object getObject(int columnIndex) throws SQLException
  685.   {
  686.     Field field;
  687.     
  688.     if (columnIndex < 1 || columnIndex > fields.length)
  689.       throw new PSQLException("postgresql.res.colrange");
  690.     field = fields[columnIndex - 1];
  691.     
  692.     // some fields can be null, mainly from those returned by MetaData methods
  693.     if(field==null) {
  694.       wasNullFlag=true;
  695.       return null;
  696.     }
  697.     
  698.     switch (field.getSQLType())
  699.       {
  700.       case Types.BIT:
  701. return new Boolean(getBoolean(columnIndex));
  702.       case Types.SMALLINT:
  703. return new Integer(getInt(columnIndex));
  704.       case Types.INTEGER:
  705. return new Integer(getInt(columnIndex));
  706.       case Types.BIGINT:
  707. return new Long(getLong(columnIndex));
  708.       case Types.NUMERIC:
  709. return getBigDecimal(columnIndex, 0);
  710.       case Types.REAL:
  711. return new Float(getFloat(columnIndex));
  712.       case Types.DOUBLE:
  713. return new Double(getDouble(columnIndex));
  714.       case Types.CHAR:
  715.       case Types.VARCHAR:
  716. return getString(columnIndex);
  717.       case Types.DATE:
  718. return getDate(columnIndex);
  719.       case Types.TIME:
  720. return getTime(columnIndex);
  721.       case Types.TIMESTAMP:
  722. return getTimestamp(columnIndex);
  723.       default:
  724. return connection.getObject(field.getTypeName(), getString(columnIndex));
  725.       }
  726.   }
  727.   
  728.   /**
  729.    * Get the value of a column in the current row as a Java object
  730.    *
  731.    *<p> This method will return the value of the given column as a
  732.    * Java object.  The type of the Java object will be the default
  733.    * Java Object type corresponding to the column's SQL type, following
  734.    * the mapping specified in the JDBC specification.
  735.    *
  736.    * <p>This method may also be used to read database specific abstract
  737.    * data types.
  738.    *
  739.    * @param columnName is the SQL name of the column
  740.    * @return a Object holding the column value
  741.    * @exception SQLException if a database access error occurs
  742.    */
  743.   public Object getObject(String columnName) throws SQLException
  744.   {
  745.     return getObject(findColumn(columnName));
  746.   }
  747.   
  748.   /**
  749.    * Map a ResultSet column name to a ResultSet column index
  750.    *
  751.    * @param columnName the name of the column
  752.    * @return the column index
  753.    * @exception SQLException if a database access error occurs
  754.    */
  755.   public int findColumn(String columnName) throws SQLException
  756.   {
  757.     int i;
  758.     
  759.     for (i = 0 ; i < fields.length; ++i)
  760.       if (fields[i].name.equalsIgnoreCase(columnName))
  761. return (i+1);
  762.     throw new PSQLException ("postgresql.res.colname",columnName);
  763.   }
  764. }