java_Dbc.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  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.10 2000/10/25 19:54:55 dda 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.h"
  19. #include "db_int.h"
  20. #include "java_util.h"
  21. #include "com_sleepycat_db_Dbc.h"
  22. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbc_close
  23.   (JNIEnv *jnienv, jobject jthis)
  24. {
  25. int err;
  26. DBC *dbc = get_DBC(jnienv, jthis);
  27. if (!verify_non_null(jnienv, dbc))
  28. return;
  29. err = dbc->c_close(dbc);
  30. if (verify_return(jnienv, err, 0)) {
  31. set_private_dbobj(jnienv, name_DBC, jthis, 0);
  32. }
  33. }
  34. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbc_count
  35.   (JNIEnv *jnienv, jobject jthis, jint flags)
  36. {
  37. int err;
  38. DBC *dbc = get_DBC(jnienv, jthis);
  39. db_recno_t count;
  40. if (!verify_non_null(jnienv, dbc))
  41. return (0);
  42. err = dbc->c_count(dbc, &count, flags);
  43. verify_return(jnienv, err, 0);
  44. return (count);
  45. }
  46. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbc_del
  47.   (JNIEnv *jnienv, jobject jthis, jint flags)
  48. {
  49. int err;
  50. DBC *dbc = get_DBC(jnienv, jthis);
  51. if (!verify_non_null(jnienv, dbc))
  52. return (0);
  53. err = dbc->c_del(dbc, flags);
  54. if (err != DB_KEYEMPTY) {
  55. verify_return(jnienv, err, 0);
  56. }
  57. return (err);
  58. }
  59. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_Dbc_dup
  60.   (JNIEnv *jnienv, jobject jthis, jint flags)
  61. {
  62. int err;
  63. DBC *dbc = get_DBC(jnienv, jthis);
  64. DBC *dbc_ret = NULL;
  65. if (!verify_non_null(jnienv, dbc))
  66. return (0);
  67. err = dbc->c_dup(dbc, &dbc_ret, flags);
  68. if (!verify_return(jnienv, err, 0))
  69. return (0);
  70. return (get_Dbc(jnienv, dbc_ret));
  71. }
  72. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbc_get
  73.   (JNIEnv *jnienv, jobject jthis,
  74.    /*Dbt*/ jobject key, /*Dbt*/ jobject data, jint flags)
  75. {
  76. int err, retry, op_flags;
  77. DBC *dbc;
  78. JDBT dbkey, dbdata;
  79. OpKind keyop, dataop;
  80. /* Depending on flags, the user may be supplying the key,
  81.  * or else we may have to retrieve it.
  82.  */
  83. err = 0;
  84. keyop = outOp;
  85. dataop = outOp;
  86. op_flags = flags & DB_OPFLAGS_MASK;
  87. if (op_flags == DB_SET) {
  88. keyop = inOp;
  89. }
  90. else if (op_flags == DB_SET_RANGE ||
  91.  op_flags == DB_SET_RECNO) {
  92. keyop = inOutOp;
  93. }
  94. else if (op_flags == DB_GET_BOTH) {
  95. keyop = inOutOp;
  96. dataop = inOutOp;
  97. }
  98. dbc = get_DBC(jnienv, jthis);
  99. if (jdbt_lock(&dbkey, jnienv, key, keyop) != 0)
  100. goto out2;
  101. if (jdbt_lock(&dbdata, jnienv, data, dataop) != 0)
  102. goto out1;
  103. if (!verify_non_null(jnienv, dbc))
  104. goto out1;
  105. for (retry = 0; retry < 3; retry++) {
  106. err = dbc->c_get(dbc, &dbkey.dbt->dbt, &dbdata.dbt->dbt, flags);
  107. /* If we failed due to lack of memory in our DBT arrays,
  108.  * retry.
  109.  */
  110. if (err != ENOMEM)
  111. break;
  112. if (!jdbt_realloc(&dbkey, jnienv) && !jdbt_realloc(&dbdata, jnienv))
  113. break;
  114. }
  115. if (err != DB_NOTFOUND) {
  116. verify_return(jnienv, err, 0);
  117. }
  118.  out1:
  119. jdbt_unlock(&dbdata, jnienv);
  120.  out2:
  121. jdbt_unlock(&dbkey, jnienv);
  122. return (err);
  123. }
  124. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbc_put
  125.   (JNIEnv *jnienv, jobject jthis,
  126.    /*Dbt*/ jobject key, /*Dbt*/ jobject data, jint flags)
  127. {
  128. int err;
  129. DBC *dbc;
  130. JDBT dbkey, dbdata;
  131. err = 0;
  132. dbc = get_DBC(jnienv, jthis);
  133. if (jdbt_lock(&dbkey, jnienv, key, inOp) != 0)
  134. goto out2;
  135. if (jdbt_lock(&dbdata, jnienv, data, inOp) != 0)
  136. goto out1;
  137. if (!verify_non_null(jnienv, dbc))
  138. goto out1;
  139. err = dbc->c_put(dbc, &dbkey.dbt->dbt, &dbdata.dbt->dbt, flags);
  140. if (err != DB_KEYEXIST) {
  141. verify_return(jnienv, err, 0);
  142. }
  143.  out1:
  144. jdbt_unlock(&dbdata, jnienv);
  145.  out2:
  146. jdbt_unlock(&dbkey, jnienv);
  147. return (err);
  148. }
  149. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbc_finalize
  150.   (JNIEnv *jnienv, jobject jthis)
  151. {
  152. /* Free any data related to DBC here.
  153.  * If we ever have java-only data embedded in the DBC
  154.  * and need to do this, we'll have to track Dbc's
  155.  * according to which Db owns them, just as
  156.  * we track Db's according to which DbEnv owns them.
  157.  * That's necessary to avoid double freeing that
  158.  * comes about when closes interact with GC.
  159.  */
  160. #ifdef DIAGNOSTIC
  161. DBC *dbc;
  162. dbc = get_DBC(jnienv, jthis);
  163. if (dbc != NULL)
  164. fprintf(stderr, "Java API: Dbc has not been closedn");
  165. #else
  166. COMPQUIET(jnienv, NULL);
  167. COMPQUIET(jthis, NULL);
  168. #endif
  169. }