From 02faee5eaa0ed93364446f5c186fa6904899dca6 Mon Sep 17 00:00:00 2001 From: Peter Mount Date: Fri, 5 May 2000 07:35:29 +0000 Subject: [PATCH] ImageViewer transaction fixes --- src/interfaces/jdbc/CHANGELOG | 8 ++- src/interfaces/jdbc/Makefile | 41 ++++++++++---- src/interfaces/jdbc/example/ImageViewer.java | 57 ++++++++++---------- 3 files changed, 66 insertions(+), 40 deletions(-) diff --git a/src/interfaces/jdbc/CHANGELOG b/src/interfaces/jdbc/CHANGELOG index c6b1d16948..0b09eb3ba0 100644 --- a/src/interfaces/jdbc/CHANGELOG +++ b/src/interfaces/jdbc/CHANGELOG @@ -1,9 +1,13 @@ -Wed May 02 16:47:00 BST 2000 petermount@it.maidstone.gov.uk +Thu May 04 11:38:00 BST 2000 petermount@it.maidstone.gov.uk + - Corrected incorrect date in CHANGELOG + - Fixed the ImageViewer example + +Wed May 03 16:47:00 BST 2000 petermount@it.maidstone.gov.uk - Fixed the Makefile so that postgresql.jar is built everytime the jdbc1 or jdbc2 rules are called. - Fixed the threadsafe example. It had problems with autocommit -Wed May 02 14:32:00 BST 2000 petermount@it.maidstone.gov.uk +Wed May 03 14:32:00 BST 2000 petermount@it.maidstone.gov.uk - Rewrote the README file (the old one was 18 months old!) - Added @deprecated tags to org.postgresql.jdbc2.ResultSet to clear some warnings issued during compilation. diff --git a/src/interfaces/jdbc/Makefile b/src/interfaces/jdbc/Makefile index 847acbad1e..340c7bc766 100644 --- a/src/interfaces/jdbc/Makefile +++ b/src/interfaces/jdbc/Makefile @@ -4,7 +4,7 @@ # Makefile for Java JDBC interface # # IDENTIFICATION -# $Id: Makefile,v 1.20 2000/05/03 15:58:08 peter Exp $ +# $Id: Makefile,v 1.21 2000/05/05 07:35:29 peter Exp $ # #------------------------------------------------------------------------- @@ -68,10 +68,14 @@ msg: @echo @echo ------------------------------------------------------------ @echo To build the examples, type: - @echo " make examples" + @echo "JDBC1: make examples" + @echo "JDBC2: make examples2" @echo @echo "To build the CORBA example (requires Java2):" @echo " make corba" + @echo + @echo "To make the tests, type:" + @echo " make tests" @echo ------------------------------------------------------------ @echo @@ -214,12 +218,18 @@ $(PGBASE)/util/UnixCrypt.class: $(PGBASE)/util/UnixCrypt.java ####################################################################### # These classes are in the example directory, and form the examples EX= example/basic.class \ - example/blobtest.class \ - example/datestyle.class \ example/psql.class \ - example/ImageViewer.class \ - example/metadata.class \ + example/ImageViewer.class + +# These are only valid for JDBC2 +EX2= example/blobtest.class + +# These are really test classes not true examples +TESTS= example/metadata.class \ example/threadsafe.class + +# Non functional/obsolete examples +# example/datestyle.class \ # example/Objects.class # This rule builds the examples @@ -229,20 +239,31 @@ examples: postgresql.jar $(EX) @echo @echo For instructions on how to use them, simply run them. For example: @echo - @echo " java example.blobtest" + @echo " java example.basic" @echo @echo This would display instructions on how to run the example. @echo ------------------------------------------------------------ @echo Available examples: @echo @echo " example.basic Basic JDBC useage" - @echo " example.blobtest Binary Large Object tests" @echo " example.datestyle Shows how datestyles are handled" @echo " example.ImageViewer Example application storing images" @echo " example.psql Simple java implementation of psql" - @echo " example.Objects Demonstrates Object Serialisation" @echo " " - @echo These are not really examples, but tests various parts of the driver + @echo ------------------------------------------------------------ + @echo + +examples2: $(EX2) examples + @echo "The following JDBC2 only examples have also been built:" + @echo + @echo " example.blobtest Binary Large Object tests" + @echo + @echo ------------------------------------------------------------ + @echo + +tests: $(TESTS) + @echo ------------------------------------------------------------ + @echo The following tests have been built: @echo " example.metadata Tests various metadata methods" @echo " example.threadsafe Tests the driver's thread safety" @echo ------------------------------------------------------------ diff --git a/src/interfaces/jdbc/example/ImageViewer.java b/src/interfaces/jdbc/example/ImageViewer.java index 9a273a5506..80581f7950 100644 --- a/src/interfaces/jdbc/example/ImageViewer.java +++ b/src/interfaces/jdbc/example/ImageViewer.java @@ -186,15 +186,11 @@ public class ImageViewer implements ItemListener Class.forName("org.postgresql.Driver"); // Connect to database - System.out.println("Connecting to Database URL = " + url); db = DriverManager.getConnection(url, user, password); // Create a statement stat = db.createStatement(); - // Set the connection to use transactions - db.setAutoCommit(false); - // Also, get the LargeObjectManager for this connection lom = ((org.postgresql.Connection)db).getLargeObjectAPI(); @@ -210,7 +206,7 @@ public class ImageViewer implements ItemListener public void init() { try { - db.setAutoCommit(true); + //db.setAutoCommit(true); stat.executeUpdate("create table images (imgname name,imgoid oid)"); label.setText("Initialised database"); db.commit(); @@ -219,11 +215,11 @@ public class ImageViewer implements ItemListener } // This must run outside the previous try{} catch{} segment - try { - db.setAutoCommit(true); - } catch(SQLException ex) { - label.setText(ex.toString()); - } + //try { + //db.setAutoCommit(true); + //} catch(SQLException ex) { + //label.setText(ex.toString()); + //} } /** @@ -283,37 +279,29 @@ public class ImageViewer implements ItemListener // fetch the large object manager LargeObjectManager lom = ((org.postgresql.Connection)db).getLargeObjectAPI(); - System.out.println("Importing file"); + db.setAutoCommit(false); + // A temporary buffer - this can be as large as you like byte buf[] = new byte[2048]; // Open the file - System.out.println("Opening file "+dir+"/"+name); FileInputStream fis = new FileInputStream(new File(dir,name)); - // Gain access to large objects - System.out.println("Gaining LOAPI"); - // Now create the large object - System.out.println("creating blob"); int oid = lom.create(); - - System.out.println("Opening "+oid); LargeObject blob = lom.open(oid); // Now copy the file into the object. // // Note: we dont use write(buf), as the last block is rarely the same // size as our buffer, so we have to use the amount read. - System.out.println("Importing file"); int s,t=0; while((s=fis.read(buf,0,buf.length))>0) { - System.out.println("Block s="+s+" t="+t);t+=s; + t+=s; blob.write(buf,0,s); } // Close the object - System.out.println("Closing blob"); blob.close(); // Now store the entry into the table @@ -323,6 +311,7 @@ public class ImageViewer implements ItemListener stat = db.createStatement(); stat.executeUpdate("insert into images values ('"+name+"',"+oid+")"); db.commit(); + db.setAutoCommit(false); // Finally refresh the names list, and display the current image ImageViewer.this.refreshList(); @@ -370,26 +359,28 @@ public class ImageViewer implements ItemListener public void removeImage() { try { + // // Delete any large objects for the current name + // + // Note: We don't need to worry about being in a transaction + // here, because we are not opening any blobs, only deleting + // them + // ResultSet rs = stat.executeQuery("select imgoid from images where imgname='"+currentImage+"'"); if(rs!=null) { // Even though there should only be one image, we still have to // cycle through the ResultSet while(rs.next()) { - System.out.println("Got oid "+rs.getInt(1)); lom.delete(rs.getInt(1)); - System.out.println("Import complete"); } } rs.close(); // Finally delete any entries for that name stat.executeUpdate("delete from images where imgname='"+currentImage+"'"); - db.commit(); label.setText(currentImage+" deleted"); currentImage=null; - db.commit(); refreshList(); } catch(SQLException ex) { label.setText(ex.toString()); @@ -404,21 +395,30 @@ public class ImageViewer implements ItemListener public void displayImage(String name) { try { - System.out.println("Selecting oid for "+name); + // + // Now as we are opening and reading a large object we must + // turn on Transactions. This includes the ResultSet.getBytes() + // method when it's used on a field of type oid! + // + db.setAutoCommit(false); + ResultSet rs = stat.executeQuery("select imgoid from images where imgname='"+name+"'"); if(rs!=null) { // Even though there should only be one image, we still have to // cycle through the ResultSet while(rs.next()) { - System.out.println("Got oid "+rs.getInt(1)); canvas.setImage(canvas.getToolkit().createImage(rs.getBytes(1))); - System.out.println("Import complete"); label.setText(currentImage = name); } } rs.close(); } catch(SQLException ex) { label.setText(ex.toString()); + } finally { + try { + db.setAutoCommit(true); + } catch(SQLException ex2) { + } } } @@ -454,6 +454,7 @@ public class ImageViewer implements ItemListener frame.setLayout(new BorderLayout()); ImageViewer viewer = new ImageViewer(frame,args[0],args[1],args[2]); frame.pack(); + frame.setLocation(0,50); frame.setVisible(true); } catch(Exception ex) { System.err.println("Exception caught.\n"+ex);