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:

Previous
From: Jasper Potts
Date:
Subject: Re: Select where id in (LARGE LIST) ?
Next
From: Oliver Jowett
Date:
Subject: Re: Select where id in (LARGE LIST) ?