Re: [Fwd: Re: [Fwd: Re: Problems with truncated BLOB]] - Mailing list pgsql-jdbc

From Mike Cannon-Brookes
Subject Re: [Fwd: Re: [Fwd: Re: Problems with truncated BLOB]]
Date
Msg-id 1006837896.3340.48.camel@frodo.mikesroom
Whole thread Raw
In response to Re: [Fwd: Re: [Fwd: Re: Problems with truncated BLOB]]  (Barry Lind <barry@xythos.com>)
Responses Re: Problems with truncated BLOB
List pgsql-jdbc
Barry,

I'm definitely just using the new driver, here's my classpath:

/usr/java/jdk1.3.1/lib/tools.jar:.:/opt/orion/lib/jdbc7.2dev-1.2.jar

(downloaded the jdbc jar from jdbc.postgresql.org this morning)

Might I suggest it's something to do with bytea support from 7.1 to
7.2b3? ;)

-mike

On Tue, 2001-11-27 at 13:13, Barry Lind wrote:
> Mike,
>
> When testing with the latest 7.2 drivers are you sure you are using the
> latest drivers and not picking up an older version of the driver
> somewhere else in your classpath?  I can't reproduce the bug using the
> latest drivers but can reproduce with 7.1 drivers (see below for my
> successful results)
>
> thanks,
> --Barry
>
> [blind@barry work]$ CLASSPATH=.:./postgresql.jar; export CLASSPATH
> [blind@barry work]$ java BlobTest postgresql.jar
> Connected to database system.
>
> file.name:postgresql.jarfile.length:116228
> File.length(int): 116228
> Trying to write: postgresql.jartest
> We have a result!
> bytes written: 116228
> [blind@barry work]$
>
> The only thing different in my environment is that I am running 7.2b2 on
> the server instead of 7.1.3.  Otherwise I am also using RedHat 7.2 and
> 2.4 kernel.
>
>
>
>
>
>
> Mike Cannon-Brookes wrote:
>
> > Barry,
> >
> > This program perfectly illustrates the bug for me (using both latest
> > drivers from website - uploaded 25/11 - and 7.1 drivers).
> >
> > Here's some sample output:
> >
> > [mike@frodo tmp]$ java BlobTest postgresql.jar
> > Connected to database system.
> >
> > file.name: postgresql.jar file.length: 95059
> > File.length(int): 95059
> > Trying to write: postgresql.jartest
> > We have a result!
> > We have a result!
> > bytes written: 476
> >
> > (used the postgresql.jar as a test binary file ;)).
> >
> > It seems to work ok with text files, but not with binary files. I'd say
> > there's definitely a bug here somewhere.
> >
> > Postgres DB version is 7.1.3, Linux 2.4, RH 7.2
> >
> > -mike
> >
> > On Tue, 2001-11-27 at 08:18, Barry Lind wrote:
> >
> >>Mihael,
> >>
> >>I'll include the attachments this time.
> >>
> >>thanks,
> >>--Barry
> >>
> >>-------- Original Message --------
> >>Subject: Re: [Fwd: Re: Problems with truncated BLOB]
> >>Date: Mon, 26 Nov 2001 12:27:58 -0800
> >>From: Barry Lind <barry@xythos.com>
> >>To: miqster@gmx.net
> >>CC: pgsql-jdbc@postgresql.org
> >>References: <3C028151.8020301@xythos.com>
> >>
> >>Mihael,
> >>
> >>I have been able to reproduce your problem with the 7.1 drivers, but not
> >>with the 7.2 drivers.  It appears that this is bug is already fixed in
> >>current sources.
> >>
> >>Note however that the functionality around get/setBinaryStream() has
> >>changed in 7.2.  In 7.2 the default behavior is that binary data is
> >>assumed to be in a column of type bytea.  So you would create a table
> >>as: create table blobs (filename text, data bytea) instead of using the
> >>OID datatype as in 7.1 (create table blobs (filename text, data OID)).
> >>For backward compatibility you can revert the driver back to the old
> >>behavior of using LargeObjects (i.e. OIDs) by passing the compatible=7.1
> >>parameter to the connection. (This can be done by addint
> >>'?compatible=7.1' to the end of the jdbc connection url.
> >>
> >>Attached are modified versions of the test case you sent that work for
> >>me using the 7.2 drivers (but do show the bug using the 7.1 drivers).
> >>The first (BlobTest.java) uses the new functionality and requires that
> >>the table 'blobs' have a column named 'data' of type 'bytea'.  The
> >>second (BlobTest2.java) uses the backward compatible mode and requires
> >>that the table 'blobs2' have a column named 'data' of type 'oid'.
> >>
> >>thanks,
> >>--Barry
> >>
> >>Barry Lind wrote:
> >>
> >> > Forwarding to the jdbc list in case someone else has time to look into
> >> > this bug before I get around to it.
> >> >
> >> > thanks,
> >> > --Barry
> >> >
> >> > -------- Original Message --------
> >> > Subject: Re: [JDBC] Problems with truncated BLOB
> >> > Date: 26 Nov 2001 17:37:05 +0100
> >> > From: Mihael Vrbanec <miqster@gmx.net>
> >> > To: Barry Lind <barry@xythos.com>
> >> > References: <1006737949.367.2.camel@Caprice>
> >><3C01A2AA.2030902@xythos.com>
> >> >
> >> > Hi Barry,
> >> >
> >> >  > Could you send a test case that demonstrates the problem?  Ideally a
> >> >  > sample java program that will upload one of the problem files, and
> >>then
> >> >  > another program that tries to download the file showing the
> >>problem you
> >> >  > have having.
> >> >
> >> > I have attached a sample program that does both. It uses a table called
> >> > blobs with two columns (filename, data). I experience the problem with
> >> > all binary files I have tried (.doc, .png, .bmp, .tar.gz).
> >> > HTML, and .txt do not have these problems.
> >> >
> >> >  > Also, which version of the jdbc driver are you using?  (the
> >>version that
> >> >  > came with 7.1, or something newer)
> >> >
> >> > The jdbc-driver is the one shipped with 7.1.2/3 (i compiled the whole
> >> > thing from source).
> >> >
> >> > many thanx in advance
> >> >
> >> > bxe Miq
> >> >
> >> >
> >> > ------------------------------------------------------------------------
> >> >
> >> > import java.io.*;
> >> > import java.util.*;
> >> > import java.sql.*;
> >> >
> >> >
> >> > public class BlobTest {
> >> >
> >> >     private Connection con = null;
> >> >
> >> >     public BlobTest() {
> >> >         try {
> >> >             Class.forName("org.postgresql.Driver");
> >> >             con = DriverManager.getConnection(
> >> >                     "jdbc:postgresql:repository", "candle", "");
> >> >             if (con != null) {
> >> >                System.out.println("Connected to database system.\n");
> >> >             }
> >> >         } catch (SQLException e) {
> >> >             System.out.println(e.getMessage());
> >> >             System.out.println("Could not connect to database
> >>system.\n");
> >> >         } catch (ClassNotFoundException e) {
> >> >             System.out.println("Class not found...:-(\n");
> >> >         }
> >> >     }
> >> >
> >> >     private void store(String filename) {
> >> >         PreparedStatement ps = null;
> >> >         ResultSet r = null;
> >> >         File file = new File(filename);
> >> >         System.out.println("file.name:" + file.getName() +
> >>"file.length:"+file.length());
> >> >         try {
> >> >             FileInputStream fis = new FileInputStream(file);
> >> >             con.setAutoCommit(false);
> >> >             ps = con.prepareStatement(
> >> >                 "INSERT INTO blobs VALUES (?, ?)");
> >> >             ps.setString(1, filename);
> >> >             System.out.println("File.length(int): " + (int)
> >>file.length());
> >> >             ps.setBinaryStream(2, fis, (int) file.length());
> >> >             ps.executeUpdate();
> >> >             ps.close();
> >> >             fis.close();
> >> >             con.commit();
> >> >         } catch (SQLException sqle) {
> >> >             System.err.println("Store content: " + sqle.getMessage());
> >> >         } catch (IOException ioe) {
> >> >         }
> >> >     }
> >> >
> >> >     private void retrieve(String filename) {
> >> >         Statement s = null;
> >> >         ResultSet r = null;
> >> >         int byteSum = 0;
> >> >         int bytesRead = 0;
> >> >         byte[] buffer = new byte[8 * 1924];
> >> >         try {
> >> >             System.out.println("Trying to write: " +filename + "test");
> >> >             FileOutputStream out = new FileOutputStream(filename +
> >>"test");
> >> >             con.setAutoCommit(false);
> >> >             s = con.createStatement();
> >> >             r = s.executeQuery("SELECT data FROM blobs WHERE filename
> >>= '"
> >> >                                + filename +"'");
> >> >             if (r != null) {
> >> >                 while (r.next()) {
> >> >                     System.out.println("We have a result!");
> >> >                     InputStream is = r.getBinaryStream(1);
> >> >                     while ((bytesRead = is.read(buffer)) != -1) {
> >> >                         byteSum += bytesRead;
> >> >                         out.write(buffer, 0, bytesRead);
> >> >                     }
> >> >                     is.close();
> >> >                 }
> >> >             }
> >> >             out.close();
> >> >             System.out.println("bytes written: " + byteSum);
> >> >             con.commit();
> >> >         } catch (SQLException sqle) {
> >> >             System.err.println("Retrieve content: " + sqle.getMessage());
> >> >         } catch (Exception ioe) {
> >> >             System.err.println("Writing stuff: " + ioe.getMessage());
> >> >         }
> >> >     }
> >> >
> >> >     public static void main(String[] args) {
> >> >         BlobTest bt = new BlobTest();
> >> >         bt.store(args[0]);
> >> >         bt.retrieve(args[0]);
> >> >     }
> >> >
> >> > }
> >> >
> >> >
> >> > ------------------------------------------------------------------------
> >> >
> >> >
> >> > ---------------------------(end of broadcast)---------------------------
> >> > TIP 6: Have you searched our list archives?
> >> >
> >> > http://archives.postgresql.org
> >> >
> >>
> >>
> >>----
> >>
> >>
> >
> >>import java.io.*;
> >>import java.util.*;
> >>import java.sql.*;
> >>
> >>
> >>public class BlobTest {
> >>
> >>    private Connection con = null;
> >>
> >>    public BlobTest() {
> >>        try {
> >>            Class.forName("org.postgresql.Driver");
> >>            con = DriverManager.getConnection(
> >>                    "jdbc:postgresql://localhost:5432/files", "blind", "");
> >>            if (con != null) {
> >>               System.out.println("Connected to database system.\n");
> >>            }
> >>        } catch (SQLException e) {
> >>            System.out.println(e.getMessage());
> >>            System.out.println("Could not connect to database system.\n");
> >>        } catch (ClassNotFoundException e) {
> >>            System.out.println("Class not found...:-(\n");
> >>        }
> >>    }
> >>
> >>    private void store(String filename) {
> >>        PreparedStatement ps = null;
> >>        ResultSet r = null;
> >>        File file = new File(filename);
> >>        System.out.println("file.name:" + file.getName() + "file.length:"+file.length());
> >>        try {
> >>            FileInputStream fis = new FileInputStream(file);
> >>            con.setAutoCommit(false);
> >>            ps = con.prepareStatement(
> >>                "INSERT INTO blobs VALUES (?, ?)");
> >>            ps.setString(1, filename);
> >>            System.out.println("File.length(int): " + (int) file.length());
> >>            ps.setBinaryStream(2, fis, (int) file.length());
> >>            ps.executeUpdate();
> >>            ps.close();
> >>            fis.close();
> >>            con.commit();
> >>        } catch (SQLException sqle) {
> >>            System.err.println("Store content: " + sqle.getMessage());
> >>        } catch (IOException ioe) {
> >>        }
> >>    }
> >>
> >>    private void retrieve(String filename) {
> >>        Statement s = null;
> >>        ResultSet r = null;
> >>        int byteSum = 0;
> >>        int bytesRead = 0;
> >>        byte[] buffer = new byte[8 * 1924];
> >>        try {
> >>            System.out.println("Trying to write: " +filename + "test");
> >>            FileOutputStream out = new FileOutputStream(filename + "test");
> >>            con.setAutoCommit(false);
> >>            s = con.createStatement();
> >>            r = s.executeQuery("SELECT data FROM blobs WHERE filename = '"
> >>                               + filename +"'");
> >>            if (r != null) {
> >>                while (r.next()) {
> >>                    System.out.println("We have a result!");
> >>                    InputStream is = r.getBinaryStream(1);
> >>                    while ((bytesRead = is.read(buffer)) != -1) {
> >>                        byteSum += bytesRead;
> >>                        out.write(buffer, 0, bytesRead);
> >>                    }
> >>                    is.close();
> >>                }
> >>            }
> >>            out.close();
> >>            System.out.println("bytes written: " + byteSum);
> >>            con.commit();
> >>        } catch (SQLException sqle) {
> >>            System.err.println("Retrieve content: " + sqle.getMessage());
> >>        } catch (Exception ioe) {
> >>            System.err.println("Writing stuff: " + ioe.getMessage());
> >>        }
> >>    }
> >>
> >>    public static void main(String[] args) {
> >>        BlobTest bt = new BlobTest();
> >>        bt.store(args[0]);
> >>        bt.retrieve(args[0]);
> >>    }
> >>
> >>}
> >>----
> >>
> >>
> >
> >>import java.io.*;
> >>import java.util.*;
> >>import java.sql.*;
> >>
> >>
> >>public class BlobTest2 {
> >>
> >>    private Connection con = null;
> >>
> >>    public BlobTest2() {
> >>        try {
> >>            Class.forName("org.postgresql.Driver");
> >>            con = DriverManager.getConnection(
> >>                    "jdbc:postgresql://localhost:5432/files?compatible=7.1", "blind", "");
> >>            if (con != null) {
> >>               System.out.println("Connected to database system.\n");
> >>            }
> >>        } catch (SQLException e) {
> >>            System.out.println(e.getMessage());
> >>            System.out.println("Could not connect to database system.\n");
> >>        } catch (ClassNotFoundException e) {
> >>            System.out.println("Class not found...:-(\n");
> >>        }
> >>    }
> >>
> >>    private void store(String filename) {
> >>        PreparedStatement ps = null;
> >>        ResultSet r = null;
> >>        File file = new File(filename);
> >>        System.out.println("file.name:" + file.getName() + "file.length:"+file.length());
> >>        try {
> >>            FileInputStream fis = new FileInputStream(file);
> >>            con.setAutoCommit(false);
> >>            ps = con.prepareStatement(
> >>                "INSERT INTO blobs2 VALUES (?, ?)");
> >>            ps.setString(1, filename);
> >>            System.out.println("File.length(int): " + (int) file.length());
> >>            ps.setBinaryStream(2, fis, (int) file.length());
> >>            ps.executeUpdate();
> >>            ps.close();
> >>            fis.close();
> >>            con.commit();
> >>        } catch (SQLException sqle) {
> >>            System.err.println("Store content: " + sqle.getMessage());
> >>        } catch (IOException ioe) {
> >>        }
> >>    }
> >>
> >>    private void retrieve(String filename) {
> >>        Statement s = null;
> >>        ResultSet r = null;
> >>        int byteSum = 0;
> >>        int bytesRead = 0;
> >>        byte[] buffer = new byte[8 * 1924];
> >>        try {
> >>            System.out.println("Trying to write: " +filename + "test");
> >>            FileOutputStream out = new FileOutputStream(filename + "test");
> >>            con.setAutoCommit(false);
> >>            s = con.createStatement();
> >>            r = s.executeQuery("SELECT data FROM blobs2 WHERE filename = '"
> >>                               + filename +"'");
> >>            if (r != null) {
> >>                while (r.next()) {
> >>                    System.out.println("We have a result!");
> >>                    InputStream is = r.getBinaryStream(1);
> >>                    while ((bytesRead = is.read(buffer)) != -1) {
> >>                        byteSum += bytesRead;
> >>                        out.write(buffer, 0, bytesRead);
> >>                    }
> >>                    is.close();
> >>                }
> >>            }
> >>            out.close();
> >>            System.out.println("bytes written: " + byteSum);
> >>            con.commit();
> >>        } catch (SQLException sqle) {
> >>            System.err.println("Retrieve content: " + sqle.getMessage());
> >>        } catch (Exception ioe) {
> >>            System.err.println("Writing stuff: " + ioe.getMessage());
> >>        }
> >>    }
> >>
> >>    public static void main(String[] args) {
> >>        BlobTest2 bt = new BlobTest2();
> >>        bt.store(args[0]);
> >>        bt.retrieve(args[0]);
> >>    }
> >>
> >>}
> >>----
> >>
> >>
> >
> >>---------------------------(end of broadcast)---------------------------
> >>TIP 2: you can get off all lists at once with the unregister command
> >>    (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
> >>
>
>
--
Cheers,
Mike

--
Mike Cannon-Brookes :: mike@atlassian.com

Atlassian :: http://www.atlassian.com
     Supporting YOUR J2EE World



pgsql-jdbc by date:

Previous
From: Barry Lind
Date:
Subject: Re: [Fwd: Re: Problems with truncated BLOB]
Next
From: Per-Olof Norén
Date:
Subject: Re: CallableStatements