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

数据库系统

开发平台:

Unix_Linux

  1. package postgresql;
  2. import java.lang.*;
  3. import java.sql.*;
  4. import java.util.*;
  5. import postgresql.*;
  6. import postgresql.util.*;
  7. /**
  8.  * postgresql.Field is a class used to describe fields in a PostgreSQL
  9.  * ResultSet
  10.  */
  11. public class Field
  12. {
  13.   public int length; // Internal Length of this field
  14.   public int oid; // OID of the type
  15.   public String name; // Name of this field
  16.   
  17.   protected Connection conn; // Connection Instantation
  18.   
  19.   public int sql_type = -1; // The entry in java.sql.Types for this field
  20.   public String type_name = null;// The sql type name
  21.   
  22.   /**
  23.    * Construct a field based on the information fed to it.
  24.    *
  25.    * @param conn the connection this field came from
  26.    * @param name the name of the field
  27.    * @param oid the OID of the field
  28.    * @param len the length of the field
  29.    */
  30.   public Field(Connection conn, String name, int oid, int length)
  31.   {
  32.     this.conn = conn;
  33.     this.name = name;
  34.     this.oid = oid;
  35.     this.length = length;
  36.   }
  37.   
  38.   /**
  39.    * @return the oid of this Field's data type
  40.    */
  41.   public int getOID()
  42.   {
  43.     return oid;
  44.   }
  45.   
  46.   /**
  47.    * the ResultSet and ResultMetaData both need to handle the SQL
  48.    * type, which is gained from another query.  Note that we cannot
  49.    * use getObject() in this, since getObject uses getSQLType().
  50.    *
  51.    * @return the entry in Types that refers to this field
  52.    * @exception SQLException if a database access error occurs
  53.    */
  54.   public int getSQLType() throws SQLException
  55.   {
  56.     if(sql_type == -1) {
  57.       type_name = (String)conn.fieldCache.get(new Integer(oid));
  58.       
  59.       // it's not in the cache, so perform a query, and add the result to
  60.       // the cache
  61.       if(type_name==null) {
  62. ResultSet result = (postgresql.ResultSet)conn.ExecSQL("select typname from pg_type where oid = " + oid);
  63. if (result.getColumnCount() != 1 || result.getTupleCount() != 1)
  64.   throw new PSQLException("postgresql.unexpected");
  65. result.next();
  66. type_name = result.getString(1);
  67. conn.fieldCache.put(new Integer(oid),type_name);
  68. result.close();
  69.       }
  70.       
  71.       sql_type = getSQLType(type_name);
  72.     }
  73.     return sql_type;
  74.   }
  75.   
  76.   /**
  77.    * This returns the SQL type. It is called by the Field and DatabaseMetaData classes
  78.    * @param type_name PostgreSQL type name
  79.    * @return java.sql.Types value for oid
  80.    */
  81.   public static int getSQLType(String type_name)
  82.   {
  83.     int sql_type = Types.OTHER; // default value
  84.     for(int i=0;i<types.length;i++)
  85.       if(type_name.equals(types[i]))
  86. sql_type=typei[i];
  87.     return sql_type;
  88.   }
  89.   
  90.   /**
  91.    * This table holds the postgresql names for the types supported.
  92.    * Any types that map to Types.OTHER (eg POINT) don't go into this table.
  93.    * They default automatically to Types.OTHER
  94.    *
  95.    * Note: This must be in the same order as below.
  96.    *
  97.    * Tip: keep these grouped together by the Types. value
  98.    */
  99.   private static final String types[] = {
  100.     "int2",
  101.     "int4","oid",
  102.     "int8",
  103.     "cash","money",
  104.     "float4",
  105.     "float8",
  106.     "bpchar","char","char2","char4","char8","char16",
  107.     "varchar","text","name","filename",
  108.     "bool",
  109.     "date",
  110.     "time",
  111.     "abstime","timestamp"
  112.   };
  113.   
  114.   /**
  115.    * This table holds the JDBC type for each entry above.
  116.    *
  117.    * Note: This must be in the same order as above
  118.    *
  119.    * Tip: keep these grouped together by the Types. value
  120.    */
  121.   private static final int typei[] = {
  122.     Types.SMALLINT,
  123.     Types.INTEGER,Types.INTEGER,
  124.     Types.BIGINT,
  125.     Types.DECIMAL,Types.DECIMAL,
  126.     Types.REAL,
  127.     Types.DOUBLE,
  128.     Types.CHAR,Types.CHAR,Types.CHAR,Types.CHAR,Types.CHAR,Types.CHAR,
  129.     Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,
  130.     Types.BIT,
  131.     Types.DATE,
  132.     Types.TIME,
  133.     Types.TIMESTAMP,Types.TIMESTAMP
  134.   };
  135.   
  136.   /**
  137.    * We also need to get the type name as returned by the back end.
  138.    * This is held in type_name AFTER a call to getSQLType.  Since
  139.    * we get this information within getSQLType (if it isn't already
  140.    * done), we can just call getSQLType and throw away the result.
  141.    *
  142.    * @return the String representation of the type of this field
  143.    * @exception SQLException if a database access error occurs
  144.    */
  145.   public String getTypeName() throws SQLException
  146.   {
  147.     int sql = getSQLType();
  148.     return type_name;
  149.   }
  150. }