Thread: JDBC and arrays

JDBC and arrays

From
Miroslav Šulc
Date:
Hi,

I tried to find some info on how to work with arrays using PostgreSQL
JDBC driver but didn't find anything useful except that I can implement
java.sql.Array to get support for arrays. Can someone, please, send me a
link on how to write and read array data using PostgreSQL JDBC driver or
give me a brief explanation? I'm also interested how to work with inet[]
arrays as they do not seem to be directly supported by JDBC API.

Thanks for any info.

--
Miroslav Šulc


Re: JDBC and arrays

From
Kris Jurka
Date:

On Fri, 2 Feb 2007, Miroslav Šulc wrote:

> I tried to find some info on how to work with arrays using PostgreSQL JDBC
> driver but didn't find anything useful except that I can implement
> java.sql.Array to get support for arrays. Can someone, please, send me a link
> on how to write and read array data using PostgreSQL JDBC driver or give me a
> brief explanation? I'm also interested how to work with inet[] arrays as they
> do not seem to be directly supported by JDBC API.

Reading arrays is pretty straightforward:

ResultSet rs = stmt.executeQuery("SELECT '{a,b}'::text[]");
rs.next();
Array arr = rs.getArray(1);
String s[] = (String)arr.getArray();

Writing arrays is not easy because prior to the JDBC4 spec there was no
way to create java.sql.Array objects without creating a class that
implements java.sql.Array yourself.  Now JDBC4 offers
Connection.createArrayOf() which unfortunately we haven't implemented yet.
So while there is a light at the end of the tunnel you're still stuck
implementing java.sql.Array yourself.  Check the mailing list for examples
of that.

Currently arrays of non-standard datatypes like inet are not supported.
Seems possible to do if you were willing to use PGobject for unknown
types, but no one has done it.

Also more complicated things like multi-dimensional arrays are note
supported.

Kris Jurka

Re: JDBC and arrays

From
Miroslav Šulc
Date:
Thank you for explanation. If I still want to write inet[] data, is it
sufficient to implement PGobject so it returns 'inet[]' type and '{
"ip", "ip" }' value and pass that to setObject()?

--
Miroslav Šulc



Kris Jurka napsal(a):
>
>
> On Fri, 2 Feb 2007, Miroslav Šulc wrote:
>
>> I tried to find some info on how to work with arrays using PostgreSQL
>> JDBC driver but didn't find anything useful except that I can
>> implement java.sql.Array to get support for arrays. Can someone,
>> please, send me a link on how to write and read array data using
>> PostgreSQL JDBC driver or give me a brief explanation? I'm also
>> interested how to work with inet[] arrays as they do not seem to be
>> directly supported by JDBC API.
>
> Reading arrays is pretty straightforward:
>
> ResultSet rs = stmt.executeQuery("SELECT '{a,b}'::text[]");
> rs.next();
> Array arr = rs.getArray(1);
> String s[] = (String)arr.getArray();
>
> Writing arrays is not easy because prior to the JDBC4 spec there was
> no way to create java.sql.Array objects without creating a class that
> implements java.sql.Array yourself.  Now JDBC4 offers
> Connection.createArrayOf() which unfortunately we haven't implemented
> yet. So while there is a light at the end of the tunnel you're still
> stuck implementing java.sql.Array yourself.  Check the mailing list
> for examples of that.
>
> Currently arrays of non-standard datatypes like inet are not
> supported. Seems possible to do if you were willing to use PGobject
> for unknown types, but no one has done it.
>
> Also more complicated things like multi-dimensional arrays are note
> supported.
>
> Kris Jurka
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Have you searched our list archives?
>
>               http://archives.postgresql.org

Re: JDBC and arrays

From
Russell Francis
Date:
Miroslav Šulc wrote:
> Thank you for explanation. If I still want to write inet[] data, is it
> sufficient to implement PGobject so it returns 'inet[]' type and '{
> "ip", "ip" }' value and pass that to setObject()?

Miroslav,

I don't know if this will help you but awhile ago I implemented data
types for the JDBC driver for PGinet, PGmacaddr, PGcidr which have been
used successfully by a number of people including myself ;)  I would
still like to get them integrated into the driver but haven't had much
time to pursue it.  You can find the current version at

http://oak.cats.ohiou.edu/~rf358197/jdbc/2/

I have zero experience using them in an array but if you are using those
data types in PostgreSQL and using Java, the code might be useful to you.

Kind regards,
Russ

>
> --
> Miroslav Šulc
>
>
>
> Kris Jurka napsal(a):
>>
>>
>> On Fri, 2 Feb 2007, Miroslav Šulc wrote:
>>
>>> I tried to find some info on how to work with arrays using PostgreSQL
>>> JDBC driver but didn't find anything useful except that I can
>>> implement java.sql.Array to get support for arrays. Can someone,
>>> please, send me a link on how to write and read array data using
>>> PostgreSQL JDBC driver or give me a brief explanation? I'm also
>>> interested how to work with inet[] arrays as they do not seem to be
>>> directly supported by JDBC API.
>>
>> Reading arrays is pretty straightforward:
>>
>> ResultSet rs = stmt.executeQuery("SELECT '{a,b}'::text[]");
>> rs.next();
>> Array arr = rs.getArray(1);
>> String s[] = (String)arr.getArray();
>>
>> Writing arrays is not easy because prior to the JDBC4 spec there was
>> no way to create java.sql.Array objects without creating a class that
>> implements java.sql.Array yourself.  Now JDBC4 offers
>> Connection.createArrayOf() which unfortunately we haven't implemented
>> yet. So while there is a light at the end of the tunnel you're still
>> stuck implementing java.sql.Array yourself.  Check the mailing list
>> for examples of that.
>>
>> Currently arrays of non-standard datatypes like inet are not
>> supported. Seems possible to do if you were willing to use PGobject
>> for unknown types, but no one has done it.
>>
>> Also more complicated things like multi-dimensional arrays are note
>> supported.
>>
>> Kris Jurka
>> ---------------------------(end of broadcast)---------------------------
>> TIP 4: Have you searched our list archives?
>>
>>               http://archives.postgresql.org
>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: You can help support the PostgreSQL project by donating at
>
>                http://www.postgresql.org/about/donate


Re: JDBC and arrays

From
Kris Jurka
Date:

On Fri, 2 Feb 2007, Miroslav Šulc wrote:

> Thank you for explanation. If I still want to write inet[] data, is it
> sufficient to implement PGobject so it returns 'inet[]' type and '{ "ip",
> "ip" }' value and pass that to setObject()?

That should work although you'll probably need to write _inet
instead of inet[].  The underscore variant is the the backend's true
datatype name and I'm not sure if it will accept the other version in this
context.

Re: JDBC and arrays

From
Miroslav Šulc
Date:
I got writing of inet[] working through object that implements PGobject
(you were right, it works only with _inet), but I cannot read inet[]. I
thought I'll get String[] through getArray(index).getArray() but instead
I get an exception on getArray(index). What is the correct way to read
inet[]?

Caused by: org.postgresql.util.PSQLException: Method
org.postgresql.jdbc3g.Jdbc3gArray.getArrayImpl(long,int,Map) is not
implemented.
        at org.postgresql.Driver.notImplemented(Driver.java:728)
        at
org.postgresql.jdbc2.AbstractJdbc2Array.getArrayImpl(AbstractJdbc2Array.java:228)
        at
org.postgresql.jdbc2.AbstractJdbc2Array.getArray(AbstractJdbc2Array.java:71)
        at
cz.startnet.utils.java.sql.ResultSetUtils.getValue(ResultSetUtils.java:253)

--
Miroslav Šulc


Kris Jurka napsal(a):
>
>
> On Fri, 2 Feb 2007, Miroslav Šulc wrote:
>
>> Thank you for explanation. If I still want to write inet[] data, is
>> it sufficient to implement PGobject so it returns 'inet[]' type and
>> '{ "ip", "ip" }' value and pass that to setObject()?
>
> That should work although you'll probably need to write _inet instead
> of inet[].  The underscore variant is the the backend's true datatype
> name and I'm not sure if it will accept the other version in this
> context.

Re: JDBC and arrays

From
Miroslav Šulc
Date:
I got it. I read it as string and then I parse the string to get the values.

--
Miroslav Šulc

Miroslav Šulc napsal(a):
> I got writing of inet[] working through object that implements
> PGobject (you were right, it works only with _inet), but I cannot read
> inet[]. I thought I'll get String[] through getArray(index).getArray()
> but instead I get an exception on getArray(index). What is the correct
> way to read inet[]?
>
> Caused by: org.postgresql.util.PSQLException: Method
> org.postgresql.jdbc3g.Jdbc3gArray.getArrayImpl(long,int,Map) is not
> implemented.
>        at org.postgresql.Driver.notImplemented(Driver.java:728)
>        at
> org.postgresql.jdbc2.AbstractJdbc2Array.getArrayImpl(AbstractJdbc2Array.java:228)
>
>        at
> org.postgresql.jdbc2.AbstractJdbc2Array.getArray(AbstractJdbc2Array.java:71)
>
>        at
> cz.startnet.utils.java.sql.ResultSetUtils.getValue(ResultSetUtils.java:253)
>
>
> --
> Miroslav Šulc

Re: JDBC and arrays

From
Miroslav Šulc
Date:
Russell,

thank you for the link. I have all the logic already implemented either
in my classes or I use system one (like java.net.Inet4Address) so what I
need (and have) is just a simple implementation of PGobject which
returns correct type and the value.

Best regards,

--
Miroslav Šulc


Russell Francis napsal(a):
> Miroslav Šulc wrote:
>
>> Thank you for explanation. If I still want to write inet[] data, is it
>> sufficient to implement PGobject so it returns 'inet[]' type and '{
>> "ip", "ip" }' value and pass that to setObject()?
>>
>
> Miroslav,
>
> I don't know if this will help you but awhile ago I implemented data
> types for the JDBC driver for PGinet, PGmacaddr, PGcidr which have been
> used successfully by a number of people including myself ;)  I would
> still like to get them integrated into the driver but haven't had much
> time to pursue it.  You can find the current version at
>
> http://oak.cats.ohiou.edu/~rf358197/jdbc/2/
>
> I have zero experience using them in an array but if you are using those
> data types in PostgreSQL and using Java, the code might be useful to you.
>
> Kind regards,
> Russ
>