Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Nov 2001 16:10:02 -0800 (PST)
From:      Dave Glowacki <dglo@hyde.ssec.wisc.edu>
To:        freebsd-ports@FreeBSD.org
Subject:   Re: ports/32223: Port databases/mysql-jdbc-mm is quite outdated 
Message-ID:  <200111300010.fAU0A2h12138@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR ports/32223; it has been noted by GNATS.

From: Dave Glowacki <dglo@hyde.ssec.wisc.edu>
To: Cc: Kees Jan Koster <kjkoster@kjkoster.org>,
	freebsd-gnats-submit@FreeBSD.ORG, znerd@FreeBSD.ORG, java@FreeBSD.ORG
Subject: Re: ports/32223: Port databases/mysql-jdbc-mm is quite outdated 
Date: Thu, 29 Nov 2001 18:04:16 -0600

 I spent the day battling with jdk1.1.8, ant, and javavm and
 finally got a working mysql-jdbc-mm port which builds 2.0.8
 from source.
 
 The battle would have been a bit easier, by the way, if the
 'ant' port was built from source so I didn't have to fetch
 and build it myself in order to debug some 'ant'-related
 problems :-)
 
 After applying the patch you'll need to delete
 files/patch-Makefile as well as all the .orig files.
 
 Here's the patch:
 
 diff -ru mysql-jdbc-mm.old/Makefile mysql-jdbc-mm/Makefile
 --- mysql-jdbc-mm.old/Makefile	Fri Jun  1 06:49:08 2001
 +++ mysql-jdbc-mm/Makefile	Thu Nov 29 17:45:41 2001
 @@ -6,28 +6,58 @@
  #
  
  PORTNAME=	mysql-jdbc-mm
 -PORTVERSION=	1.2c
 +PORTVERSION=	2.0.8
  CATEGORIES=	databases java
 -MASTER_SITES=	http://mmmysql.sourceforge.net/dist/
 -DISTNAME=	mm.mysql.jdbc-${PORTVERSION}
 +MASTER_SITES=	${MASTER_SITE_SOURCEFORGE}
 +MASTER_SITE_SUBDIR=	mmmysql
 +DISTNAME=	mm.mysql-${PORTVERSION}
 +EXTRACT_SUFX=	-you-must-unjar-me.jar
  
  MAINTAINER=	dglo@SSEC.WISC.EDU
  
 -BUILD_DEPENDS=	${LOCALBASE}/jdk1.1.8/bin/javac:${PORTSDIR}/java/jdk
 +BUILD_DEPENDS=	${JAVA_HOME}/bin/javac:${PORTSDIR}/java/jdk13-beta \
 +		ant:${PORTSDIR}/devel/jakarta-ant
 +RUN_DEPENDS=	${JAVA_HOME}/bin/java:${PORTSDIR}/java/jdk13-beta
  
 -ALL_TARGET=	jar
 +JAVA_HOME?=	${PREFIX}/jdk1.3.1
 +
 +EXTRACT_CMD=	${JAVA_HOME}/bin/jar
 +EXTRACT_BEFORE_ARGS=	-xf
 +
 +post-patch:
 +	(cd ${WRKSRC}; mv build.xml build.xml.unpatched; \
 +	 sed -e "s;%%WRKSRC%%;${WRKSRC};g" -e "s;%%PREFIX%%;${PREFIX};g" \
 +		< build.xml.unpatched > build.xml)
 +	(cd ${WRKSRC}; mv j1c j1c.unpatched; \
 +	 sed "s;%%PREFIX%%;${PREFIX};g" < j1c.unpatched > j1c; \
 +	 chmod +x j1c)
 +
 +do-build:
 +	(cd ${WRKSRC}; env JAVA_HOME=${JAVA_HOME} ant clean dist)
 +.if !defined(NOPORTDOCS)
 +	(cd ${WRKSRC}; ${MKDIR} doc; \
 +	 ${JAVA_HOME}/bin/javadoc -d doc -package \
 +	     org.gjt.mm.mysql org.gjt.mm.mysql.jdbc2)
 +.endif
  
  do-install:
  	@${MKDIR} ${PREFIX}/share/java/classes
 -	@${INSTALL_DATA} ${WRKSRC}/mysql_comp.jar ${LOCALBASE}/share/java/classes
 -
 -post-install:
 +	@${INSTALL_DATA} ${WRKDIR}/mm.mysql-${PORTVERSION}.jar \
 +		${PREFIX}/share/java/classes
  .if !defined(NOPORTDOCS)
  	@${MKDIR} ${PREFIX}/share/doc/mysql-jdbc
  	@(cd ${WRKSRC}/doc && ${TAR} -c -f - .) \
  		| (cd ${PREFIX}/share/doc/mysql-jdbc && ${TAR} --unlink -x -f -)
 +.endif
 +
 +post-install:
 +	${ECHO} share/java/classes/mm.mysql-${PORTVERSION}.jar >> ${TMPPLIST}
 +.if !defined(NOPORTDOCS)
  	@(cd ${PREFIX} \
  		&& find share/doc/mysql-jdbc -type f -print >> ${TMPPLIST})
 +	${ECHO} "@dirrm share/java/mysql-jdbc" >> ${TMPPLIST}
  .endif
 +	${ECHO} "@unexec ${RMDIR} %D/share/java/classes 2>/dev/null || true" >> ${TMPPLIST}
 +	${ECHO} "@unexec ${RMDIR} %D/share/java 2>/dev/null || true" >> ${TMPPLIST}
  
  .include <bsd.port.mk>
 diff -ru mysql-jdbc-mm.old/distinfo mysql-jdbc-mm/distinfo
 --- mysql-jdbc-mm.old/distinfo	Sat Apr 29 20:09:57 2000
 +++ mysql-jdbc-mm/distinfo	Tue Nov 27 15:08:43 2001
 @@ -1 +1 @@
 -MD5 (mm.mysql.jdbc-1.2c.tar.gz) = b04aa7f3048c2ebb169ee88ce19a6a4c
 +MD5 (mm.mysql-2.0.8-you-must-unjar-me.jar) = b496f9ad5be7afb21d3f05902b2805a0
 diff -ru mysql-jdbc-mm.old/files/patch-JNDIDataSource.java mysql-jdbc-mm/files/patch-JNDIDataSource.java
 --- mysql-jdbc-mm.old/files/patch-JNDIDataSource.java	Thu Nov 29 17:40:49 2001
 +++ mysql-jdbc-mm/files/patch-JNDIDataSource.java	Thu Nov 29 17:24:38 2001
 @@ -0,0 +1,91 @@
 +--- testsuite/JNDIDataSource.java.orig	Thu Nov 29 16:37:03 2001
 ++++ testsuite/JNDIDataSource.java	Thu Nov 29 17:16:24 2001
 +@@ -4,8 +4,6 @@
 + 
 + import java.sql.*;
 + import java.util.*;
 +-import javax.naming.*;
 +-import javax.sql.*;
 + 
 + /**
 +  * You cannot run this example unless you have the JNDI and JDBC 2.0 standard
 +@@ -42,52 +40,6 @@
 + 	    return;
 + 	}	    
 + 	try {
 +-	    Context ctx = new InitialContext();
 +-
 +-	    ctx.addToEnvironment(Context.INITIAL_CONTEXT_FACTORY,
 +-				 "com.sun.jndi.fscontext.RefFSContextFactory");
 +-	    DataSource ds = (DataSource)ctx.lookup("/tmp/jdbc/test");
 +-	    Connection con = ds.getConnection("root", "eggs/ez");
 +-	    Statement stmt;
 +-	    ResultSet rs;
 +-
 +-	    System.out.println("Connection is: " + con);
 +-	    
 +-	    /*
 +-	    stmt = con.createStatement();
 +-	    rs = stmt.executeQuery("SELECT test_id, test_int, test_date, " +
 +-				   "test_char, test_val " +
 +-				   "FROM test ORDER BY test_id");
 +-	    System.out.println("Got results:");
 +-	    while( rs.next() ) {
 +-		int i = rs.getInt(1);
 +-		String s, comma = "";
 +-		java.util.Date d;
 +-
 +-		System.out.print("\tkey: " + i + "(");
 +-		i = rs.getInt(2);
 +-		if( !rs.wasNull() ) {
 +-		    System.out.print("test_int=" + i);
 +-		    comma = ",";
 +-		}
 +-		d = rs.getDate(3);
 +-		if( !rs.wasNull() ) {
 +-		    System.out.print(comma + "test_date=" + d);
 +-		    comma = ",";
 +-		}
 +-		s = rs.getString(4);
 +-		if( !rs.wasNull() ) {
 +-		    System.out.print(comma + "test_char='" + s + "'");
 +-		    comma = ",";
 +-		}
 +-		s = rs.getString(5);
 +-		if( !rs.wasNull() ) {
 +-		    System.out.print(comma + "test_val='" + s + "'");
 +-		}
 +-		System.out.println(")");
 +-	    }
 +-	    */
 +-	    con.close();
 + 	    System.out.println("Done.");
 + 	}
 + 	catch( Exception e ) {
 +@@ -103,25 +55,7 @@
 +      */
 + 
 +     static public void registerDataSource() throws Exception {
 +-	org.gjt.mm.mysql.MysqlDataSource ds;
 +-	Context ctx;
 +-	
 +-	Hashtable env = new Hashtable();
 +-	env.put(Context.INITIAL_CONTEXT_FACTORY,
 +-		"com.sun.jndi.fscontext.RefFSContextFactory");
 +-	ctx = new InitialContext(env);
 +-	System.out.println("Context is: " + ctx);
 +-
 +-	ds = new org.gjt.mm.mysql.MysqlDataSource();
 +-
 +-	System.out.println("DataSource is: " + ds);
 +-
 +-	ds.setServerName("localhost");
 +-	ds.setDatabaseName("test");
 +-	ds.setUser("root");
 +-	ds.setPassword("eggs/ez");
 +-	ctx.bind("/tmp/jdbc/test", ds);
 +-	ctx.close();
 ++	throw new Exception("Not implemented");
 +     }
 + }
 +   
 Only in mysql-jdbc-mm.old/files: patch-Makefile
 diff -ru mysql-jdbc-mm.old/files/patch-MysqlDataSource.java mysql-jdbc-mm/files/patch-MysqlDataSource.java
 --- mysql-jdbc-mm.old/files/patch-MysqlDataSource.java	Thu Nov 29 17:40:49 2001
 +++ mysql-jdbc-mm/files/patch-MysqlDataSource.java	Thu Nov 29 13:50:40 2001
 @@ -0,0 +1,50 @@
 +--- org/gjt/mm/mysql/MysqlDataSource.java.orig	Thu Nov 29 12:03:53 2001
 ++++ org/gjt/mm/mysql/MysqlDataSource.java	Thu Nov 29 12:13:57 2001
 +@@ -27,19 +27,15 @@
 + import java.io.*;
 + import java.sql.*;
 + import java.util.Properties;
 +-import javax.naming.*;
 +-import javax.sql.DataSource;
 + 
 + import org.gjt.mm.mysql.xa.XADataSourceImpl;
 + 
 + /**
 +- * A JNDI DataSource for a Mysql JDBC connection
 ++ * Unsupported class.
 +  */
 + 
 + public class MysqlDataSource extends XADataSourceImpl
 +-    implements DataSource, 
 +-  	       Referenceable, 
 +-	       Serializable 
 ++    implements Serializable 
 + {
 +     /**
 +      * The driver to create connections with
 +@@ -187,25 +183,6 @@
 +     public int getPort() 
 +     {
 + 	return _port;
 +-    }
 +-
 +-    /**
 +-     * Required method to support this class as a <CODE>Referenceable</CODE>.
 +-     */
 +-
 +-    public Reference getReference() throws NamingException 
 +-    {
 +-	String FactoryName = "org.gjt.mm.mysql.MysqlDataSourceFactory";
 +-
 +-	Reference Ref = new Reference(getClass().getName(), FactoryName, null);
 +-
 +-	Ref.add(new StringRefAddr("user", getUser()));
 +-	Ref.add(new StringRefAddr("password", _Password));
 +-	Ref.add(new StringRefAddr("serverName", getServerName()));
 +-	Ref.add(new StringRefAddr("port", "" + getPort()));
 +-	Ref.add(new StringRefAddr("databaseName", getDatabaseName()));
 +-
 +-	return Ref;
 +     }
 + 
 +     /**
 diff -ru mysql-jdbc-mm.old/files/patch-MysqlDataSourceFactory.java mysql-jdbc-mm/files/patch-MysqlDataSourceFactory.java
 --- mysql-jdbc-mm.old/files/patch-MysqlDataSourceFactory.java	Thu Nov 29 17:40:49 2001
 +++ mysql-jdbc-mm/files/patch-MysqlDataSourceFactory.java	Thu Nov 29 13:50:45 2001
 @@ -0,0 +1,48 @@
 +--- org/gjt/mm/mysql/MysqlDataSourceFactory.java.orig	Thu Nov 29 12:03:53 2001
 ++++ org/gjt/mm/mysql/MysqlDataSourceFactory.java	Thu Nov 29 12:14:49 2001
 +@@ -25,14 +25,12 @@
 + package org.gjt.mm.mysql;
 + 
 + import java.util.Hashtable;
 +-import javax.naming.*;
 +-import javax.naming.spi.ObjectFactory;
 + 
 + /**
 +  * Factory class for MysqlDataSource objects
 +  */
 + 
 +-public class MysqlDataSourceFactory implements ObjectFactory 
 ++public class MysqlDataSourceFactory
 + {
 +     /**
 +      * The class name for a standard Mysql DataSource.
 +@@ -41,29 +39,4 @@
 +     protected final String DataSourceClassName = 
 + 	"org.gjt.mm.mysql.MysqlDataSource";
 + 
 +-  
 +-    public Object getObjectInstance(Object RefObj, Name Nm, Context Ctx,
 +-				    Hashtable Env) throws Exception 
 +-    {
 +-	Reference Ref = (Reference)RefObj;
 +-	
 +-	if (Ref.getClassName().equals(DataSourceClassName)) {
 +-	    MysqlDataSource MDS = new MysqlDataSource();
 +-
 +-	    int port_no = 1306;
 +-	    
 +-	    port_no = Integer.parseInt((String)Ref.get("port").getContent());
 +-	    MDS.setPort(port_no);
 +-
 +-	    MDS.setUser((String)Ref.get("user").getContent());
 +-	    MDS.setPassword((String)Ref.get("password").getContent());
 +-	    MDS.setServerName((String)Ref.get("serverName").getContent());
 +-	    MDS.setDatabaseName((String)Ref.get("databaseName").getContent());
 +-	 
 +-	    return MDS;
 +-	}
 +-	else { // We can't create an instance of the reference
 +-	    return null;
 +-	}
 +-    }
 + }
 diff -ru mysql-jdbc-mm.old/files/patch-TxConnection.java mysql-jdbc-mm/files/patch-TxConnection.java
 --- mysql-jdbc-mm.old/files/patch-TxConnection.java	Thu Nov 29 17:40:49 2001
 +++ mysql-jdbc-mm/files/patch-TxConnection.java	Tue Nov 27 17:37:55 2001
 @@ -0,0 +1,35 @@
 +--- org/gjt/mm/mysql/xa/TxConnection.java.orig	Tue Nov 27 17:36:46 2001
 ++++ org/gjt/mm/mysql/xa/TxConnection.java	Tue Nov 27 17:37:34 2001
 +@@ -48,31 +48,18 @@
 + 
 + 
 + import java.sql.Connection;
 +-import javax.transaction.xa.Xid;
 + 
 + 
 + /**
 +- * Describes an open connection associated with a transaction. When a
 +- * transaction is opened for a connection, this record is created for
 +- * the connection. It indicates the underlying JDBC connection and
 +- * transaction Xid. Multiple XA connection that fall under the same
 +- * transaction Xid will share the same TxConnection object.
 ++ * Unsupported class.
 +  *
 +  *
 +  * @author <a href="arkin@exoffice.com">Assaf Arkin</a>
 +  * @version 1.0
 +- * @see Xid
 +  * @see XAConnectionImpl
 +  */
 + final class TxConnection
 + {
 +-    
 +-    
 +-    /**
 +-     * The Xid of the transactions. Connections that are not
 +-     * associated with a transaction are not represented here.
 +-     */
 +-    Xid                        xid;
 +     
 +     
 +     /**
 diff -ru mysql-jdbc-mm.old/files/patch-XAConnectionImpl.java mysql-jdbc-mm/files/patch-XAConnectionImpl.java
 --- mysql-jdbc-mm.old/files/patch-XAConnectionImpl.java	Thu Nov 29 17:40:49 2001
 +++ mysql-jdbc-mm/files/patch-XAConnectionImpl.java	Tue Nov 27 17:38:46 2001
 @@ -0,0 +1,659 @@
 +--- org/gjt/mm/mysql/xa/XAConnectionImpl.java.orig	Tue Nov 27 17:38:04 2001
 ++++ org/gjt/mm/mysql/xa/XAConnectionImpl.java	Tue Nov 27 17:38:20 2001
 +@@ -50,40 +50,12 @@
 + import java.sql.Connection;
 + import java.sql.SQLException;
 + import java.util.Vector;
 +-import javax.sql.XAConnection;
 +-import javax.sql.PooledConnection;
 +-import javax.sql.ConnectionEvent;
 +-import javax.sql.ConnectionEventListener;
 +-import javax.transaction.RollbackException;
 +-import javax.transaction.xa.XAResource;
 +-import javax.transaction.xa.Xid;
 +-import javax.transaction.xa.XAException;
 + 
 + 
 + /**
 +- * Implements an X/A connection that can be pooled and managed from
 +- * inside a transaction monitor. This is the XA connection returned
 +- * to the application server from the {@link XADataSourceImpl} and
 +- * will be used to obtain {@link ClientConnection} for the
 +- * application.
 +- * <p>
 +- * If the transaction is managed through the JDBC interface, this
 +- * connection will reference the underlying JDBC connection directly.
 +- * If this resource is enlisted with a global transaction through
 +- * the {@link XAResource} interface, it will reference a transactional
 +- * connection, or {@link TxConnection}. Such a connection may be
 +- * shared by two or more XA connections enlisted with the same
 +- * transaction.
 +- *
 +- *
 +- * @author <a href="arkin@exoffice.com">Assaf Arkin</a>
 +- * @version 1.0
 +- * @see ClientConnection
 +- * @see ConnectionEventListener
 +- * @see TxConnection
 ++ * Unsupported class.
 +  */
 + public final class XAConnectionImpl
 +-    implements XAConnection, XAResource
 + {
 + 
 + 
 +@@ -91,25 +63,12 @@
 +      * This is the underlying JDBC connection represented
 +      * by this pooled connection. This variable may initially be null,
 +      * in which case {@link #getUnderlying} will return a new
 +-     * connection and set this variable. This variable is mutually
 +-     * exclusive with {@link #_txConn} and is always null for
 +-     * connections inside a transaction.
 ++     * connection and set this variable.
 +      */
 +     Connection                          _underlying;
 + 
 + 
 +     /**
 +-     * If this connection is part of a global transaction, this
 +-     * object identifies the transaction. The transaction's
 +-     * underlying JDBC connection is exposed through this object and
 +-     * {@link #_underlying} is null. If this connection is closed,
 +-     * then the connection has been timedout. Commit/rollback will
 +-     * always set this variable to null.
 +-     */
 +-    private TxConnection                _txConn;
 +-
 +-
 +-    /**
 +      * The client connection last handed to the application. If the
 +      * application calls {@link #getConnection} again, we should hand
 +      * out a new client connection and render the previous one closed.
 +@@ -119,14 +78,6 @@
 + 
 + 
 +     /**
 +-     * An event listener can be registered and notified when the
 +-     * client connection has been closed by the application or a
 +-     * fatal error rendered it unuseable.
 +-     */
 +-    private ConnectionEventListener     _listener;
 +-
 +-
 +-    /**
 +      * The resource manager is used to share connections within the
 +      * same transaction.
 +      */
 +@@ -189,47 +140,14 @@
 + 	    if ( _underlying != null ) {
 + 		_underlying.commit();
 + 		_underlying.close();
 +-	    } else if ( _txConn != null ) {
 +-		try {
 +-		    end( _txConn.xid, TMSUCCESS );
 +-		} catch ( XAException except ) { }
 + 	    }
 + 	} finally {
 + 	    _resManager = null;
 + 	    _underlying = null;
 +-	    _txConn = null;
 +-	    _listener = null;
 + 	}
 +     }
 + 
 + 
 +-    public XAResource getXAResource()
 +-    {
 +-	// The connection acts as it's own resource manager
 +-	return this;
 +-    }
 +-
 +-
 +-    public synchronized void addConnectionEventListener( ConnectionEventListener listener )
 +-    {
 +-	if ( listener == null )
 +-	    throw new NullPointerException( "XAConnection: Argument 'listener' is null" );
 +-	if ( _listener != null )
 +-	    throw new IllegalStateException( "XAConnection: Only one listener supported per connection" );
 +-	_listener = listener;
 +-    }
 +-    
 +-    
 +-    public synchronized void removeConnectionEventListener( ConnectionEventListener listener )
 +-    {
 +-	if ( listener == null )
 +-	    throw new NullPointerException( "XAConnection: Argument 'listener' is null" );
 +-	if ( _listener == null || _listener != listener )
 +-	    throw new IllegalStateException( "XAConnection: Listener never registered with this pooled connection" );
 +-	_listener = null;
 +-    }
 +-
 +-
 +     public synchronized java.sql.Connection getConnection()
 + 	throws SQLException
 +     {
 +@@ -254,12 +172,6 @@
 + 	    try {
 + 		_underlying.commit();
 + 	    } catch ( SQLException except ) {
 +-		ConnectionEvent event;
 +-
 +-		if ( _listener != null ) {
 +-		    event = new ConnectionEvent( this, except );
 +-		    _listener.connectionErrorOccurred( event );
 +-		}
 + 	    }
 + 	}
 + 
 +@@ -278,14 +190,12 @@
 +      * Called by {@link ClientConnection} to notify that the application
 +      * has attempted to close the connection. After this call, the client
 +      * connection is no longer useable and this pooled connection can be
 +-     * reused. The event listener is notified immediately.
 ++     * reused.
 +      *
 +      * @param clientId The {@link ClientConnection} identifier
 +      */
 +     synchronized void notifyClose( int clientId )
 +     {
 +-	ConnectionEvent event;
 +-
 + 	// ClientConnection has been closed, we dissociated it from
 + 	// the underlying connection and notify any listener that this
 + 	// pooled connection can be reused.
 +@@ -306,18 +216,9 @@
 + 	    try {
 + 		_underlying.commit();
 + 	    } catch ( SQLException except ) {
 +-		if ( _listener != null ) {
 +-		    event = new ConnectionEvent( this, except );
 +-		    _listener.connectionErrorOccurred( event );
 +-		}
 + 		return;
 + 	    }
 + 	}
 +-	// Notify the listener.
 +-	if ( _listener != null ) {
 +-	    event = new ConnectionEvent( this );
 +-	    _listener.connectionClosed( event );
 +-	}
 +     }
 + 
 + 
 +@@ -332,8 +233,6 @@
 +      */
 +     synchronized void notifyError( int clientId, SQLException except )
 +     {
 +-	ConnectionEvent event;
 +-
 + 	if ( clientId != _clientId )
 + 	    return;
 + 
 +@@ -344,10 +243,6 @@
 + 	    if ( ! ( _underlying instanceof TwoPhaseConnection ) ||
 + 		 ! ( (TwoPhaseConnection) _underlying ).isCriticalError( except ) )
 + 		return;
 +-	    if ( _txConn.conn == null ||
 +-		 ! ( _txConn.conn instanceof TwoPhaseConnection ) ||
 +-		 ! ( (TwoPhaseConnection) _txConn.conn ).isCriticalError( except ) )
 +-		return;
 + 	}
 + 
 + 	// The client connection is no longer useable, the underlying
 +@@ -362,20 +257,7 @@
 + 		// Ignore that, we know there's an error.
 + 	    }
 + 	    _underlying = null;
 +-	} else if ( _txConn != null ) {
 +-	    try {
 +-		end( _txConn.xid, TMFAIL );
 +-	    } catch ( XAException e2 ) {
 +-		// Ignore that, we know there's an error.
 +-	    }
 +-	    _txConn = null;
 + 	} 
 +-
 +-	// Notify the listener.
 +-	if ( _listener != null ) {
 +-	    event = new ConnectionEvent( this, except );
 +-	    _listener.connectionErrorOccurred( event );
 +-	}
 +     }
 + 
 + 
 +@@ -397,409 +279,21 @@
 +     }
 + 
 + 
 +-    public synchronized void start( Xid xid, int flags )
 +-        throws XAException
 +-    {
 +-	// General checks.
 +-	if ( xid == null )
 +-	    throw new XAException( XAException.XAER_INVAL );
 +-	if ( _txConn != null )
 +-	    throw new XAException( XAException.XAER_OUTSIDE );
 +-
 +-	synchronized ( _resManager ) {
 +-	    if ( flags == TMNOFLAGS ) {
 +-		// Starting a new transaction. First, make sure it is
 +-		// not shared with any other connection (need to join
 +-		// for that).
 +-		if ( _resManager.getTxConnection( xid ) != null )
 +-		    throw new XAException( XAException.XAER_DUPID );
 +-
 +-		// Create a new TxConnection to describe this
 +-		// connection in the context of a transaction and
 +-		// register it with the resource manager so it can
 +-		// be shared.
 +-		try {
 +-		    _txConn = new TxConnection();
 +-		    if ( _underlying != null ) {
 +-			_txConn.conn = _underlying;
 +-			_underlying = null;
 +-		    } else
 +-			_txConn.conn = _resManager.newConnection();
 +-		    _txConn.xid = xid;
 +-		    _txConn.count = 1;
 +-		    _txConn.started = System.currentTimeMillis();
 +-		    _txConn.timeout = _txConn.started + ( _resManager.getTransactionTimeout() * 1000 );
 +-		    _resManager.setTxConnection( xid, _txConn );
 +-		} catch ( SQLException except ) {
 +-		    // If error occured at this point, we can only
 +-		    // report it as resource manager error.
 +-		    if ( _resManager.getLogWriter() != null )
 +-			_resManager.getLogWriter().println( "XAConnection: failed to begin a transaction: " + except );
 +-		    throw new XAException( XAException.XAER_RMERR );
 +-		}
 +-
 +-		try {
 +-		    _txConn.conn.setAutoCommit( false );
 +-		    try {
 +-			if ( _resManager.isolationLevel() != Connection.TRANSACTION_NONE )
 +-			    _txConn.conn.setTransactionIsolation( _resManager.isolationLevel() );
 +-		    } catch ( SQLException e ) {
 +-			// The underlying driver might not support this
 +-			// isolation level that we use by default.
 +-		    }
 +-		    if ( _txConn.conn instanceof TwoPhaseConnection )
 +-			( (TwoPhaseConnection) _txConn.conn ).enableSQLTransactions( false );
 +-		} catch ( SQLException except ) {
 +-		    // If error occured at this point, we can only
 +-		    // report it as resource manager error.
 +-		    if ( _resManager.getLogWriter() != null )
 +-			_resManager.getLogWriter().println( "XAConnection: failed to begin a transaction: " + except );
 +-		    throw new XAException( XAException.XAER_RMERR );
 +-		}
 +-	    } else if ( flags == TMJOIN || flags == TMRESUME ) {
 +-		// We are joining another transaction with an
 +-		// existing TxConnection.
 +-		_txConn = _resManager.getTxConnection( xid );
 +-		if ( _txConn == null )
 +-		    throw new XAException( XAException.XAER_INVAL );
 +-
 +-		// Update the number of XAConnections sharing this
 +-		// transaction connection.
 +-		if ( flags == TMJOIN && _txConn.count == 0 )
 +-		    throw new XAException( XAException.XAER_PROTO );
 +-		++_txConn.count;
 +-
 +-		// If we already have an underlying connection (as we can
 +-		// expect to), we should release that underlying connection
 +-		// and make it available to the resource manager.
 +-		if ( _underlying != null ) {
 +-		    _resManager.releaseConnection( _underlying );
 +-		    _underlying = null;
 +-		}
 +-	    } else
 +-		// No other flags supported in start().
 +-		throw new XAException( XAException.XAER_INVAL );
 +-	}
 +-    }
 +-
 +-
 +-    public synchronized void end( Xid xid, int flags )
 +-        throws XAException
 +-    {
 +-	// General checks.
 +-	if ( xid == null )
 +-	    throw new XAException( XAException.XAER_INVAL );
 +-	// Note: we could get end with success or failure even it
 +-	// we were previously excluded from the transaction.
 +-	if ( _txConn == null && flags == TMSUSPEND ) 
 +-	    throw new XAException( XAException.XAER_NOTA );
 +-
 +-	synchronized ( _resManager ) {
 +-	    if ( flags == TMSUCCESS || flags == TMFAIL) {
 +-		// We are now leaving a transaction we started or
 +-		// joined before. We can expect any of prepare/
 +-		// commit/rollback to be called next, so TxConnection
 +-		// is still valid.
 +-
 +-		// If we were suspended from the transaction, we'll
 +-		// join it for the duration of this operation.
 +-		// Make sure the reference count reaches zero by the
 +-		// time we get to prepare.
 +-		if ( _txConn == null ) {
 +-		    _txConn = _resManager.getTxConnection( xid );
 +-		    if ( _txConn == null )
 +-			throw new XAException( XAException.XAER_NOTA );
 +-		} else {
 +-		    if ( _txConn.xid != null && ! _txConn.xid.equals( xid ) )
 +-			throw new XAException( XAException.XAER_NOTA );
 +-		    --_txConn.count;
 +-		}
 +-
 +-		// If transaction failed, we can rollback the
 +-		// transaction and release the underlying connection.
 +-		// We can expect all other resources to recieved the
 +-		// same end notification. We don't expect forget to happen.
 +-		if ( flags == TMFAIL && _txConn.conn != null ) {
 +-		    try {
 +-			if ( _txConn.conn instanceof TwoPhaseConnection )
 +-			    ( (TwoPhaseConnection) _txConn.conn ).enableSQLTransactions( true );
 +-			_txConn.conn.rollback();
 +-			_resManager.releaseConnection( _txConn.conn );
 +-		    } catch ( SQLException except ) {
 +-			// There is a problem with the underlying
 +-			// connection, but it was not added to the poll.
 +-		    }
 +-		    _resManager.setTxConnection( _txConn.xid, null );
 +-		    _txConn.conn = null;
 +-		    _txConn.xid = null;
 +-		}
 +-
 +-		if ( flags == TMSUCCESS) {
 +-		    // We should be looking for a new transaction.
 +-		    // Next thing we might be participating in a new
 +-		    // transaction while the current one is being
 +-		    // rolled back.
 +-		    _txConn = null;
 +-		}
 +-	    } else if ( flags == TMSUSPEND ) {
 +-		// We no longer take part in this transaction.
 +-		// Possibly we'll be asked to resume later on, but
 +-		// right now we have to forget about the transaction
 +-		// and the underlying connection.
 +-		--_txConn.count;
 +-		_txConn = null;
 +-	    } else
 +-		// No other flags supported in end().
 +-		throw new XAException( XAException.XAER_INVAL );
 +-	}
 +-    }
 +-
 +-
 +-    public synchronized void forget( Xid xid )
 +-	throws XAException
 +-    {
 +-	TxConnection txConn;
 +-
 +-	// General checks.
 +-	if ( xid == null )
 +-	    throw new XAException( XAException.XAER_INVAL );
 +-	synchronized ( _resManager ) {
 +-	    // We have to forget about the transaction, meaning the
 +-	    // transaction no longer exists for this or any other
 +-	    // connection. We might be called multiple times.
 +-	    txConn = _resManager.setTxConnection( xid, null );
 +-	    if ( _txConn == txConn )
 +-		_txConn = null;
 +-	    if ( txConn != null ) {
 +-		if ( txConn.conn != null ) {
 +-		    _resManager.releaseConnection( txConn.conn );
 +-		    txConn.conn = null;
 +-		}
 +-		txConn.xid = null;
 +-	    }
 +-	}
 +-    }
 +-
 +-
 +-    public synchronized int prepare( Xid xid )
 +-	throws XAException
 +-    {
 +-	TxConnection txConn;
 +-
 +-	// General checks.
 +-	if ( xid == null )
 +-	    throw new XAException( XAException.XAER_INVAL );
 +-
 +-	synchronized ( _resManager ) {
 +-	    // Technically, prepare may be called for any connection,
 +-	    // not just this one.
 +-	    txConn = _resManager.getTxConnection( xid );
 +-	    if ( txConn == null )
 +-		throw new XAException( XAException.XAER_NOTA );
 +-
 +-	    // This is an error and should never happen. All other
 +-	    // parties in the transaction should have left it before.
 +-	    if ( txConn.count > 0 )
 +-		throw new XAException( XAException.XAER_PROTO );
 +-
 +-	    // If the transaction failed, we have to force a rollback.
 +-	    // We track the case of failure due to a timeout.
 +-	    if ( txConn.timedOut )
 +-		throw new XAException( XAException.XA_RBTIMEOUT );
 +-	    if ( txConn.conn == null )
 +-		throw new XAException( XAException.XA_RBROLLBACK );
 +-
 +-	    // Since there is no preparation mechanism in a generic
 +-	    // JDBC driver, we only test for read-only transaction
 +-	    // but do not commit at this point.
 +-	    try {
 +-		txConn.prepared = true;
 +-		if ( txConn.conn instanceof TwoPhaseConnection ) {
 +-		    // For 2pc connection we ask it to prepare and determine
 +-		    // whether it's commiting or read-only. If a rollback
 +-		    // exception happens, we report it.
 +-		    try {
 +-			if ( ( (TwoPhaseConnection) txConn.conn ).prepare() )
 +-			    return XA_OK;
 +-			else {
 +-			    txConn.readOnly = true;
 +-			    return XA_RDONLY;
 +-			}
 +-		    } catch ( SQLException except ) {
 +-			throw new XAException( XAException.XA_RBROLLBACK );
 +-		    }
 +-		} else {
 +-		    // For standard connection we cannot prepare, we can
 +-		    // only guess if it's read only.
 +-		    if ( txConn.conn.isReadOnly() ) {
 +-			txConn.readOnly = true;
 +-			return XA_RDONLY;
 +-		    }
 +-		    return XA_OK;
 +-		}
 +-	    } catch ( SQLException except ) {
 +-		try {
 +-		    // Fatal error in the connection, kill it.
 +-		    txConn.conn.close();
 +-		} catch ( SQLException e ) { }
 +-		txConn.conn = null;
 +-		if ( _resManager.getLogWriter() != null )
 +-		    _resManager.getLogWriter().println( "XAConnection: failed to commit a transaction: " + except );
 +-		// If we cannot commit the transaction, force a rollback.
 +-		throw new XAException( XAException.XA_RBROLLBACK );
 +-	    }
 +-	}
 +-    }
 +-
 +-
 +-    public Xid[] recover( int flags )
 +-        throws XAException
 +-    {
 +-	synchronized ( _resManager ) {
 +-	    return _resManager.getTxRecover();
 +-	}
 +-    }
 +-
 +-
 +-    public synchronized void commit( Xid xid, boolean onePhase )
 +-        throws XAException
 +-    {
 +-	TxConnection txConn;
 +-
 +-	// General checks.
 +-	if ( xid == null )
 +-	    throw new XAException( XAException.XAER_INVAL );
 +-
 +-	synchronized ( _resManager ) {
 +-	    // Technically, commit may be called for any connection,
 +-	    // not just this one.
 +-	    txConn = _resManager.getTxConnection( xid );
 +-	    if ( txConn == null )
 +-		throw new XAException( XAException.XAER_NOTA );
 +-
 +-	    // If the transaction failed, we have to force
 +-	    // a rollback.
 +-	    if ( txConn.conn == null )
 +-		throw new XAException( XAException.XA_RBROLLBACK );
 +-
 +-	    // If connection has been prepared and is read-only,
 +-	    // nothing to do at this stage.
 +-	    if ( txConn.readOnly )
 +-		return;
 +-
 +-	    // This must be a one-phase commite, or the connection
 +-	    // should have been prepared before.
 +-	    if ( onePhase || txConn.prepared ) {
 +-		try {
 +-		    // Prevent multiple commit attempts.
 +-		    txConn.readOnly = true;
 +-		    if ( txConn.conn instanceof TwoPhaseConnection )
 +-			( (TwoPhaseConnection) txConn.conn ).enableSQLTransactions( true );
 +-		    txConn.conn.commit();
 +-		} catch ( SQLException except ) {
 +-		    try {
 +-			// Unknown error in the connection, better kill it.
 +-			txConn.conn.close();
 +-		    } catch ( SQLException e ) { }
 +-		    txConn.conn = null;
 +-		    if ( _resManager.getLogWriter() != null )
 +-			_resManager.getLogWriter().println( "XAConnection: failed to commit a transaction: " + except );
 +-		    // If we cannot commit the transaction, a heuristic tollback.
 +-		    throw new XAException( XAException.XA_HEURRB );
 +-		}
 +-	    } else {
 +-		// 2pc we should have prepared before.
 +-		if ( ! txConn.prepared )
 +-		    throw new XAException( XAException.XAER_PROTO );
 +-	    }
 +-	}
 +-    }
 +-
 +-
 +-    public synchronized void rollback( Xid xid )
 +-        throws XAException
 +-    {
 +-	TxConnection txConn;
 +-
 +-
 +-	// General checks.
 +-	if ( xid == null )
 +-	    throw new XAException( XAException.XAER_INVAL );
 +-
 +-	synchronized ( _resManager ) {
 +-	    // Technically, rollback may be called for any connection,
 +-	    // not just this one.
 +-	    txConn = _resManager.getTxConnection( xid );
 +-	    if ( txConn == null )
 +-		throw new XAException( XAException.XAER_NOTA );
 +-
 +-	    // If connection has been prepared and is read-only,
 +-	    // nothing to do at this stage. If connection has
 +-	    // been terminated any other way, nothing to do
 +-	    // either.
 +-	    if ( txConn.readOnly || txConn.conn == null  )
 +-		return;
 +-
 +-	    try {
 +-		txConn.prepared = false;
 +-		if ( txConn.conn instanceof TwoPhaseConnection )
 +-		    ( (TwoPhaseConnection) txConn.conn ).enableSQLTransactions( true );
 +-		txConn.conn.rollback();
 +-	    } catch ( SQLException except ) {
 +-		try {
 +-		    // Unknown error in the connection, better kill it.
 +-		    txConn.conn.close();
 +-		} catch ( SQLException e ) { }
 +-		txConn.conn = null;
 +-		if ( _resManager.getLogWriter() != null )
 +-		    _resManager.getLogWriter().println( "XAConnection: failed to rollback a transaction: " + except );
 +-		// If we cannot commit the transaction, a heuristic tollback.
 +-		throw new XAException( XAException.XA_RBROLLBACK );
 +-	    } finally {
 +-		forget( xid );
 +-	    }
 +-	}
 +-    }
 +-
 +-
 +-    public synchronized boolean isSameRM( XAResource xaRes )
 +-	throws XAException
 +-    {
 +-	// Two resource managers are equal if they produce equivalent
 +-	// connection (i.e. same database, same user). If the two are
 +-	// equivalent they would share a transaction by joining.
 +-	if ( xaRes == null || ! ( xaRes instanceof XAConnectionImpl ) )
 +-	    return false;
 +-	if ( _resManager.equals( ( (XAConnectionImpl) xaRes )._resManager ) )
 +-	    return true;
 +-	return false;
 +-    }
 +-
 +-
 +     public synchronized boolean setTransactionTimeout( int seconds )
 +-	throws XAException
 ++	throws Exception
 +     {
 + 	if ( seconds < 0 )
 +-	    throw new XAException( XAException.XAER_INVAL );
 ++	    throw new Exception( "Invalid transaction timeout" );
 + 	// Zero resets to the default for all transactions.
 + 	if ( seconds == 0 )
 + 	    seconds = _resManager.getTransactionTimeout();
 +-	// If a transaction has started, change it's timeout to the new value.
 +-	if ( _txConn != null ) {
 +-	    _txConn.timeout = _txConn.started + ( seconds * 1000 );
 +-	    return true;
 +-	}
 + 	return false;
 +     }
 + 
 + 
 +     public int getTransactionTimeout()
 +     {
 +-	long timeout;
 +-
 +-	if ( _txConn == null )
 +-	    return 0;
 +-	return (int) ( _txConn.timeout - _txConn.started ) / 1000;
 ++	return 0;
 +     }
 + 
 + 
 +@@ -811,7 +305,7 @@
 +      */
 +     boolean insideGlobalTx()
 +     {
 +-	return ( _txConn != null );
 ++	return false;
 +     }
 + 
 + 
 +@@ -834,13 +328,6 @@
 + 	if ( clientId != _clientId )
 + 	    throw new SQLException( "This application connection has been closed" );
 + 
 +-	if ( _txConn != null ) {
 +-	    if ( _txConn.timedOut )
 +-		throw new SQLException( "The transaction has timed out and has been rolledback and closed" );
 +-	    if ( _txConn.conn == null )
 +-		throw new SQLException( "The transaction has been terminated and this connection has been closed" );
 +-	    return _txConn.conn;
 +-	}
 + 	if ( _underlying == null ) {
 + 	    _underlying = _resManager.newConnection();
 + 	    _underlying.setAutoCommit( true );
 diff -ru mysql-jdbc-mm.old/files/patch-XADataSourceImpl.java mysql-jdbc-mm/files/patch-XADataSourceImpl.java
 --- mysql-jdbc-mm.old/files/patch-XADataSourceImpl.java	Thu Nov 29 17:40:49 2001
 +++ mysql-jdbc-mm/files/patch-XADataSourceImpl.java	Tue Nov 27 17:29:30 2001
 @@ -0,0 +1,293 @@
 +--- org/gjt/mm/mysql/xa/XADataSourceImpl.java.orig	Tue Nov 27 15:09:27 2001
 ++++ org/gjt/mm/mysql/xa/XADataSourceImpl.java	Tue Nov 27 17:17:31 2001
 +@@ -56,39 +56,19 @@
 + import java.sql.Connection;
 + import java.sql.SQLException;
 + 
 +-import javax.sql.DataSource;
 +-import javax.sql.PooledConnection;
 +-import javax.sql.ConnectionPoolDataSource;
 +-import javax.sql.XAConnection;
 +-import javax.sql.XADataSource;
 +-import javax.transaction.xa.Xid;
 +-
 +-
 +-
 + /**
 +- * Implements a JDBC 2.0 {@link XADataSource} for any JDBC driver
 +- * with JNDI persistance support. The base implementation is actually
 +- * provided by a different {@link DataSource} class; although this is
 +- * the super class, it only provides the pooling and XA specific
 +- * implementation.
 ++ * Unsupported class.
 +  *
 +  *
 +  * @author <a href="arkin@exoffice.com">Assaf Arkin</a>
 +  * @version 1.0
 +  */
 + public abstract class XADataSourceImpl
 +-    implements DataSource, ConnectionPoolDataSource,
 +-	       XADataSource, Serializable, Runnable
 ++    implements Serializable, Runnable
 + {
 + 
 + 
 +     /**
 +-     * Maps underlying JDBC connections into global transaction Xids.
 +-     */
 +-    private transient Hashtable _txConnections = new Hashtable();
 +-
 +-
 +-    /**
 +      * This is a pool of free underlying JDBC connections. If two
 +      * XA connections are used in the same transaction, the second
 +      * one will make its underlying JDBC connection available to
 +@@ -119,25 +99,6 @@
 + 
 + 
 + 
 +-    /**
 +-     * Implementation details:
 +-     *   If two XAConnections are associated with the same transaction
 +-     *   (one with a start the other with a join) they must use the
 +-     *   same underlying JDBC connection. They lookup the underlying
 +-     *   JDBC connection based on the transaction's Xid in the
 +-     *   originating XADataSource.
 +-     *
 +-     *   Currently the XADataSource must be the exact same object,
 +-     *   this should be changed so all XADataSources that are equal
 +-     *   share a table of all enlisted connections
 +-     *
 +-     *   To test is two connections should fall under the same
 +-     *   transaction we match the resource managers by comparing the
 +-     *   database/user they fall under using a comparison of the
 +-     *   XADataSource properties.
 +-     */
 +-
 +-
 +     public XADataSourceImpl()
 +     {
 + 	super();
 +@@ -152,46 +113,6 @@
 +     }
 + 
 + 
 +-    public XAConnection getXAConnection()
 +-        throws SQLException
 +-    {
 +-	// Construct a new XAConnection with no underlying connection.
 +-	// When a JDBC method requires an underlying connection, one
 +-	// will be created. We don't create the underlying connection
 +-	// beforehand, as it might be coming from an existing
 +-	// transaction.
 +-	return new XAConnectionImpl( this, null );
 +-    } 
 +-
 +-
 +-    public XAConnection getXAConnection( String user, String password )
 +-        throws SQLException
 +-    {
 +-	// Since we create the connection on-demand with newConnection
 +-	// or obtain it from a transaction, we cannot support XA
 +-	// connections with a caller specified user name.
 +-	throw new SQLException( "XAConnection does not support connections with caller specified user name" );
 +-    }
 +-    
 +-    
 +-    public PooledConnection getPooledConnection()
 +-        throws SQLException
 +-    {
 +-	// Construct a new pooled connection and an underlying JDBC
 +-	// connection to go along with it.
 +-	return new XAConnectionImpl( this, getConnection() );
 +-    }
 +-    
 +-    
 +-    public PooledConnection getPooledConnection( String user, String password )
 +-        throws SQLException
 +-    {
 +-	// Construct a new pooled connection and an underlying JDBC
 +-	// connection to go along with it.
 +-	return new XAConnectionImpl( this, getConnection( user, password ) );
 +-    }
 +-
 +-
 +     /**
 +      * Returns the default timeout for all transactions.
 +      */
 +@@ -228,35 +149,6 @@
 +     
 + 
 +     /**
 +-     * Returns an underlying connection for the global transaction,
 +-     * if one has been associated before.
 +-     *
 +-     * @param xid The transaction Xid
 +-     * @return A connection associated with that transaction, or null
 +-     */
 +-    TxConnection getTxConnection( Xid xid )
 +-    {
 +-	return (TxConnection) _txConnections.get( xid );
 +-    }
 +-
 +-
 +-    /**
 +-     * Associates the global transaction with an underlying connection,
 +-     * or dissociate it when null is passed.
 +-     *
 +-     * @param xid The transaction Xid
 +-     * @param conn The connection to associate, null to dissociate
 +-     */
 +-    TxConnection setTxConnection( Xid xid, TxConnection txConn )
 +-    {
 +-	if ( txConn == null )
 +-	    return (TxConnection) _txConnections.remove( xid );
 +-	else
 +-	    return (TxConnection) _txConnections.put( xid, txConn );
 +-    }
 +-
 +-
 +-    /**
 +      * Release an unused connection back to the pool. If an XA
 +      * connection has been asked to join an existing transaction,
 +      * it will no longer use it's own connection and make it available
 +@@ -270,6 +162,9 @@
 +     }
 + 
 + 
 ++    public abstract Connection getConnection() throws SQLException;
 ++
 ++
 +     /**
 +      * Creates a new underlying connection. Used by XA connection
 +      * that lost it's underlying connection when joining a
 +@@ -294,27 +189,6 @@
 + 
 + 
 +     /**
 +-     * XXX Not fully implemented yet and no code to really
 +-     *     test it.
 +-     */
 +-    Xid[] getTxRecover()
 +-    {
 +-	Vector       list;
 +-	Enumeration  enum;
 +-	TxConnection txConn;
 +-
 +-	list = new Vector();
 +-	enum = _txConnections.elements();
 +-	while ( enum.hasMoreElements() ) {
 +-	    txConn = (TxConnection) enum.nextElement();
 +-	    if ( txConn.conn != null && txConn.prepared )
 +-		list.add( txConn.xid );
 +-	}
 +-	return (Xid[]) list.toArray();
 +-    }
 +-
 +-
 +-    /**
 +      * Returns the transaction isolation level to use with all newly
 +      * created transactions, or {@link Connection#TRANSACTION_NONE}
 +      * if using the driver's default isolation level.
 +@@ -330,7 +204,6 @@
 + 	Enumeration  enum;
 + 	int          reduce;
 + 	long         timeout;
 +-	TxConnection txConn;
 + 
 + 	while ( true ) {
 + 	    // Go to sleep for the duration of a transaction
 +@@ -362,62 +235,6 @@
 + 		    }
 + 		}
 + 	    } catch ( Exception except ) { }
 +-		
 +-	    // Look for all connections inside a transaction that
 +-	    // should have timed out by now.
 +-	    timeout = System.currentTimeMillis();
 +-	    enum = _txConnections.elements();
 +-	    while ( enum.hasMoreElements() ) {
 +-		txConn = (TxConnection) enum.nextElement();
 +-		// If the transaction timed out, we roll it back and
 +-		// invalidate it, but do not remove it from the transaction
 +-		// list yet. We wait for the next iteration, minimizing the
 +-		// chance of a NOTA exception.
 +-		if ( txConn.conn == null ) {
 +-		    _txConnections.remove( txConn.xid );
 +-		    // Chose not to use an iterator so we must
 +-		    // re-enumerate the list after removing
 +-		    // an element from it.
 +-		    enum = _txConnections.elements();
 +-		} else if ( txConn.timeout < timeout ) {
 +-		    
 +-		    try {
 +-			Connection underlying;
 +-			
 +-			synchronized ( txConn ) {
 +-			    if ( txConn.conn == null )
 +-				continue;
 +-			    if ( getLogWriter() != null )
 +-				getLogWriter().println( "DataSource " + toString() +
 +-							": Transaction timed out and being aborted: " +
 +-							txConn.xid );
 +-			    // Remove the connection from the transaction
 +-			    // association. XAConnection will now have
 +-			    // no underlying connection and attempt to
 +-			    // create a new one.
 +-			    underlying = txConn.conn;
 +-			    txConn.conn = null;
 +-			    txConn.timedOut = true;
 +-			    
 +-			    // Rollback the underlying connection to
 +-			    // abort the transaction and release the
 +-			    // underlying connection to the pool.
 +-			    try {
 +-				underlying.rollback();
 +-				releaseConnection( underlying );
 +-			    } catch ( SQLException except ) {
 +-				if ( getLogWriter() != null )
 +-				    getLogWriter().println( "DataSource " + toString() +
 +-							    ": Error aborting timed out transaction: " + except );
 +-				try {
 +-				    underlying.close();
 +-				} catch ( SQLException e2 ) { }
 +-			    }
 +-			}
 +-		    } catch ( Exception except ) { }
 +-		    
 +-		}
 +-	    }
 + 	}
 +     }
 + 
 +@@ -426,30 +243,9 @@
 +     public void debug( PrintWriter writer )
 +     {
 + 	Enumeration  enum;
 +-	TxConnection txConn;
 + 	StringBuffer buffer;
 + 
 + 	writer.println( "Debug info for XADataSource:" );
 +-	enum = _txConnections.elements();
 +-	if ( ! enum.hasMoreElements() )
 +-	    writer.println( "Empty" );
 +-	while ( enum.hasMoreElements() ) {
 +-	    buffer = new StringBuffer();
 +-	    txConn = (TxConnection) enum.nextElement();
 +-	    buffer.append( "TxConnection " );
 +-	    if ( txConn.xid != null )
 +-		buffer.append( txConn.xid );
 +-	    if ( txConn.conn != null )
 +-		buffer.append( ' ' ).append( txConn.conn );
 +-	    buffer.append( " count: " ).append( txConn.count );
 +-	    if ( txConn.prepared )
 +-		buffer.append( " prepared" );
 +-	    if ( txConn.timedOut )
 +-		buffer.append( " timed-out" );
 +-	    if ( txConn.readOnly )
 +-		buffer.append( " read-only" );
 +-	    writer.println( buffer.toString() );
 +-	}
 + 	enum = _pool.elements();
 + 	while ( enum.hasMoreElements() )
 + 	    writer.println( "Pooled underlying: " + enum.nextElement().toString() );
 diff -ru mysql-jdbc-mm.old/files/patch-build.xml mysql-jdbc-mm/files/patch-build.xml
 --- mysql-jdbc-mm.old/files/patch-build.xml	Thu Nov 29 17:40:49 2001
 +++ mysql-jdbc-mm/files/patch-build.xml	Thu Nov 29 17:44:27 2001
 @@ -0,0 +1,30 @@
 +--- build.xml.orig	Thu Nov 29 16:34:30 2001
 ++++ build.xml	Thu Nov 29 16:36:25 2001
 +@@ -1,7 +1,7 @@
 + <project name="MM.MySQL" default="dist" basedir=".">
 + 	<property name="version" value="2.0.8"/>
 +-	<property name="java1.1.home" value="d:/jdk1.1.8"/>
 +-	<property name="javac.1.1" value="${java1.1.home}/bin/javac"/>
 ++	<property name="java1.1.home" value="%%PREFIX%%/jdk1.1.8"/>
 ++	<property name="javac.1.1" value="%%WRKSRC%%/j1c"/>
 + 
 + 	
 + 
 +@@ -43,7 +43,7 @@
 + 	<target name="compile-core" depends="init">
 + 		<javac srcdir="./build/mm.mysql-${version}"
 + 			excludes="testsuite/**, org/gjt/mm/mysql/jdbc1/**, org/gjt/mm/mysql/jdbc2/**"
 +-			classpath="./build/mm.mysql-${version};lib/jdbc2_0-stdext.jar;lib/jta-spec1_0_1.jar"
 ++			classpath="./build/mm.mysql-${version}:lib/jdbc2_0-stdext.jar:lib/jta-spec1_0_1.jar"
 + 			debug="on"
 + 		/>
 + 
 +@@ -51,7 +51,7 @@
 + 
 + 	<target name="compile-jdbc1" depends="init, compile-core">
 + 		<exec dir="./build/mm.mysql-${version}/org/gjt/mm/mysql/jdbc1" executable="${javac.1.1}">
 +-			<arg line="-g -classpath ${basedir}/build/mm.mysql-${version};${java1.1.home}/lib/classes.zip *.java"/>
 ++			<arg line="-g -classpath ${basedir}/build/mm.mysql-${version}:${java1.1.home}/lib/classes.zip *.java"/>
 + 		</exec>
 + 	</target>
 + 	
 diff -ru mysql-jdbc-mm.old/files/patch-j1c mysql-jdbc-mm/files/patch-j1c
 --- mysql-jdbc-mm.old/files/patch-j1c	Thu Nov 29 17:40:49 2001
 +++ mysql-jdbc-mm/files/patch-j1c	Thu Nov 29 17:44:08 2001
 @@ -0,0 +1,10 @@
 +--- j1c.orig	Thu Nov 29 16:26:08 2001
 ++++ j1c	Thu Nov 29 16:26:36 2001
 +@@ -0,0 +1,7 @@
 ++#!/bin/sh
 ++
 ++JAVAC_1=%%PREFIX%%/jdk1.1.8/bin/javac
 ++
 ++unset JAVA_HOME LD_LIBRARY_PATH LD_PRELOAD CLASSPATH
 ++
 ++exec "$JAVAC_1" "$@"
 diff -ru mysql-jdbc-mm.old/pkg-plist mysql-jdbc-mm/pkg-plist
 --- mysql-jdbc-mm.old/pkg-plist	Sat Jan 29 16:23:06 2000
 +++ mysql-jdbc-mm/pkg-plist	Wed Nov 28 12:28:16 2001
 @@ -1 +1 @@
 -share/java/classes/mysql_comp.jar
 +
 
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111300010.fAU0A2h12138>