java_DbXAResource.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997-2001
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: java_DbXAResource.c,v 11.6 2002/08/06 05:19:06 bostic Exp $";
  10. #endif /* not lint */
  11. #include <jni.h>
  12. #include <errno.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #ifdef DIAGNOSTIC
  16. #include <stdio.h>
  17. #endif
  18. #include "db_int.h"
  19. #include "java_util.h"
  20. #include "dbinc/xa.h"
  21. #include "dbinc_auto/xa_ext.h"
  22. #include "com_sleepycat_db_xa_DbXAResource.h"
  23. JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1init
  24.   (JNIEnv *jnienv, jobject jthis, jstring home, jint rmid, jint flags)
  25. {
  26. int err;
  27. LOCKED_STRING ls_home;
  28. jclass cl;
  29. jmethodID mid;
  30. COMPQUIET(jthis, NULL);
  31. if (locked_string_get(&ls_home, jnienv, home) != 0)
  32. goto out;
  33. if ((err = __db_xa_open((char *)ls_home.string,
  34. rmid, flags)) != XA_OK) {
  35. verify_return(jnienv, err, EXCEPTION_XA);
  36. }
  37. /*
  38.  * Now create the DbEnv object, it will get attached
  39.  * to the DB_ENV just made in __db_xa_open.
  40.  */
  41. if ((cl = get_class(jnienv, name_DB_ENV)) == NULL)
  42. goto out;
  43. mid = (*jnienv)->GetStaticMethodID(jnienv, cl,
  44.    "_create_DbEnv_for_XA", "(II)V");
  45. (*jnienv)->CallStaticVoidMethod(jnienv, cl, mid, 0, rmid);
  46.  out:
  47. locked_string_put(&ls_home, jnienv);
  48. }
  49. JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1close
  50.   (JNIEnv *jnienv, jobject jthis, jstring home, jint rmid, jint flags)
  51. {
  52. int err;
  53. LOCKED_STRING ls_home;
  54. COMPQUIET(jthis, NULL);
  55. if (locked_string_get(&ls_home, jnienv, home) != 0)
  56. goto out;
  57. if ((err = __db_xa_close((char *)ls_home.string,
  58.  rmid, flags)) != XA_OK)
  59. verify_return(jnienv, err, EXCEPTION_XA);
  60.  out:
  61. locked_string_put(&ls_home, jnienv);
  62. }
  63. JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1commit
  64.   (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid,
  65.    jboolean onePhase)
  66. {
  67. XID xid;
  68. long flags;
  69. int err;
  70. COMPQUIET(jthis, NULL);
  71. if (!get_XID(jnienv, jxid, &xid))
  72. return;
  73. flags = 0;
  74. if (onePhase == JNI_TRUE)
  75. flags |= TMONEPHASE;
  76. if ((err = __db_xa_commit(&xid, rmid, flags)) != XA_OK)
  77. verify_return(jnienv, err, EXCEPTION_XA);
  78. }
  79. JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1end
  80.   (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid, jint flags)
  81. {
  82. XID xid;
  83. int err;
  84. COMPQUIET(jthis, NULL);
  85. if (!get_XID(jnienv, jxid, &xid))
  86. return;
  87. if ((err = __db_xa_end(&xid, rmid, flags)) != XA_OK)
  88. verify_return(jnienv, err, EXCEPTION_XA);
  89. }
  90. JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1forget
  91.   (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid)
  92. {
  93. XID xid;
  94. int err;
  95. COMPQUIET(jthis, NULL);
  96. if (!get_XID(jnienv, jxid, &xid))
  97. return;
  98. if ((err = __db_xa_forget(&xid, rmid, 0)) != XA_OK)
  99. verify_return(jnienv, err, EXCEPTION_XA);
  100. }
  101. JNIEXPORT jint JNICALL Java_com_sleepycat_db_xa_DbXAResource__1prepare
  102.   (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid)
  103. {
  104. XID xid;
  105. int err;
  106. COMPQUIET(jthis, NULL);
  107. if (!get_XID(jnienv, jxid, &xid))
  108. return (0);
  109. err = __db_xa_prepare(&xid, rmid, 0);
  110. if (err != XA_OK && err != XA_RDONLY)
  111. verify_return(jnienv, err, EXCEPTION_XA);
  112. return (err);
  113. }
  114. JNIEXPORT jobjectArray JNICALL Java_com_sleepycat_db_xa_DbXAResource__1recover
  115.   (JNIEnv *jnienv, jobject jthis, jint rmid, jint flags)
  116. {
  117. XID *xids;
  118. int err;
  119. int total;
  120. int cnt;
  121. int i;
  122. int curflags;
  123. size_t nbytes;
  124. jclass xid_class;
  125. jmethodID mid;
  126. jobject obj;
  127. jobjectArray retval;
  128. COMPQUIET(jthis, NULL);
  129. total = 0;
  130. cnt = 0;
  131. xids = NULL;
  132. flags &= ~(DB_FIRST | DB_LAST | DB_NEXT);
  133. /* Repeatedly call __db_xa_recover to fill up an array of XIDs */
  134. curflags = flags | DB_FIRST;
  135. do {
  136. total += cnt;
  137. nbytes = sizeof(XID) * (total + 10);
  138. if ((err = __os_realloc(NULL, nbytes, &xids)) != 0) {
  139. if (xids != NULL)
  140. __os_free(NULL, xids);
  141. verify_return(jnienv, XAER_NOTA, EXCEPTION_XA);
  142. return (NULL);
  143. }
  144. cnt = __db_xa_recover(&xids[total], 10, rmid, curflags);
  145. curflags = flags | DB_NEXT;
  146. } while (cnt > 0);
  147. if (xids != NULL)
  148. __os_free(NULL, xids);
  149. if (cnt < 0) {
  150. verify_return(jnienv, cnt, EXCEPTION_XA);
  151. return (NULL);
  152. }
  153. /* Create the java DbXid array and fill it up */
  154. if ((xid_class = get_class(jnienv, name_DB_XID)) == NULL)
  155. return (NULL);
  156. mid = (*jnienv)->GetMethodID(jnienv, xid_class, "<init>",
  157.      "(I[B[B)V");
  158. if ((retval = (*jnienv)->NewObjectArray(jnienv, total, xid_class, 0))
  159.     == NULL)
  160. goto out;
  161. for (i = 0; i < total; i++) {
  162. jobject gtrid;
  163. jobject bqual;
  164. jsize gtrid_len;
  165. jsize bqual_len;
  166. gtrid_len = (jsize)xids[i].gtrid_length;
  167. bqual_len = (jsize)xids[i].bqual_length;
  168. gtrid = (*jnienv)->NewByteArray(jnienv, gtrid_len);
  169. bqual = (*jnienv)->NewByteArray(jnienv, bqual_len);
  170. if (gtrid == NULL || bqual == NULL)
  171. goto out;
  172. (*jnienv)->SetByteArrayRegion(jnienv, gtrid, 0, gtrid_len,
  173.     (jbyte *)&xids[i].data[0]);
  174. (*jnienv)->SetByteArrayRegion(jnienv, bqual, 0, bqual_len,
  175.     (jbyte *)&xids[i].data[gtrid_len]);
  176. if ((obj = (*jnienv)->NewObject(jnienv, xid_class, mid,
  177.     (jint)xids[i].formatID, gtrid, bqual)) == NULL)
  178. goto out;
  179. (*jnienv)->SetObjectArrayElement(jnienv, retval, i, obj);
  180. }
  181. out: return (retval);
  182. }
  183. JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1rollback
  184.   (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid)
  185. {
  186. XID xid;
  187. int err;
  188. COMPQUIET(jthis, NULL);
  189. if (!get_XID(jnienv, jxid, &xid))
  190. return;
  191. if ((err = __db_xa_rollback(&xid, rmid, 0)) != XA_OK)
  192. verify_return(jnienv, err, EXCEPTION_XA);
  193. }
  194. JNIEXPORT void JNICALL Java_com_sleepycat_db_xa_DbXAResource__1start
  195.   (JNIEnv *jnienv, jobject jthis, jobject jxid, jint rmid, jint flags)
  196. {
  197. XID xid;
  198. int err;
  199. COMPQUIET(jthis, NULL);
  200. if (!get_XID(jnienv, jxid, &xid))
  201. return;
  202. if ((err = __db_xa_start(&xid, rmid, flags)) != XA_OK)
  203. verify_return(jnienv, err, EXCEPTION_XA);
  204. }
  205. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_xa_DbXAResource_xa_1attach
  206.   (JNIEnv *jnienv, jclass jthisclass, jobject jxid, jobject jrmid)
  207. {
  208. XID xid;
  209. XID *xidp;
  210. int ret;
  211. DB_ENV *env;
  212. DB_TXN *txn;
  213. int rmid;
  214. int *rmidp;
  215. jobject jtxn;
  216. jobject jenv;
  217. jclass cl;
  218. jmethodID mid;
  219. COMPQUIET(jthisclass, NULL);
  220. if (jxid == NULL) {
  221. xidp = NULL;
  222. }
  223. else {
  224. xidp = &xid;
  225. if (!get_XID(jnienv, jxid, &xid))
  226. return (NULL);
  227. }
  228. if (jrmid == NULL) {
  229. rmidp = NULL;
  230. }
  231. else {
  232. rmidp = &rmid;
  233. rmid = (int)(*jnienv)->CallIntMethod(jnienv, jrmid,
  234.      mid_Integer_intValue);
  235. }
  236. if ((ret = db_env_xa_attach(rmidp, xidp, &env, &txn)) != 0) {
  237. /*
  238.  * DB_NOTFOUND is a normal return, it means we
  239.  * have no current transaction,
  240.  */
  241. if (ret != DB_NOTFOUND)
  242. verify_return(jnienv, ret, 0);
  243. return (NULL);
  244. }
  245. jenv = ((DB_ENV_JAVAINFO *)env->api2_internal)->jenvref;
  246. jtxn = get_DbTxn(jnienv, txn);
  247. if ((cl = get_class(jnienv, name_DB_XAATTACH)) == NULL)
  248. return (NULL);
  249. mid = (*jnienv)->GetMethodID(jnienv, cl, "<init>",
  250.      "(Lcom/sleepycat/db/DbEnv;Lcom/sleepycat/db/DbTxn;)V");
  251. return (*jnienv)->NewObject(jnienv, cl, mid, jenv, jtxn);
  252. }