some improve JDBC - Mailing list pgsql-jdbc
From | Víctor Pérez Juárez |
---|---|
Subject | some improve JDBC |
Date | |
Msg-id | 200508021235.03510.victor.perez@e-evolution.com.mx Whole thread Raw |
Responses |
Re: some improve JDBC
|
List | pgsql-jdbc |
Hi all! My name is Victor, I lead the enterprise www.e-evolution.com, we are working in making a port of software Compiere (www.compiere.org) that now only works with oracle to PostgreSQL. Compiere use the RowSet implementation, I made some changes to the source AbstractJdbc2ResultSetMetaData method: /* * What is the column's normal maximum width in characters? * * @param column the first column is 1, the second is 2, etc. * @return the maximum width * @exception SQLException if a database access error occurs */ public int getColumnDisplaySize(int column) throws SQLException { Field f = getField(column); String type_name = getPGType(column); int typmod = f.getMod(); // I looked at other JDBC implementations and couldn't find a consistent // interpretation of the "display size" for numeric values, so this is our's // FIXME: currently, only types with a SQL92 or SQL3 pendant are implemented - jens@jens.de // fixed length data types if (type_name.equals( "int2" )) return 6; // -32768 to +32768 (5 digits and a sign) if (type_name.equals( "int4" ) || type_name.equals( "oid" )) return 11; // -2147483648 to +2147483647 if (type_name.equals( "int8" )) return 20; // -9223372036854775808 to +9223372036854775807 if (type_name.equals( "money" )) return 12; // MONEY = DECIMAL(9,2) if (type_name.equals( "float4" )) return 11; // i checked it out ans wasn't able to produce more than 11 digits if (type_name.equals( "float8" )) return 20; // dito, 20 if (type_name.equals( "char" )) return 1; if (type_name.equals( "bool" )) return 1; int secondSize; switch (typmod) { case 0: secondSize = 0; break; case - 1: // six digits plus the decimal point secondSize = 7; break; default: // with an odd scale an even number of digits // are always show so timestamp(1) will print // two fractional digits. secondSize = typmod + (typmod % 2) + 1; break; } if (type_name.equals( "date" )) return 13; // "01/01/4713 BC" - "31/12/32767" // If we knew the timezone we could avoid having to possibly // account for fractional hour offsets (which adds three chars). // // Also the range of timestamp types is not exactly clear. // 4 digits is the common case for a year, but there are // version/compilation dependencies on the exact date ranges, // (notably --enable-integer-datetimes), but for now we'll // just ignore them and assume that a year is four digits. // if (type_name.equals( "time" )) return 8 + secondSize; // 00:00:00 + seconds if (type_name.equals( "timetz" )) return 8 + secondSize + 6; // 00:00.00 + .000000 + -00:00 if (type_name.equals( "timestamp" )) return 19 + secondSize; // 0000-00-00 00:00:00 + .000000; if (type_name.equals( "timestamptz" )) return 19 + secondSize + 6; // 0000-00-00 00:00:00 + .000000 + -00:00; //begin vpj-cd e-evolution if (type_name.equals( "text") || type_name.equals("bytea")) { if (typmod == -1) return 0; else return typmod; } if (type_name.equals( "unknown")) return 0; //end vpj-cd e-evolution // variable length fields typmod -= 4; if (type_name.equals( "bpchar" ) || type_name.equals( "varchar" )) // being vpj-cd e-evolution 07/30/2005 { if (typmod < 0) return 0; else return typmod; // VARHDRSZ=sizeof(int32)=4 } // end vpj-cd e-evolution 07/30/2005 if (type_name.equals( "numeric" )) { //return ( (typmod >> 16) & 0xffff ) // + 1 + ( typmod & 0xffff ); // DECIMAL(p,s) = (p digits). (s digits) if( ((typmod >> 16) & 0xffff ) + 1 + ( typmod & 0xffff ) == -1) return 0; else return ( (typmod >> 16) & 0xffff ) + 1 + ( typmod & 0xffff ); } // if we don't know better return f.getLength(); } * JDBC driver build number 8.1dev-401 JDBC Source * Server version PostgreSQL 8.0.3 in Linux AMD64 Cheers Victor Pérez CEO e-Evolution,SC www.e-evolution.com
pgsql-jdbc by date: