]> granicus.if.org Git - postgresql/commitdiff
ImageViewer transaction fixes
authorPeter Mount <peter@retep.org.uk>
Fri, 5 May 2000 07:35:29 +0000 (07:35 +0000)
committerPeter Mount <peter@retep.org.uk>
Fri, 5 May 2000 07:35:29 +0000 (07:35 +0000)
src/interfaces/jdbc/CHANGELOG
src/interfaces/jdbc/Makefile
src/interfaces/jdbc/example/ImageViewer.java

index c6b1d16948ffc1401066b4978d6686e9d6879baf..0b09eb3ba099c08ce9b49ada3419085ee80ed9b8 100644 (file)
@@ -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.
index 847acbad1e7201af4d1f8b0c5ecdc394c6326d68..340c7bc7664672de944b6a8f4e5abbb9440d82e3 100644 (file)
@@ -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 ------------------------------------------------------------
index 9a273a5506455334c80768c19ab749799ad01e83..80581f795060fec6a45b3181b6245c699fe00915 100644 (file)
@@ -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);