From 02faee5eaa0ed93364446f5c186fa6904899dca6 Mon Sep 17 00:00:00 2001
From: Peter Mount <peter@retep.org.uk>
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 c6b1d16948f..0b09eb3ba09 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 847acbad1e7..340c7bc7664 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 9a273a55064..80581f79506 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);
-- 
GitLab