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

From Barry Lind
Subject Re: [Fwd: Re: [Fwd: Re: Problems with truncated BLOB]]
Date
Msg-id 3C03D32F.4030804@xythos.com
Whole thread Raw
In response to [Fwd: Re: [Fwd: Re: Problems with truncated BLOB]]  (Barry Lind <barry@xythos.com>)
List pgsql-jdbc
Mike,

I am really at a loss to explain what is going on here.  I just
resurected a 7.1.2 database and ran the test and it worked fine (for
both the bytea, and LargeObject versions using the 7.2 driver).

thanks,
--Barry

Mike Cannon-Brookes wrote:

> 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)
>>>>
>>>>
>>



pgsql-jdbc by date:

Previous
From: Francesco Lunelli
Date:
Subject: jdbc problems with tomcat
Next
From: "Mark Muffett"
Date:
Subject: Re: jdbc problems with tomcat