summaryrefslogtreecommitdiff
path: root/src/interfaces/jdbc/org/postgresql/xa/ClientConnection.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/jdbc/org/postgresql/xa/ClientConnection.java')
-rw-r--r--src/interfaces/jdbc/org/postgresql/xa/ClientConnection.java848
1 files changed, 460 insertions, 388 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/xa/ClientConnection.java b/src/interfaces/jdbc/org/postgresql/xa/ClientConnection.java
index 3f06b09b4c..b6fd5c5a9e 100644
--- a/src/interfaces/jdbc/org/postgresql/xa/ClientConnection.java
+++ b/src/interfaces/jdbc/org/postgresql/xa/ClientConnection.java
@@ -1,47 +1,47 @@
/**
- * Redistribution and use of this software and associated documentation
- * ("Software"), with or without modification, are permitted provided
- * that the following conditions are met:
- *
- * 1. Redistributions of source code must retain copyright
- * statements and notices. Redistributions must also contain a
- * copy of this document.
- *
- * 2. Redistributions in binary form must reproduce the
- * above copyright notice, this list of conditions and the
- * following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * 3. The name "Exolab" must not be used to endorse or promote
- * products derived from this Software without prior written
- * permission of Exoffice Technologies. For written permission,
- * please contact info@exolab.org.
- *
- * 4. Products derived from this Software may not be called "Exolab"
- * nor may "Exolab" appear in their names without prior written
- * permission of Exoffice Technologies. Exolab is a registered
- * trademark of Exoffice Technologies.
- *
- * 5. Due credit should be given to the Exolab Project
- * (http://www.exolab.org/).
- *
- * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
- * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Copyright 1999 (C) Exoffice Technologies Inc. All Rights Reserved.
- *
- * $Id: ClientConnection.java,v 1.1 2000/04/17 20:07:55 peter Exp $
- */
+* Redistribution and use of this software and associated documentation
+* ("Software"), with or without modification, are permitted provided
+* that the following conditions are met:
+*
+* 1. Redistributions of source code must retain copyright
+* statements and notices. Redistributions must also contain a
+* copy of this document.
+*
+* 2. Redistributions in binary form must reproduce the
+* above copyright notice, this list of conditions and the
+* following disclaimer in the documentation and/or other
+* materials provided with the distribution.
+*
+* 3. The name "Exolab" must not be used to endorse or promote
+* products derived from this Software without prior written
+* permission of Exoffice Technologies. For written permission,
+* please contact info@exolab.org.
+*
+* 4. Products derived from this Software may not be called "Exolab"
+* nor may "Exolab" appear in their names without prior written
+* permission of Exoffice Technologies. Exolab is a registered
+* trademark of Exoffice Technologies.
+*
+* 5. Due credit should be given to the Exolab Project
+* (http://www.exolab.org/).
+*
+* THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
+* ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+* EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+* OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* Copyright 1999 (C) Exoffice Technologies Inc. All Rights Reserved.
+*
+* $Id: ClientConnection.java,v 1.2 2001/10/25 06:00:05 momjian Exp $
+*/
package org.postgresql.xa;
@@ -68,425 +68,497 @@ import java.sql.*;
* @see Connection
*/
final class ClientConnection
- implements Connection
+ implements Connection
{
- /**
- * The pooled XA connection that created this client connection
- * and should be used to report closure and fatal errors.
- */
- private XAConnectionImpl _xaConn;
-
-
- /**
- * This identifier was handed on to use when we were created by
- * {@link XAConnection}. If since then the XA connection was asked
- * to create another connection or was closed, our identifier will
- * no longer be valid and any call to {@link
- * XAConnection#getUnderlying} will throw an exception. Previously,
- * the XA connection would hold a reference to use and tell us to
- * terminate, but that prevented ClientConnection from being
- * finalized.
- */
- private int _clientId;
-
-
-
-
- /**
- * Construct a new client connection to provide access to the
- * underlying JDBC connection (<tt>underlying</tt>) on behalf of
- * an XA/pooled connection (<tt>xaConn<tt/>). The pooled connection
- * is required to notify of connection closure and fatal errors.
- *
- * @param xaConn The XA/pooled connection that created this
- * client connection
- * @param clientId A unique identifier handed to us by
- * {@link XAConnection}
- * @param underlying The underlying JDBC connection
- */
- ClientConnection( XAConnectionImpl xaConn, int clientId )
- {
- _xaConn = xaConn;
- _clientId = clientId;
- }
-
-
- public Statement createStatement()
- throws SQLException
- {
- try {
- return getUnderlying().createStatement();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ /**
+ * The pooled XA connection that created this client connection
+ * and should be used to report closure and fatal errors.
+ */
+ private XAConnectionImpl _xaConn;
+
+
+ /**
+ * This identifier was handed on to use when we were created by
+ * {@link XAConnection}. If since then the XA connection was asked
+ * to create another connection or was closed, our identifier will
+ * no longer be valid and any call to {@link
+ * XAConnection#getUnderlying} will throw an exception. Previously,
+ * the XA connection would hold a reference to use and tell us to
+ * terminate, but that prevented ClientConnection from being
+ * finalized.
+ */
+ private int _clientId;
+
+
+
+
+ /**
+ * Construct a new client connection to provide access to the
+ * underlying JDBC connection (<tt>underlying</tt>) on behalf of
+ * an XA/pooled connection (<tt>xaConn<tt/>). The pooled connection
+ * is required to notify of connection closure and fatal errors.
+ *
+ * @param xaConn The XA/pooled connection that created this
+ * client connection
+ * @param clientId A unique identifier handed to us by
+ * {@link XAConnection}
+ * @param underlying The underlying JDBC connection
+ */
+ ClientConnection( XAConnectionImpl xaConn, int clientId )
+ {
+ _xaConn = xaConn;
+ _clientId = clientId;
}
- }
- public Statement createStatement( int resultSetType, int resultSetConcurrency )
- throws SQLException
- {
- try {
- return getUnderlying().createStatement( resultSetType, resultSetConcurrency );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public Statement createStatement()
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().createStatement();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public PreparedStatement prepareStatement( String sql )
- throws SQLException
- {
- try {
- return getUnderlying().prepareStatement( sql );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public Statement createStatement( int resultSetType, int resultSetConcurrency )
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().createStatement( resultSetType, resultSetConcurrency );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency )
- throws SQLException
- {
- try {
- return getUnderlying().prepareStatement( sql, resultSetType, resultSetConcurrency );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public PreparedStatement prepareStatement( String sql )
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().prepareStatement( sql );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public CallableStatement prepareCall( String sql )
- throws SQLException
- {
- try {
- return getUnderlying().prepareCall( sql );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency )
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().prepareStatement( sql, resultSetType, resultSetConcurrency );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency )
- throws SQLException
- {
- try {
- return getUnderlying().prepareCall( sql, resultSetType, resultSetConcurrency );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public CallableStatement prepareCall( String sql )
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().prepareCall( sql );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public String nativeSQL( String sql )
- throws SQLException
- {
- try {
- return getUnderlying().nativeSQL( sql );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency )
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().prepareCall( sql, resultSetType, resultSetConcurrency );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public DatabaseMetaData getMetaData()
- throws SQLException
- {
- try {
- return getUnderlying().getMetaData();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public String nativeSQL( String sql )
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().nativeSQL( sql );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public void setCatalog( String catalog )
- throws SQLException
- {
- try {
- getUnderlying().setCatalog( catalog );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public DatabaseMetaData getMetaData()
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().getMetaData();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public String getCatalog()
- throws SQLException
- {
- try {
- return getUnderlying().getCatalog();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public void setCatalog( String catalog )
+ throws SQLException
+ {
+ try
+ {
+ getUnderlying().setCatalog( catalog );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public SQLWarning getWarnings()
- throws SQLException
- {
- try {
- return getUnderlying().getWarnings();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public String getCatalog()
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().getCatalog();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public void clearWarnings()
- throws SQLException
- {
- try {
- getUnderlying().clearWarnings();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public SQLWarning getWarnings()
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().getWarnings();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public Map getTypeMap()
- throws SQLException
- {
- try {
- return getUnderlying().getTypeMap();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public void clearWarnings()
+ throws SQLException
+ {
+ try
+ {
+ getUnderlying().clearWarnings();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public void setTypeMap( Map map )
- throws SQLException
- {
- try {
- getUnderlying().setTypeMap( map );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public Map getTypeMap()
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().getTypeMap();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
-
-
- public void setAutoCommit( boolean autoCommit )
- throws SQLException
- {
- // Cannot set auto-commit inside a transaction.
- if ( _xaConn.insideGlobalTx() )
- throw new SQLException( "Cannot commit/rollback a connection managed by the transaction manager" );
- try {
- getUnderlying().setAutoCommit( autoCommit );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+
+
+ public void setTypeMap( Map map )
+ throws SQLException
+ {
+ try
+ {
+ getUnderlying().setTypeMap( map );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public boolean getAutoCommit()
- throws SQLException
- {
- try {
- return getUnderlying().getAutoCommit();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public void setAutoCommit( boolean autoCommit )
+ throws SQLException
+ {
+ // Cannot set auto-commit inside a transaction.
+ if ( _xaConn.insideGlobalTx() )
+ throw new SQLException( "Cannot commit/rollback a connection managed by the transaction manager" );
+ try
+ {
+ getUnderlying().setAutoCommit( autoCommit );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
-
-
- public void commit()
- throws SQLException
- {
- // Cannot commit directly if we're inside a global transaction.
- if ( _xaConn.insideGlobalTx() )
- throw new SQLException( "Cannot commit/rollback a connection managed by the transaction manager" );
- // Cannot commit a read-only transaction.
- if ( isReadOnly() )
- throw new SQLException( "Cannot commit/rollback a read-only transaction" );
-
- // This only occurs if not inside a local transaction.
- try {
- getUnderlying().commit();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+
+
+ public boolean getAutoCommit()
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().getAutoCommit();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
+ public void commit()
+ throws SQLException
+ {
+ // Cannot commit directly if we're inside a global transaction.
+ if ( _xaConn.insideGlobalTx() )
+ throw new SQLException( "Cannot commit/rollback a connection managed by the transaction manager" );
+ // Cannot commit a read-only transaction.
+ if ( isReadOnly() )
+ throw new SQLException( "Cannot commit/rollback a read-only transaction" );
+
+ // This only occurs if not inside a local transaction.
+ try
+ {
+ getUnderlying().commit();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
+ }
+
- public void rollback()
- throws SQLException
- {
- // Cannot commit directly if we're inside a global transaction.
- if ( _xaConn.insideGlobalTx() )
- throw new SQLException( "Cannot commit/rollback a connection managed by the transaction manager" );
- // This only occurs if not inside a local transaction.
- try {
- getUnderlying().rollback();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public void rollback()
+ throws SQLException
+ {
+ // Cannot commit directly if we're inside a global transaction.
+ if ( _xaConn.insideGlobalTx() )
+ throw new SQLException( "Cannot commit/rollback a connection managed by the transaction manager" );
+
+ // This only occurs if not inside a local transaction.
+ try
+ {
+ getUnderlying().rollback();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public void setReadOnly( boolean readOnly )
- throws SQLException
- {
- try {
- getUnderlying().setReadOnly( readOnly );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public void setReadOnly( boolean readOnly )
+ throws SQLException
+ {
+ try
+ {
+ getUnderlying().setReadOnly( readOnly );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public boolean isReadOnly()
- throws SQLException
- {
- try {
- return getUnderlying().isReadOnly();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public boolean isReadOnly()
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().isReadOnly();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
-
-
- public void setTransactionIsolation( int level )
- throws SQLException
- {
- try {
- getUnderlying().setTransactionIsolation( level );
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+
+
+ public void setTransactionIsolation( int level )
+ throws SQLException
+ {
+ try
+ {
+ getUnderlying().setTransactionIsolation( level );
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public int getTransactionIsolation()
- throws SQLException
- {
- try {
- return getUnderlying().getTransactionIsolation();
- } catch ( SQLException except ) {
- notifyError( except );
- throw except;
+ public int getTransactionIsolation()
+ throws SQLException
+ {
+ try
+ {
+ return getUnderlying().getTransactionIsolation();
+ }
+ catch ( SQLException except )
+ {
+ notifyError( except );
+ throw except;
+ }
}
- }
- public synchronized void close()
+ public synchronized void close()
throws SQLException
- {
- if ( _xaConn == null )
- return;
-
- // Notify the XA connection that we are no longer going
- // to be used. Whether the underlying connection is released,
- // held until the transaction terminates, etc is not
- // a concern of us.
- _xaConn.notifyClose( _clientId );
- _xaConn = null;
- }
-
-
- public synchronized boolean isClosed()
- {
- // Simple way of determining if this connection is closed.
- // The actual connection is never closed, it is pooled.
- return ( _xaConn == null );
- }
-
-
- /**
- * Called by {@link XAConnectionImpl} to terminate this connection
- * by dissociating it from the underlying JDBC connection.
- * The application would call {@link #close} but {@link
- * XAConnectionImpl} cannot, since pooled connection requirements
- * will cause an inifinite loop. This method should not attempt
- * to notify either a closure or fatal error, but rather throw an
- * exception if it fails.
- */
- /* Deprecated: see XAConnection._clientId
- void terminate()
- {
+ {
+ if ( _xaConn == null )
+ return ;
+
+ // Notify the XA connection that we are no longer going
+ // to be used. Whether the underlying connection is released,
+ // held until the transaction terminates, etc is not
+ // a concern of us.
+ _xaConn.notifyClose( _clientId );
+ _xaConn = null;
+ }
+
+
+ public synchronized boolean isClosed()
+ {
+ // Simple way of determining if this connection is closed.
+ // The actual connection is never closed, it is pooled.
+ return ( _xaConn == null );
+ }
+
+
+ /**
+ * Called by {@link XAConnectionImpl} to terminate this connection
+ * by dissociating it from the underlying JDBC connection.
+ * The application would call {@link #close} but {@link
+ * XAConnectionImpl} cannot, since pooled connection requirements
+ * will cause an inifinite loop. This method should not attempt
+ * to notify either a closure or fatal error, but rather throw an
+ * exception if it fails.
+ */
+ /* Deprecated: see XAConnection._clientId
+ void terminate()
+{
_xaConn = null;
- }
- */
+}
+ */
- protected void finalize()
+ protected void finalize()
throws Throwable
- {
- close();
- }
+ {
+ close();
+ }
- public String toString()
- {
- try {
- return getUnderlying().toString();
- } catch ( SQLException except ) {
- return "XAConnection: Connection closed";
+ public String toString()
+ {
+ try
+ {
+ return getUnderlying().toString();
+ }
+ catch ( SQLException except )
+ {
+ return "XAConnection: Connection closed";
+ }
}
- }
-
-
- /**
- * Called when an exception is thrown by the underlying connection
- * to determine whether the exception is critical or not. If the
- * exception is critical, notifies the XA connection to forget
- * about this connection.
- *
- * @param except The exception thrown by the underlying
- * connection
- */
- void notifyError( SQLException except )
- {
- if ( _xaConn != null )
- _xaConn.notifyError( _clientId, except );
- }
-
-
- /**
- * Called to retrieve the underlying JDBC connection. Actual JDBC
- * operations are performed against it. Throws an SQLException if
- * this connection has been closed.
- */
- Connection getUnderlying()
- throws SQLException
- {
- if ( _xaConn == null )
- throw new SQLException( "This connection has been closed" );
- // Must pass the client identifier so XAConnection can determine
- // whether we are still valid. If it tells us we're no longer
- // valid, we have little to do.
- try {
- return _xaConn.getUnderlying( _clientId );
- } catch ( SQLException except ) {
- _xaConn = null;
- throw except;
+
+
+ /**
+ * Called when an exception is thrown by the underlying connection
+ * to determine whether the exception is critical or not. If the
+ * exception is critical, notifies the XA connection to forget
+ * about this connection.
+ *
+ * @param except The exception thrown by the underlying
+ * connection
+ */
+ void notifyError( SQLException except )
+ {
+ if ( _xaConn != null )
+ _xaConn.notifyError( _clientId, except );
+ }
+
+
+ /**
+ * Called to retrieve the underlying JDBC connection. Actual JDBC
+ * operations are performed against it. Throws an SQLException if
+ * this connection has been closed.
+ */
+ Connection getUnderlying()
+ throws SQLException
+ {
+ if ( _xaConn == null )
+ throw new SQLException( "This connection has been closed" );
+ // Must pass the client identifier so XAConnection can determine
+ // whether we are still valid. If it tells us we're no longer
+ // valid, we have little to do.
+ try
+ {
+ return _xaConn.getUnderlying( _clientId );
+ }
+ catch ( SQLException except )
+ {
+ _xaConn = null;
+ throw except;
+ }
}
- }
}