mirror of
https://github.com/postgres/postgres.git
synced 2025-05-06 19:59:18 +03:00
Tue Feb 13 16:33:00 GMT 2001 peter@retep.org.uk - More TestCases implemented. Refined the test suite api's. - Removed need for SimpleDateFormat in ResultSet.getDate() improving performance. - Rewrote ResultSet.getTime() so that it uses JDK api's better. Tue Feb 13 10:25:00 GMT 2001 peter@retep.org.uk - Added MiscTest to hold reported problems from users. - Fixed PGMoney. - JBuilder4/JDBCExplorer now works with Money fields. Patched Field & ResultSet (lots of methods) for this one. Also changed cash/money to return type DOUBLE not DECIMAL. This broke JBuilder as zero scale BigDecimal's can't have decimal places! - When a Statement is reused, the previous ResultSet is now closed. - Removed deprecated call in ResultSet.getTime() Thu Feb 08 18:53:00 GMT 2001 peter@retep.org.uk - Changed a couple of settings in DatabaseMetaData where 7.1 now supports those features - Implemented the DatabaseMetaData TestCase. Wed Feb 07 18:06:00 GMT 2001 peter@retep.org.uk - Added comment to Connection.isClosed() explaining why we deviate from the JDBC2 specification. - Fixed bug where the Isolation Level is lost while in autocommit mode. - Fixed bug where several calls to getTransactionIsolationLevel() returned the first call's result.
170 lines
4.6 KiB
Java
170 lines
4.6 KiB
Java
package org.postgresql;
|
|
|
|
import java.lang.*;
|
|
import java.sql.*;
|
|
import java.util.*;
|
|
import org.postgresql.*;
|
|
import org.postgresql.util.*;
|
|
|
|
/**
|
|
* org.postgresql.Field is a class used to describe fields in a PostgreSQL
|
|
* ResultSet
|
|
*/
|
|
public class Field
|
|
{
|
|
public int length; // Internal Length of this field
|
|
public int oid; // OID of the type
|
|
public int mod; // type modifier of this field
|
|
public String name; // Name of this field
|
|
|
|
protected Connection conn; // Connection Instantation
|
|
|
|
public int sql_type = -1; // The entry in java.sql.Types for this field
|
|
public String type_name = null;// The sql type name
|
|
|
|
/**
|
|
* Construct a field based on the information fed to it.
|
|
*
|
|
* @param conn the connection this field came from
|
|
* @param name the name of the field
|
|
* @param oid the OID of the field
|
|
* @param len the length of the field
|
|
*/
|
|
public Field(Connection conn, String name, int oid, int length,int mod)
|
|
{
|
|
this.conn = conn;
|
|
this.name = name;
|
|
this.oid = oid;
|
|
this.length = length;
|
|
this.mod = mod;
|
|
}
|
|
|
|
/**
|
|
* Constructor without mod parameter.
|
|
*
|
|
* @param conn the connection this field came from
|
|
* @param name the name of the field
|
|
* @param oid the OID of the field
|
|
* @param len the length of the field
|
|
*/
|
|
public Field(Connection conn, String name, int oid, int length)
|
|
{
|
|
this(conn,name,oid,length,0);
|
|
}
|
|
|
|
/**
|
|
* @return the oid of this Field's data type
|
|
*/
|
|
public int getOID()
|
|
{
|
|
return oid;
|
|
}
|
|
|
|
/**
|
|
* the ResultSet and ResultMetaData both need to handle the SQL
|
|
* type, which is gained from another query. Note that we cannot
|
|
* use getObject() in this, since getObject uses getSQLType().
|
|
*
|
|
* @return the entry in Types that refers to this field
|
|
* @exception SQLException if a database access error occurs
|
|
*/
|
|
public int getSQLType() throws SQLException
|
|
{
|
|
if(sql_type == -1) {
|
|
type_name = (String)conn.fieldCache.get(new Integer(oid));
|
|
|
|
// it's not in the cache, so perform a query, and add the result to
|
|
// the cache
|
|
if(type_name==null) {
|
|
ResultSet result = (org.postgresql.ResultSet)conn.ExecSQL("select typname from pg_type where oid = " + oid);
|
|
if (result.getColumnCount() != 1 || result.getTupleCount() != 1)
|
|
throw new PSQLException("postgresql.unexpected");
|
|
result.next();
|
|
type_name = result.getString(1);
|
|
conn.fieldCache.put(new Integer(oid),type_name);
|
|
result.close();
|
|
}
|
|
|
|
sql_type = getSQLType(type_name);
|
|
}
|
|
return sql_type;
|
|
}
|
|
|
|
/**
|
|
* This returns the SQL type. It is called by the Field and DatabaseMetaData classes
|
|
* @param type_name PostgreSQL type name
|
|
* @return java.sql.Types value for oid
|
|
*/
|
|
public static int getSQLType(String type_name)
|
|
{
|
|
int sql_type = Types.OTHER; // default value
|
|
for(int i=0;i<types.length;i++)
|
|
if(type_name.equals(types[i]))
|
|
sql_type=typei[i];
|
|
return sql_type;
|
|
}
|
|
|
|
/**
|
|
* This table holds the org.postgresql names for the types supported.
|
|
* Any types that map to Types.OTHER (eg POINT) don't go into this table.
|
|
* They default automatically to Types.OTHER
|
|
*
|
|
* Note: This must be in the same order as below.
|
|
*
|
|
* Tip: keep these grouped together by the Types. value
|
|
*/
|
|
private static final String types[] = {
|
|
"int2",
|
|
"int4","oid",
|
|
"int8",
|
|
"cash","money",
|
|
"numeric",
|
|
"float4",
|
|
"float8",
|
|
"bpchar","char","char2","char4","char8","char16",
|
|
"varchar","text","name","filename",
|
|
"bool",
|
|
"date",
|
|
"time",
|
|
"abstime","timestamp"
|
|
};
|
|
|
|
/**
|
|
* This table holds the JDBC type for each entry above.
|
|
*
|
|
* Note: This must be in the same order as above
|
|
*
|
|
* Tip: keep these grouped together by the Types. value
|
|
*/
|
|
private static final int typei[] = {
|
|
Types.SMALLINT,
|
|
Types.INTEGER,Types.INTEGER,
|
|
Types.BIGINT,
|
|
Types.DOUBLE,Types.DOUBLE,
|
|
Types.NUMERIC,
|
|
Types.REAL,
|
|
Types.DOUBLE,
|
|
Types.CHAR,Types.CHAR,Types.CHAR,Types.CHAR,Types.CHAR,Types.CHAR,
|
|
Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,
|
|
Types.BIT,
|
|
Types.DATE,
|
|
Types.TIME,
|
|
Types.TIMESTAMP,Types.TIMESTAMP
|
|
};
|
|
|
|
/**
|
|
* We also need to get the type name as returned by the back end.
|
|
* This is held in type_name AFTER a call to getSQLType. Since
|
|
* we get this information within getSQLType (if it isn't already
|
|
* done), we can just call getSQLType and throw away the result.
|
|
*
|
|
* @return the String representation of the type of this field
|
|
* @exception SQLException if a database access error occurs
|
|
*/
|
|
public String getTypeName() throws SQLException
|
|
{
|
|
int sql = getSQLType();
|
|
return type_name;
|
|
}
|
|
}
|