Re: blob load errors - Mailing list pgsql-jdbc

From jonerf1
Subject Re: blob load errors
Date
Msg-id 3DACDBBD.8040009@qwest.net
Whole thread Raw
In response to blob load errors  ("jonerf1" <jonesrf1@qwest.net>)
List pgsql-jdbc
Barry Lind wrote:

> I am assuming from the error message you are getting your table
> definition has imgoid as type oid and thus you are trying to use the
> large object api to store the blobs instead of storing them as type
> bytea.
>
> The 7.2 and 7.3 drivers default to assuming binary data is stored as
> bytea.  So looking at the error message you are getting and the output
> from the log it really looks like the problem is that you are not
> using the 7.1 driver but are really using a 7.2 or 7.3 driver (are you
> sure that you don't have the newer driver somewhere in your classpath?).
>
> You should also read the section in the postgres jdbc driver
> documentation on binary data support.  You can actually use the 7.2 or
> 7.3 driver to work with the oid data type, by turning on the backward
> compatibility mode.  This is documented in the documentation.
>
> thanks,
> --Barry
>
>
> jonerf1 wrote:
>
>> Thanks for your reply.
>> I have tried both the 73b1 and the devpgjdbc3 drivers; neither
>> machine works with any driver but the 7.1-1.3.jar
>> this is the setup for the prepared statement; a file name string and
>> a fileinputstream
>> this works with jdbc7.1-1.3 only, and on machine A only
>> //images has int serial in 1st fld, names in #2, oid in *3
>> pst.setString(1,fn1.getName());
>>    pst.setBinaryStream(2,fis,(int)fn1.length());
>>    pst.executeUpdate();
>>    fis.close();
>>
>> Is the pg_atoi error an indicator of a library problem on machine B?
>> is there a utility to check what pg_atoi
>> is calling so I can compare the two machines' underlying libraries?
>>
>> TIA
>> rfjones
>> Barry Lind wrote:
>>
>>> First thing I would suggest is trying the latest driver from
>>> jdbc.postgresql.org (either the latest dev build or the 7.3b1
>>> build). Also your example below is missing the code that is setting
>>> the values for the prepared statement.  So I am unsure as to what
>>> your code is trying to do.  Finally why are you running a 7.1 driver
>>> against a 7.2 database?
>>>
>>> thanks,
>>> --Barry
>>>
>>>
>>> jonerf1 wrote:
>>>
>>>> I have two machines running the same small java program; one
>>>> machine can load files as blobs,
>>>> the other gets the oidin error. This happens even when the same
>>>> postgresql server is acccessed;
>>>> the local upload works on machine A, the local upload fails on
>>>> machine B, and upload to machine Aover tcpip fails as well. Both
>>>> machines are running pgsql7.2.3, using jdbc7.1-1.3.jar, jdk1.4.0x,
>>>> kernel 2.4.18 on redhat 7.3
>>>>
>>>> this is the insert statement
>>>> try
>>>> {
>>>> //ist fld is serial id, 2nd is name, 3rd is oid
>>>> String sqlstr =  "INSERT INTO images(imgname, imgoid) VALUES(?,?)";
>>>> pst = conn.prepareStatement(sqlstr);
>>>> System.out.println("pst = "+pst);
>>>> }//end try
>>>>
>>>> below is output from posmaster on machine A from machine B
>>>>
>>>> DEBUG:  query: begin;
>>>> DEBUG:  parse tree: { QUERY :command 5  :utility ?  :resultRelation
>>>> 0 :into <> :isPortal false :isBinary false :isTemp false :hasAggs
>>>> false :hasSubLinks false :rtable <> :jointree <> :rowMarks ()
>>>> :targetList <> :groupClause <> :havingQual <> :distinctClause <>
>>>> :sortClause <> :limitOffset <> :limitCount <> :setOperations <>
>>>> :resultRelations ()}
>>>> DEBUG:  ProcessUtility: begin;
>>>> DEBUG:  CommitTransactionCommand
>>>> DEBUG:  StartTransactionCommand
>>>> DEBUG:  query: INSERT INTO images
>>>> HERE NEXT LINE SHORTENED UP
>>>> VALUES('doss','\\377WPC^\\012\\000\\000\\001\\012\\002\\001\\000\\000\\000\\002\\005\\0\\000\\324')
>>>>
>>>> ERROR:  pg_atoi: error in "doss": can't parse "doss"
>>>> DEBUG:  AbortCurrentTransaction
>>>> DEBUG:  StartTransactionCommand
>>>> DEBUG:  query: commit;begin;
>>>>
>>>> Any help greatly appreciated.
>>>> TIA
>>>> rfjones
>>>>
>>>>
>>>> ---------------------------(end of
>>>> broadcast)---------------------------
>>>> TIP 5: Have you checked our extensive FAQ?
>>>>
>>>> http://www.postgresql.org/users-lounge/docs/faq.html
>>>>
>>>
>>>
>>>
>>> ---------------------------(end of
>>> broadcast)---------------------------
>>> TIP 2: you can get off all lists at once with the unregister command
>>>    (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>>>
>>>
>>
>>
>>
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 5: Have you checked our extensive FAQ?
>>
>> http://www.postgresql.org/users-lounge/docs/faq.html
>>
>
>
>
>
You are absolutely right. I recreated the table as bytea; I now get an
error trying to compile the sample code below.

>CREATE TABLE images (imgname text, img bytea);
>
> To insert an image, you would use:
>
>File file = new File("myimage.gif");
>FileInputStream fis = new FileInputStream(file);
>PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");
>ps.setString(1, file.getName());
>ps.setBinaryStream(2, fis, file.length());
>ps.executeUpdate();
>ps.close();
>
pgf.java:84: setBinaryStream(int,java.io.InputStream,int) in
java.sql.PreparedStatement cannot be applied to
(int,java.io.FileInputStream,long)
    pst.setBinaryStream(2, fis,fn1.length());
           ^
I had been using (2,fis,(int)fn1.length()); and it worked with the oid
now it gives me  the following error when I run the program

at pst getName pst = INSERT INTO images(imgname, imgid)
VALUES('abc-lmi.sxw',16726)
SQLException java.sql.SQLException: ERROR:  column "imgid" is of type
'bytea' but expression is of type 'integer'
    You will need to rewrite or cast the expression

How should I proceed?
TIA
rfjones


pgsql-jdbc by date:

Previous
From: "jonerf1"
Date:
Subject: Re: blob load errors
Next
From: "jonerf1"
Date:
Subject: blob load in 7.2.3