Re: [PATCH] Ability to PreparedStatement.setObject(#, int[]) - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [PATCH] Ability to PreparedStatement.setObject(#, int[])
Date
Msg-id 200202230239.g1N2d8a06437@candle.pha.pa.us
Whole thread Raw
In response to [PATCH] Ability to PreparedStatement.setObject(#, int[])  (Doug Fields <dfields-postgres@pexicom.com>)
List pgsql-patches
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://candle.pha.pa.us/cgi-bin/pgpatches

I will try to apply it within the next 48 hours.

---------------------------------------------------------------------------


Doug Fields wrote:
> Hello,
>
> (Find Unified Context Diff below against 7.2 shipping sources)
>
> Currently there is no way to set an int[] object to an INTEGER[] in
> Postgres with JDBC, unless you create a string and do it. However, reading
> p266-267 of JDBC API Tutorial and Reference, 2nd Ed by White, Fisher,
> Cattell, Hamilton, Hapner, indicates that we should be able to setObject it
> and have it work.
>
> The current 7.2 drivers do not support this functionality, that of calling
> setObject() with an array. Instead, the driver tries to use object
> serialization to store it.
>
> In theory, any base type or String array should be converted to the
> appropriate array format and stored in an array type in the database. I
> have only patched it to recognize an int[] array to demonstrate what should
> be done. If people wish, I can extend my patch to all base array types
> other than byte (which is already handled).
>
> Cheers,
>
> Doug
>
>
> diff -ru5 org-orig/postgresql/jdbc2/PreparedStatement.java
> org/postgresql/jdbc2/PreparedStatement.java
> --- org-orig/postgresql/jdbc2/PreparedStatement.java    Tue Jan 15 02:37:33
> 2002
> +++ org/postgresql/jdbc2/PreparedStatement.java Wed Feb 20 20:34:32 2002
> @@ -754,11 +754,29 @@
>                          setTimestamp(parameterIndex, (Timestamp)x);
>                  else if (x instanceof Boolean)
>                          setBoolean(parameterIndex,
> ((Boolean)x).booleanValue());
>                  else if (x instanceof PGobject)
>                          setString(parameterIndex, ((PGobject)x).getValue());
> -               else
> +               else if (x instanceof int[]) {
> +                       /* Turn into a string and use setString instead.
> +                        * This should be used for other array types as well.
> +                        * See p266-267 of JDBC API Tutorial and Reference,
> +                        * 2nd Ed by White, Fisher, Cattell, Hamilton, Hapner
> +                        * for why this method should be done this way.
> +                        * Doug Fields <dfields-pg-jdbc@pexicom.com>
> +                        * Feb 20, 2002 */
> +                       StringBuffer sb = new StringBuffer();
> +                       int[] y = (int[])x; // Ease of use
> +                       sb.append('{');
> +                       for (int i = 0; i < y.length; i++) {
> +                               if (i > 0)
> +                                       sb.append(',');
> +                               sb.append(y[i]);
> +                       }
> +                       sb.append('}');
> +                       setString(parameterIndex, sb.toString());
> +               } else
>                          // Try to store java object in database
>                          setSerialize(parameterIndex,
> connection.storeObject(x), x.getClass().getName() );
>          }
>
>          /*
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: simple code cleanups
Next
From: Bruce Momjian
Date:
Subject: Re: JDBC CStmt (inline this time)