/*
* 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
*
* @author Thomas Hallgren
*/
#include "pljava/Backend.h"
#include "pljava/Exception.h"
#include "pljava/SPI.h"
#include "org_postgresql_pljava_internal_SubXactListener.h"
#include
static jclass s_SubXactListener_class;
static jmethodID s_SubXactListener_onStart;
static jmethodID s_SubXactListener_onCommit;
static jmethodID s_SubXactListener_onAbort;
static void subXactCB(SubXactEvent event, SubTransactionId mySubid, SubTransactionId parentSubid, void* arg)
{
Ptr2Long p2l;
p2l.longVal = 0L; /* ensure that the rest is zeroed out */
p2l.ptrVal = arg;
switch(event)
{
case SUBXACT_EVENT_START_SUB:
{
Ptr2Long infant2l;
infant->xid = mySubid;
infant2l.longVal = 0L; /* ensure that the rest is zeroed out */
infant2l.ptrVal = infant;
JNI_callStaticVoidMethod(s_SubXactListener_class, s_SubXactListener_onStart, p2l.longVal, infant2l.longVal, parentSubid);
}
break;
case SUBXACT_EVENT_COMMIT_SUB:
JNI_callStaticVoidMethod(s_SubXactListener_class, s_SubXactListener_onCommit, p2l.longVal, mySubid, parentSubid);
break;
case SUBXACT_EVENT_ABORT_SUB:
JNI_callStaticVoidMethod(s_SubXactListener_class, s_SubXactListener_onAbort, p2l.longVal, mySubid, parentSubid);
}
}
extern void SubXactListener_initialize(void);
void SubXactListener_initialize(void)
{
JNINativeMethod methods[] = {
{
"_register",
"(J)V",
Java_org_postgresql_pljava_internal_SubXactListener__1register
},
{
"_unregister",
"(J)V",
Java_org_postgresql_pljava_internal_SubXactListener__1unregister
},
{ 0, 0, 0 }};
PgObject_registerNatives("org/postgresql/pljava/internal/SubXactListener", methods);
s_SubXactListener_class = JNI_newGlobalRef(PgObject_getJavaClass("org/postgresql/pljava/internal/SubXactListener"));
s_SubXactListener_onAbort = PgObject_getStaticJavaMethod(s_SubXactListener_class, "onAbort", "(JII)V");
s_SubXactListener_onCommit = PgObject_getStaticJavaMethod(s_SubXactListener_class, "onCommit", "(JII)V");
s_SubXactListener_onStart = PgObject_getStaticJavaMethod(s_SubXactListener_class, "onStart", "(JJI)V");
}
/*
* Class: org_postgresql_pljava_internal_SubXactListener
* Method: _register
* Signature: (J)V
*/
JNIEXPORT void JNICALL
Java_org_postgresql_pljava_internal_SubXactListener__1register(JNIEnv* env, jclass cls, jlong listenerId)
{
BEGIN_NATIVE
PG_TRY();
{
Ptr2Long p2l;
p2l.longVal = listenerId;
RegisterSubXactCallback(subXactCB, p2l.ptrVal);
}
PG_CATCH();
{
Exception_throw_ERROR("RegisterSubXactCallback");
}
PG_END_TRY();
END_NATIVE
}
/*
* Class: org_postgresql_pljava_internal_SubXactListener
* Method: _unregister
* Signature: (J)V
*/
JNIEXPORT void JNICALL
Java_org_postgresql_pljava_internal_SubXactListener__1unregister(JNIEnv* env, jclass cls, jlong listenerId)
{
BEGIN_NATIVE
PG_TRY();
{
Ptr2Long p2l;
p2l.longVal = listenerId;
UnregisterSubXactCallback(subXactCB, p2l.ptrVal);
}
PG_CATCH();
{
Exception_throw_ERROR("UnregisterSubXactCallback");
}
PG_END_TRY();
END_NATIVE
}