Re: some improve JDBC

From: Víctor Pérez Juárez <victor(dot)perez(at)e-evolution(dot)com(dot)mx>
To: pgsql-jdbc(at)postgresql(dot)org
Cc: Oliver Jowett <oliver(at)opencloud(dot)com>
Subject: Re: some improve JDBC
Date: 2005-08-03 17:20:16
Message-ID: 200508031220.16657.victor.perez@e-evolution.com.mx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Of cosure!

my changes are commnet with e-evolution

        //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

// 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
---------------------------------------------------------------------------------------------------------------------------------------
the code complete:

/*
     * 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(at)jens(dot)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

El Martes, 2 de Agosto de 2005 18:55, Oliver Jowett escribió:
> Víctor Pérez Juárez wrote:
> > Compiere use the RowSet implementation, I made some changes to the source
> > AbstractJdbc2ResultSetMetaData method:
>
> Can you send a diff? I can't see what you've changed from just this.
>
> -O
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faq

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Dave Cramer 2005-08-03 17:44:14 Re: some improve JDBC
Previous Message Xavier Poinsard 2005-08-03 15:55:13 Re: pgsql-jdbc and Java