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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: java_Dbc.c,v 11.23 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 "com_sleepycat_db_Dbc.h"
  21. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbc_close
  22.   (JNIEnv *jnienv, jobject jthis)
  23. {
  24. int err;
  25. DBC *dbc = get_DBC(jnienv, jthis);
  26. if (!verify_non_null(jnienv, dbc))
  27. return;
  28. err = dbc->c_close(dbc);
  29. if (verify_return(jnienv, err, 0)) {
  30. set_private_dbobj(jnienv, name_DBC, jthis, 0);
  31. }
  32. }
  33. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbc_count
  34.   (JNIEnv *jnienv, jobject jthis, jint flags)
  35. {
  36. int err;
  37. DBC *dbc = get_DBC(jnienv, jthis);
  38. db_recno_t count;
  39. if (!verify_non_null(jnienv, dbc))
  40. return (0);
  41. err = dbc->c_count(dbc, &count, flags);
  42. verify_return(jnienv, err, 0);
  43. return (count);
  44. }
  45. JAVADB_METHOD_INT(Dbc_del, (JAVADB_ARGS, jint flags), DBC,
  46.     c_del, (c_this, flags), DB_RETOK_DBCDEL)
  47. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_Dbc_dup
  48.   (JNIEnv *jnienv, jobject jthis, jint flags)
  49. {
  50. int err;
  51. DBC *dbc = get_DBC(jnienv, jthis);
  52. DBC *dbc_ret = NULL;
  53. if (!verify_non_null(jnienv, dbc))
  54. return (0);
  55. err = dbc->c_dup(dbc, &dbc_ret, flags);
  56. if (!verify_return(jnienv, err, 0))
  57. return (0);
  58. return (get_Dbc(jnienv, dbc_ret));
  59. }
  60. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbc_get
  61.   (JNIEnv *jnienv, jobject jthis,
  62.    /*Dbt*/ jobject key, /*Dbt*/ jobject data, jint flags)
  63. {
  64. int err, retry, op_flags;
  65. DBC *dbc;
  66. DB_ENV *dbenv;
  67. LOCKED_DBT lkey, ldata;
  68. OpKind keyop, dataop;
  69. /*
  70.  * Depending on flags, the user may be supplying the key,
  71.  * or else we may have to retrieve it.
  72.  */
  73. err = 0;
  74. keyop = outOp;
  75. dataop = outOp;
  76. op_flags = flags & DB_OPFLAGS_MASK;
  77. if (op_flags == DB_SET) {
  78. keyop = inOp;
  79. }
  80. else if (op_flags == DB_SET_RANGE ||
  81.  op_flags == DB_SET_RECNO) {
  82. keyop = inOutOp;
  83. }
  84. else if (op_flags == DB_GET_BOTH || op_flags == DB_GET_BOTH_RANGE) {
  85. keyop = inOutOp;
  86. dataop = inOutOp;
  87. }
  88. dbc = get_DBC(jnienv, jthis);
  89. if (!verify_non_null(jnienv, dbc))
  90. return (0);
  91. dbenv = dbc->dbp->dbenv;
  92. if (locked_dbt_get(&lkey, jnienv, dbenv, key, keyop) != 0)
  93. goto out2;
  94. if (locked_dbt_get(&ldata, jnienv, dbenv, data, dataop) != 0)
  95. goto out1;
  96. if (!verify_non_null(jnienv, dbc))
  97. goto out1;
  98. for (retry = 0; retry < 3; retry++) {
  99. err = dbc->c_get(dbc,
  100.     &lkey.javainfo->dbt, &ldata.javainfo->dbt, flags);
  101. /*
  102.  * If we failed due to lack of memory in our DBT arrays,
  103.  * retry.
  104.  */
  105. if (err != ENOMEM)
  106. break;
  107. if (!locked_dbt_realloc(&lkey, jnienv,
  108.     dbenv) && !locked_dbt_realloc(&ldata, jnienv, dbenv))
  109. break;
  110. }
  111.  out1:
  112. locked_dbt_put(&ldata, jnienv, dbenv);
  113.  out2:
  114. locked_dbt_put(&lkey, jnienv, dbenv);
  115. if (!DB_RETOK_DBCGET(err)) {
  116. if (verify_dbt(jnienv, err, &lkey) &&
  117.     verify_dbt(jnienv, err, &ldata))
  118. verify_return(jnienv, err, 0);
  119. }
  120. return (err);
  121. }
  122. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbc_pget
  123.   (JNIEnv *jnienv, jobject jthis,
  124.    /*Dbt*/ jobject key, /*Dbt*/ jobject pkey, /*Dbt*/ jobject data, jint flags)
  125. {
  126. int err, retry, op_flags;
  127. DBC *dbc;
  128. DB_ENV *dbenv;
  129. LOCKED_DBT lkey, lpkey, ldata;
  130. OpKind keyop, pkeyop, dataop;
  131. /*
  132.  * Depending on flags, the user may be supplying the key,
  133.  * or else we may have to retrieve it.
  134.  */
  135. err = 0;
  136. keyop = outOp;
  137. pkeyop = outOp;
  138. dataop = outOp;
  139. op_flags = flags & DB_OPFLAGS_MASK;
  140. if (op_flags == DB_SET) {
  141. keyop = inOp;
  142. }
  143. else if (op_flags == DB_SET_RANGE ||
  144.  op_flags == DB_SET_RECNO) {
  145. keyop = inOutOp;
  146. }
  147. else if (op_flags == DB_GET_BOTH || op_flags == DB_GET_BOTH_RANGE) {
  148. pkeyop = inOutOp;
  149. keyop = inOutOp;
  150. dataop = inOutOp;
  151. }
  152. dbc = get_DBC(jnienv, jthis);
  153. if (!verify_non_null(jnienv, dbc))
  154. return (0);
  155. dbenv = dbc->dbp->dbenv;
  156. if (locked_dbt_get(&lkey, jnienv, dbenv, key, keyop) != 0)
  157. goto out3;
  158. if (locked_dbt_get(&lpkey, jnienv, dbenv, pkey, pkeyop) != 0)
  159. goto out2;
  160. if (locked_dbt_get(&ldata, jnienv, dbenv, data, dataop) != 0)
  161. goto out1;
  162. if (!verify_non_null(jnienv, dbc))
  163. goto out1;
  164. for (retry = 0; retry < 3; retry++) {
  165. err = dbc->c_pget(dbc, &lkey.javainfo->dbt,
  166. &lpkey.javainfo->dbt, &ldata.javainfo->dbt, flags);
  167. /*
  168.  * If we failed due to lack of memory in our DBT arrays,
  169.  * retry.
  170.  */
  171. if (err != ENOMEM)
  172. break;
  173. if (!locked_dbt_realloc(&lkey, jnienv, dbenv) &&
  174.     !locked_dbt_realloc(&lpkey, jnienv, dbenv) &&
  175.     !locked_dbt_realloc(&ldata, jnienv, dbenv))
  176. break;
  177. }
  178.  out1:
  179. locked_dbt_put(&ldata, jnienv, dbenv);
  180.  out2:
  181. locked_dbt_put(&lpkey, jnienv, dbenv);
  182.  out3:
  183. locked_dbt_put(&lkey, jnienv, dbenv);
  184. if (!DB_RETOK_DBCGET(err)) {
  185. if (verify_dbt(jnienv, err, &lkey) &&
  186.     verify_dbt(jnienv, err, &lpkey) &&
  187.     verify_dbt(jnienv, err, &ldata))
  188. verify_return(jnienv, err, 0);
  189. }
  190. return (err);
  191. }
  192. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbc_put
  193.   (JNIEnv *jnienv, jobject jthis,
  194.    /*Dbt*/ jobject key, /*Dbt*/ jobject data, jint flags)
  195. {
  196. int err;
  197. DBC *dbc;
  198. DB_ENV *dbenv;
  199. LOCKED_DBT lkey, ldata;
  200. OpKind keyop;
  201. err = 0;
  202. dbc = get_DBC(jnienv, jthis);
  203. if (!verify_non_null(jnienv, dbc))
  204. return (0);
  205. dbenv = dbc->dbp->dbenv;
  206. keyop = (dbc->dbp->type == DB_RECNO &&
  207.     (flags == DB_BEFORE || flags == DB_AFTER)) ? outOp : inOp;
  208. if (locked_dbt_get(&lkey, jnienv, dbenv, key, keyop) != 0)
  209. goto out2;
  210. if (locked_dbt_get(&ldata, jnienv, dbenv, data, inOp) != 0)
  211. goto out1;
  212. if (!verify_non_null(jnienv, dbc))
  213. goto out1;
  214. err = dbc->c_put(dbc, &lkey.javainfo->dbt, &ldata.javainfo->dbt, flags);
  215. if (!DB_RETOK_DBCPUT(err))
  216. verify_return(jnienv, err, 0);
  217.  out1:
  218. locked_dbt_put(&ldata, jnienv, dbenv);
  219.  out2:
  220. locked_dbt_put(&lkey, jnienv, dbenv);
  221. return (err);
  222. }
  223. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbc_finalize
  224.   (JNIEnv *jnienv, jobject jthis)
  225. {
  226. /*
  227.  * Free any data related to DBC here.
  228.  * If we ever have java-only data embedded in the DBC
  229.  * and need to do this, we'll have to track Dbc's
  230.  * according to which Db owns them, just as
  231.  * we track Db's according to which DbEnv owns them.
  232.  * That's necessary to avoid double freeing that
  233.  * comes about when closes interact with GC.
  234.  */
  235. #ifdef DIAGNOSTIC
  236. DBC *dbc;
  237. dbc = get_DBC(jnienv, jthis);
  238. if (dbc != NULL)
  239. fprintf(stderr, "Java API: Dbc has not been closedn");
  240. #else
  241. COMPQUIET(jnienv, NULL);
  242. COMPQUIET(jthis, NULL);
  243. #endif
  244. }