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: