diff options
Diffstat (limited to 'bdb/libdb_java/java_DbXAResource.c')
-rw-r--r-- | bdb/libdb_java/java_DbXAResource.c | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/bdb/libdb_java/java_DbXAResource.c b/bdb/libdb_java/java_DbXAResource.c new file mode 100644 index 00000000000..609529bfe83 --- /dev/null +++ b/bdb/libdb_java/java_DbXAResource.c @@ -0,0 +1,288 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1997-2001 + * Sleepycat Software. All rights reserved. + */ +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: java_DbXAResource.c,v 11.6 2002/08/06 05:19:06 bostic Exp $"; +#endif /* not lint */ + +#include <jni.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#ifdef DIAGNOSTIC +#include <stdio.h> +#endif + +#include "db_int.h" +#include "java_util.h" +#include "dbinc/xa.h" +#include "dbinc_auto/xa_ext.h" +#include "com_sleepycat_db_xa_DbXAResource.h" + +JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1init + (JNIEnv *jnienv, jobject jthis, jstring home, jint rmid, jint flags) +{ + int err; + LOCKED_STRING ls_home; + jclass cl; + jmethodID mid; + + COMPQUIET(jthis, NULL); + if (locked_string_get(&ls_home, jnienv, home) != 0) + goto out; + if ((err = __db_xa_open((char *)ls_home.string, + rmid, flags)) != XA_OK) { + verify_return(jnienv, err, EXCEPTION_XA); + } + + /* + * Now create the DbEnv object, it will get attached + * to the DB_ENV just made in __db_xa_open. + */ + if ((cl = get_class(jnienv, name_DB_ENV)) == NULL) + goto out; + + mid = (*jnienv)->GetStaticMethodID(jnienv, cl, + "_create_DbEnv_for_XA", "(II)V"); + (*jnienv)->CallStaticVoidMethod(jnienv, cl, mid, 0, rmid); + + out: + locked_string_put(&ls_home, jnienv); +} + +JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1close + (JNIEnv *jnienv, jobject jthis, jstring home, jint rmid, jint flags) +{ + int err; + LOCKED_STRING ls_home; + + COMPQUIET(jthis, NULL); + if (locked_string_get(&ls_home, jnienv, home) != 0) + goto out; + if ((err = __db_xa_close((char *)ls_home.string, + rmid, flags)) != XA_OK) + verify_return(jnienv, err, EXCEPTION_XA); + out: + locked_string_put(&ls_home, jnienv); +} + +JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1commit + (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid, + jboolean onePhase) +{ + XID xid; + long flags; + int err; + + COMPQUIET(jthis, NULL); + if (!get_XID(jnienv, jxid, &xid)) + return; + flags = 0; + if (onePhase == JNI_TRUE) + flags |= TMONEPHASE; + if ((err = __db_xa_commit(&xid, rmid, flags)) != XA_OK) + verify_return(jnienv, err, EXCEPTION_XA); +} + +JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1end + (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid, jint flags) +{ + XID xid; + int err; + + COMPQUIET(jthis, NULL); + if (!get_XID(jnienv, jxid, &xid)) + return; + if ((err = __db_xa_end(&xid, rmid, flags)) != XA_OK) + verify_return(jnienv, err, EXCEPTION_XA); +} + +JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1forget + (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid) +{ + XID xid; + int err; + + COMPQUIET(jthis, NULL); + if (!get_XID(jnienv, jxid, &xid)) + return; + if ((err = __db_xa_forget(&xid, rmid, 0)) != XA_OK) + verify_return(jnienv, err, EXCEPTION_XA); +} + +JNIEXPORT jint JNICALL Java_com_sleepycat_db_xa_DbXAResource__1prepare + (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid) +{ + XID xid; + int err; + + COMPQUIET(jthis, NULL); + if (!get_XID(jnienv, jxid, &xid)) + return (0); + err = __db_xa_prepare(&xid, rmid, 0); + if (err != XA_OK && err != XA_RDONLY) + verify_return(jnienv, err, EXCEPTION_XA); + + return (err); +} + +JNIEXPORT jobjectArray JNICALL Java_com_sleepycat_db_xa_DbXAResource__1recover + (JNIEnv *jnienv, jobject jthis, jint rmid, jint flags) +{ + XID *xids; + int err; + int total; + int cnt; + int i; + int curflags; + size_t nbytes; + jclass xid_class; + jmethodID mid; + jobject obj; + jobjectArray retval; + + COMPQUIET(jthis, NULL); + total = 0; + cnt = 0; + xids = NULL; + flags &= ~(DB_FIRST | DB_LAST | DB_NEXT); + + /* Repeatedly call __db_xa_recover to fill up an array of XIDs */ + curflags = flags | DB_FIRST; + do { + total += cnt; + nbytes = sizeof(XID) * (total + 10); + if ((err = __os_realloc(NULL, nbytes, &xids)) != 0) { + if (xids != NULL) + __os_free(NULL, xids); + verify_return(jnienv, XAER_NOTA, EXCEPTION_XA); + return (NULL); + } + cnt = __db_xa_recover(&xids[total], 10, rmid, curflags); + curflags = flags | DB_NEXT; + } while (cnt > 0); + + if (xids != NULL) + __os_free(NULL, xids); + + if (cnt < 0) { + verify_return(jnienv, cnt, EXCEPTION_XA); + return (NULL); + } + + /* Create the java DbXid array and fill it up */ + if ((xid_class = get_class(jnienv, name_DB_XID)) == NULL) + return (NULL); + mid = (*jnienv)->GetMethodID(jnienv, xid_class, "<init>", + "(I[B[B)V"); + if ((retval = (*jnienv)->NewObjectArray(jnienv, total, xid_class, 0)) + == NULL) + goto out; + + for (i = 0; i < total; i++) { + jobject gtrid; + jobject bqual; + jsize gtrid_len; + jsize bqual_len; + + gtrid_len = (jsize)xids[i].gtrid_length; + bqual_len = (jsize)xids[i].bqual_length; + gtrid = (*jnienv)->NewByteArray(jnienv, gtrid_len); + bqual = (*jnienv)->NewByteArray(jnienv, bqual_len); + if (gtrid == NULL || bqual == NULL) + goto out; + (*jnienv)->SetByteArrayRegion(jnienv, gtrid, 0, gtrid_len, + (jbyte *)&xids[i].data[0]); + (*jnienv)->SetByteArrayRegion(jnienv, bqual, 0, bqual_len, + (jbyte *)&xids[i].data[gtrid_len]); + if ((obj = (*jnienv)->NewObject(jnienv, xid_class, mid, + (jint)xids[i].formatID, gtrid, bqual)) == NULL) + goto out; + (*jnienv)->SetObjectArrayElement(jnienv, retval, i, obj); + } +out: return (retval); +} + +JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1rollback + (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid) +{ + XID xid; + int err; + + COMPQUIET(jthis, NULL); + if (!get_XID(jnienv, jxid, &xid)) + return; + if ((err = __db_xa_rollback(&xid, rmid, 0)) != XA_OK) + verify_return(jnienv, err, EXCEPTION_XA); +} + +JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1start + (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid, jint flags) +{ + XID xid; + int err; + + COMPQUIET(jthis, NULL); + if (!get_XID(jnienv, jxid, &xid)) + return; + + if ((err = __db_xa_start(&xid, rmid, flags)) != XA_OK) + verify_return(jnienv, err, EXCEPTION_XA); +} + +JNIEXPORT jobject JNICALL Java_com_sleepycat_db_xa_DbXAResource_xa_1attach + (JNIEnv *jnienv, jclass jthisclass, jobject jxid, jobject jrmid) +{ + XID xid; + XID *xidp; + int ret; + DB_ENV *env; + DB_TXN *txn; + int rmid; + int *rmidp; + jobject jtxn; + jobject jenv; + jclass cl; + jmethodID mid; + + COMPQUIET(jthisclass, NULL); + if (jxid == NULL) { + xidp = NULL; + } + else { + xidp = &xid; + if (!get_XID(jnienv, jxid, &xid)) + return (NULL); + } + if (jrmid == NULL) { + rmidp = NULL; + } + else { + rmidp = &rmid; + rmid = (int)(*jnienv)->CallIntMethod(jnienv, jrmid, + mid_Integer_intValue); + } + + if ((ret = db_env_xa_attach(rmidp, xidp, &env, &txn)) != 0) { + /* + * DB_NOTFOUND is a normal return, it means we + * have no current transaction, + */ + if (ret != DB_NOTFOUND) + verify_return(jnienv, ret, 0); + return (NULL); + } + + jenv = ((DB_ENV_JAVAINFO *)env->api2_internal)->jenvref; + jtxn = get_DbTxn(jnienv, txn); + if ((cl = get_class(jnienv, name_DB_XAATTACH)) == NULL) + return (NULL); + mid = (*jnienv)->GetMethodID(jnienv, cl, "<init>", + "(Lcom/sleepycat/db/DbEnv;Lcom/sleepycat/db/DbTxn;)V"); + return (*jnienv)->NewObject(jnienv, cl, mid, jenv, jtxn); +} |