ImageViewer transaction fixes
This commit is contained in:
parent
2937bf0adf
commit
02faee5eaa
@ -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
|
- 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 @@
|
|||||||
# 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:
|
|||||||
@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
|
|||||||
#######################################################################
|
#######################################################################
|
||||||
# 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)
|
|||||||
@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
|
|||||||
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
|
|||||||
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
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
|||||||
// 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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user