Commit 02faee5e authored by Peter Mount's avatar Peter Mount

ImageViewer transaction fixes

parent 2937bf0a
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 - Fixed the Makefile so that postgresql.jar is built everytime
the jdbc1 or jdbc2 rules are called. the jdbc1 or jdbc2 rules are called.
- Fixed the threadsafe example. It had problems with autocommit - 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!) - Rewrote the README file (the old one was 18 months old!)
- Added @deprecated tags to org.postgresql.jdbc2.ResultSet - Added @deprecated tags to org.postgresql.jdbc2.ResultSet
to clear some warnings issued during compilation. to clear some warnings issued during compilation.
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# Makefile for Java JDBC interface # Makefile for Java JDBC interface
# #
# IDENTIFICATION # 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: ...@@ -68,10 +68,14 @@ msg:
@echo @echo
@echo ------------------------------------------------------------ @echo ------------------------------------------------------------
@echo To build the examples, type: @echo To build the examples, type:
@echo " make examples" @echo "JDBC1: make examples"
@echo "JDBC2: make examples2"
@echo @echo
@echo "To build the CORBA example (requires Java2):" @echo "To build the CORBA example (requires Java2):"
@echo " make corba" @echo " make corba"
@echo
@echo "To make the tests, type:"
@echo " make tests"
@echo ------------------------------------------------------------ @echo ------------------------------------------------------------
@echo @echo
...@@ -214,12 +218,18 @@ $(PGBASE)/util/UnixCrypt.class: $(PGBASE)/util/UnixCrypt.java ...@@ -214,12 +218,18 @@ $(PGBASE)/util/UnixCrypt.class: $(PGBASE)/util/UnixCrypt.java
####################################################################### #######################################################################
# These classes are in the example directory, and form the examples # These classes are in the example directory, and form the examples
EX= example/basic.class \ EX= example/basic.class \
example/blobtest.class \
example/datestyle.class \
example/psql.class \ example/psql.class \
example/ImageViewer.class \ example/ImageViewer.class
example/metadata.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 example/threadsafe.class
# Non functional/obsolete examples
# example/datestyle.class \
# example/Objects.class # example/Objects.class
# This rule builds the examples # This rule builds the examples
...@@ -229,20 +239,31 @@ examples: postgresql.jar $(EX) ...@@ -229,20 +239,31 @@ examples: postgresql.jar $(EX)
@echo @echo
@echo For instructions on how to use them, simply run them. For example: @echo For instructions on how to use them, simply run them. For example:
@echo @echo
@echo " java example.blobtest" @echo " java example.basic"
@echo @echo
@echo This would display instructions on how to run the example. @echo This would display instructions on how to run the example.
@echo ------------------------------------------------------------ @echo ------------------------------------------------------------
@echo Available examples: @echo Available examples:
@echo @echo
@echo " example.basic Basic JDBC useage" @echo " example.basic Basic JDBC useage"
@echo " example.blobtest Binary Large Object tests"
@echo " example.datestyle Shows how datestyles are handled" @echo " example.datestyle Shows how datestyles are handled"
@echo " example.ImageViewer Example application storing images" @echo " example.ImageViewer Example application storing images"
@echo " example.psql Simple java implementation of psql" @echo " example.psql Simple java implementation of psql"
@echo " example.Objects Demonstrates Object Serialisation"
@echo " " @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.metadata Tests various metadata methods"
@echo " example.threadsafe Tests the driver's thread safety" @echo " example.threadsafe Tests the driver's thread safety"
@echo ------------------------------------------------------------ @echo ------------------------------------------------------------
......
...@@ -186,15 +186,11 @@ public class ImageViewer implements ItemListener ...@@ -186,15 +186,11 @@ public class ImageViewer implements ItemListener
Class.forName("org.postgresql.Driver"); Class.forName("org.postgresql.Driver");
// Connect to database // Connect to database
System.out.println("Connecting to Database URL = " + url);
db = DriverManager.getConnection(url, user, password); db = DriverManager.getConnection(url, user, password);
// Create a statement // Create a statement
stat = db.createStatement(); stat = db.createStatement();
// Set the connection to use transactions
db.setAutoCommit(false);
// Also, get the LargeObjectManager for this connection // Also, get the LargeObjectManager for this connection
lom = ((org.postgresql.Connection)db).getLargeObjectAPI(); lom = ((org.postgresql.Connection)db).getLargeObjectAPI();
...@@ -210,7 +206,7 @@ public class ImageViewer implements ItemListener ...@@ -210,7 +206,7 @@ public class ImageViewer implements ItemListener
public void init() public void init()
{ {
try { try {
db.setAutoCommit(true); //db.setAutoCommit(true);
stat.executeUpdate("create table images (imgname name,imgoid oid)"); stat.executeUpdate("create table images (imgname name,imgoid oid)");
label.setText("Initialised database"); label.setText("Initialised database");
db.commit(); db.commit();
...@@ -219,11 +215,11 @@ public class ImageViewer implements ItemListener ...@@ -219,11 +215,11 @@ public class ImageViewer implements ItemListener
} }
// This must run outside the previous try{} catch{} segment // This must run outside the previous try{} catch{} segment
try { //try {
db.setAutoCommit(true); //db.setAutoCommit(true);
} catch(SQLException ex) { //} catch(SQLException ex) {
label.setText(ex.toString()); //label.setText(ex.toString());
} //}
} }
/** /**
...@@ -283,37 +279,29 @@ public class ImageViewer implements ItemListener ...@@ -283,37 +279,29 @@ public class ImageViewer implements ItemListener
// fetch the large object manager // fetch the large object manager
LargeObjectManager lom = ((org.postgresql.Connection)db).getLargeObjectAPI(); 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 // A temporary buffer - this can be as large as you like
byte buf[] = new byte[2048]; byte buf[] = new byte[2048];
// Open the file // Open the file
System.out.println("Opening file "+dir+"/"+name);
FileInputStream fis = new FileInputStream(new 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 // Now create the large object
System.out.println("creating blob");
int oid = lom.create(); int oid = lom.create();
System.out.println("Opening "+oid);
LargeObject blob = lom.open(oid); LargeObject blob = lom.open(oid);
// Now copy the file into the object. // Now copy the file into the object.
// //
// Note: we dont use write(buf), as the last block is rarely the same // 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. // size as our buffer, so we have to use the amount read.
System.out.println("Importing file");
int s,t=0; int s,t=0;
while((s=fis.read(buf,0,buf.length))>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); blob.write(buf,0,s);
} }
// Close the object // Close the object
System.out.println("Closing blob");
blob.close(); blob.close();
// Now store the entry into the table // Now store the entry into the table
...@@ -323,6 +311,7 @@ public class ImageViewer implements ItemListener ...@@ -323,6 +311,7 @@ public class ImageViewer implements ItemListener
stat = db.createStatement(); stat = db.createStatement();
stat.executeUpdate("insert into images values ('"+name+"',"+oid+")"); stat.executeUpdate("insert into images values ('"+name+"',"+oid+")");
db.commit(); db.commit();
db.setAutoCommit(false);
// Finally refresh the names list, and display the current image // Finally refresh the names list, and display the current image
ImageViewer.this.refreshList(); ImageViewer.this.refreshList();
...@@ -370,26 +359,28 @@ public class ImageViewer implements ItemListener ...@@ -370,26 +359,28 @@ public class ImageViewer implements ItemListener
public void removeImage() public void removeImage()
{ {
try { try {
//
// Delete any large objects for the current name // 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+"'"); ResultSet rs = stat.executeQuery("select imgoid from images where imgname='"+currentImage+"'");
if(rs!=null) { if(rs!=null) {
// Even though there should only be one image, we still have to // Even though there should only be one image, we still have to
// cycle through the ResultSet // cycle through the ResultSet
while(rs.next()) { while(rs.next()) {
System.out.println("Got oid "+rs.getInt(1));
lom.delete(rs.getInt(1)); lom.delete(rs.getInt(1));
System.out.println("Import complete");
} }
} }
rs.close(); rs.close();
// Finally delete any entries for that name // Finally delete any entries for that name
stat.executeUpdate("delete from images where imgname='"+currentImage+"'"); stat.executeUpdate("delete from images where imgname='"+currentImage+"'");
db.commit();
label.setText(currentImage+" deleted"); label.setText(currentImage+" deleted");
currentImage=null; currentImage=null;
db.commit();
refreshList(); refreshList();
} catch(SQLException ex) { } catch(SQLException ex) {
label.setText(ex.toString()); label.setText(ex.toString());
...@@ -404,21 +395,30 @@ public class ImageViewer implements ItemListener ...@@ -404,21 +395,30 @@ public class ImageViewer implements ItemListener
public void displayImage(String name) public void displayImage(String name)
{ {
try { 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+"'"); ResultSet rs = stat.executeQuery("select imgoid from images where imgname='"+name+"'");
if(rs!=null) { if(rs!=null) {
// Even though there should only be one image, we still have to // Even though there should only be one image, we still have to
// cycle through the ResultSet // cycle through the ResultSet
while(rs.next()) { while(rs.next()) {
System.out.println("Got oid "+rs.getInt(1));
canvas.setImage(canvas.getToolkit().createImage(rs.getBytes(1))); canvas.setImage(canvas.getToolkit().createImage(rs.getBytes(1)));
System.out.println("Import complete");
label.setText(currentImage = name); label.setText(currentImage = name);
} }
} }
rs.close(); rs.close();
} catch(SQLException ex) { } catch(SQLException ex) {
label.setText(ex.toString()); label.setText(ex.toString());
} finally {
try {
db.setAutoCommit(true);
} catch(SQLException ex2) {
}
} }
} }
...@@ -454,6 +454,7 @@ public class ImageViewer implements ItemListener ...@@ -454,6 +454,7 @@ public class ImageViewer implements ItemListener
frame.setLayout(new BorderLayout()); frame.setLayout(new BorderLayout());
ImageViewer viewer = new ImageViewer(frame,args[0],args[1],args[2]); ImageViewer viewer = new ImageViewer(frame,args[0],args[1],args[2]);
frame.pack(); frame.pack();
frame.setLocation(0,50);
frame.setVisible(true); frame.setVisible(true);
} catch(Exception ex) { } catch(Exception ex) {
System.err.println("Exception caught.\n"+ex); System.err.println("Exception caught.\n"+ex);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment