/*
* Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden
* Distributed under the terms shown in the file COPYRIGHT
* found in the root folder of this project or at
* http://eng.tada.se/osprojects/COPYRIGHT.html
*/
package org.postgresql.pljava.internal;
import java.sql.SQLException;
import java.util.HashMap;
import org.postgresql.pljava.SavepointListener;
/**
* Class that enables registrations using the PostgreSQL <code>RegisterSubXactCallback</code>
* function.
*
* @author Thomas Hallgren
*/
class SubXactListener
{
private static final HashMap s_listeners = new HashMap();
static void onAbort(long listenerId, int spId, int parentSpId) throws SQLException
{
SavepointListener listener = (SavepointListener)s_listeners.get(new Long(listenerId));
if(listener != null)
listener.onAbort(Backend.getSession(), PgSavepoint.forId(spId), PgSavepoint.forId(parentSpId));
}
static void onCommit(long listenerId, int spId, int parentSpId) throws SQLException
{
SavepointListener listener = (SavepointListener)s_listeners.get(new Long(listenerId));
if(listener != null)
listener.onCommit(Backend.getSession(), PgSavepoint.forId(spId), PgSavepoint.forId(parentSpId));
}
static void onStart(long listenerId, long spPointer, int parentSpId) throws SQLException
{
SavepointListener listener = (SavepointListener)s_listeners.get(new Long(listenerId));
if(listener != null)
listener.onStart(Backend.getSession(), new PgSavepoint(spPointer), PgSavepoint.forId(parentSpId));
}
static void addListener(SavepointListener listener)
{
synchronized(Backend.THREADLOCK)
{
long key = System.identityHashCode(listener);
if(s_listeners.put(new Long(key), listener) != listener)
_register(key);
}
}
static void removeListener(SavepointListener listener)
{
synchronized(Backend.THREADLOCK)
{
long key = System.identityHashCode(listener);
if(s_listeners.remove(new Long(key)) == listener)
_unregister(key);
}
}
private static native void _register(long listenerId);
private static native void _unregister(long listenerId);
}