java_Dbt.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_Dbt.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. #include "db.h"
  16. #include "java_util.h"
  17. #include "com_sleepycat_db_Dbt.h"
  18. JAVADB_RW_ACCESS(Dbt, jint, size, DBT, size)
  19. JAVADB_RW_ACCESS(Dbt, jint, ulen, DBT, ulen)
  20. JAVADB_RW_ACCESS(Dbt, jint, dlen, DBT, dlen)
  21. JAVADB_RW_ACCESS(Dbt, jint, doff, DBT, doff)
  22. JAVADB_RW_ACCESS(Dbt, jint, flags, DBT, flags)
  23. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbt_init
  24.   (JNIEnv *jnienv, jobject jthis)
  25. {
  26. DBT_JAVAINFO *dbtji;
  27. dbtji = dbjit_construct();
  28. set_private_dbobj(jnienv, name_DBT, jthis, dbtji);
  29. }
  30. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbt_internal_1set_1data
  31.   (JNIEnv *jnienv, jobject jthis, jbyteArray array)
  32. {
  33. DBT_JAVAINFO *db_this;
  34. db_this = get_DBT_JAVAINFO(jnienv, jthis);
  35. if (verify_non_null(jnienv, db_this)) {
  36. /* If we previously allocated an array for java,
  37.  * must release reference.
  38.  */
  39. dbjit_release(db_this, jnienv);
  40. /* Make the array a global ref,
  41.  * it won't be GC'd till we release it.
  42.  */
  43. if (array)
  44. array = (jbyteArray)NEW_GLOBAL_REF(jnienv, array);
  45. db_this->array_ = array;
  46. }
  47. }
  48. JNIEXPORT jbyteArray JNICALL Java_com_sleepycat_db_Dbt_get_1data
  49.   (JNIEnv *jnienv, jobject jthis)
  50. {
  51. DBT_JAVAINFO *db_this;
  52. jbyteArray arr;
  53. int len;
  54. db_this = get_DBT_JAVAINFO(jnienv, jthis);
  55. if (verify_non_null(jnienv, db_this)) {
  56. /* XXX this will copy the data on each call to get_data,
  57.  * even if it is unchanged.
  58.  */
  59. if (db_this->create_array_ != 0) {
  60. /* XXX we should reuse the existing array if we can */
  61. len = db_this->dbt.size;
  62. if (db_this->array_ != NULL)
  63. DELETE_GLOBAL_REF(jnienv, db_this->array_);
  64. arr = (*jnienv)->NewByteArray(jnienv, len);
  65. db_this->array_ =
  66. (jbyteArray)NEW_GLOBAL_REF(jnienv, arr);
  67. (*jnienv)->SetByteArrayRegion(jnienv, arr, 0, len,
  68.       db_this->dbt.data);
  69. }
  70. return (db_this->array_);
  71. }
  72. return (0);
  73. }
  74. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbt_set_1offset
  75.   (JNIEnv *jnienv, jobject jthis, jint offset)
  76. {
  77. DBT_JAVAINFO *db_this;
  78. db_this = get_DBT_JAVAINFO(jnienv, jthis);
  79. if (verify_non_null(jnienv, db_this)) {
  80. db_this->offset_ = offset;
  81. }
  82. }
  83. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbt_get_1offset
  84.   (JNIEnv *jnienv, jobject jthis)
  85. {
  86. DBT_JAVAINFO *db_this;
  87. db_this = get_DBT_JAVAINFO(jnienv, jthis);
  88. if (verify_non_null(jnienv, db_this)) {
  89. return db_this->offset_;
  90. }
  91. return (0);
  92. }
  93. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbt_set_1recno_1key_1data(JNIEnv *jnienv, jobject jthis, jint value)
  94. {
  95. JDBT jdbt;
  96. if (jdbt_lock(&jdbt, jnienv, jthis, inOp) != 0)
  97. goto out;
  98. if (!jdbt.dbt->dbt.data ||
  99.     jdbt.java_array_len_ < sizeof(db_recno_t)) {
  100. char buf[200];
  101. sprintf(buf, "set_recno_key_data error: %p %p %d %d",
  102. &jdbt.dbt->dbt, jdbt.dbt->dbt.data,
  103. jdbt.dbt->dbt.ulen, sizeof(db_recno_t));
  104. report_exception(jnienv, buf, 0, 0);
  105. }
  106. else {
  107. *(db_recno_t*)(jdbt.dbt->dbt.data) = value;
  108. }
  109.  out:
  110. jdbt_unlock(&jdbt, jnienv);
  111. }
  112. JNIEXPORT jint JNICALL Java_com_sleepycat_db_Dbt_get_1recno_1key_1data(JNIEnv *jnienv, jobject jthis)
  113. {
  114. jint ret;
  115. JDBT jdbt;
  116. ret = 0;
  117. /* Although this is kind of like "retrieve", we don't support
  118.  * DB_DBT_MALLOC for this operation, so we tell jdbt_lock
  119.  * that is not a retrieve.
  120.  */
  121. if (jdbt_lock(&jdbt, jnienv, jthis, inOp) != 0)
  122. goto out;
  123. if (!jdbt.dbt->dbt.data ||
  124.     jdbt.java_array_len_ < sizeof(db_recno_t)) {
  125. char buf[200];
  126. sprintf(buf, "get_recno_key_data error: %p %p %d %d",
  127. &jdbt.dbt->dbt, jdbt.dbt->dbt.data,
  128. jdbt.dbt->dbt.ulen, sizeof(db_recno_t));
  129. report_exception(jnienv, buf, 0, 0);
  130. }
  131. else {
  132. ret = *(db_recno_t*)(jdbt.dbt->dbt.data);
  133. }
  134.  out:
  135. jdbt_unlock(&jdbt, jnienv);
  136. return (ret);
  137. }
  138. JNIEXPORT void JNICALL Java_com_sleepycat_db_Dbt_finalize
  139.   (JNIEnv *jnienv, jobject jthis)
  140. {
  141. DBT_JAVAINFO *dbtji;
  142. dbtji = get_DBT_JAVAINFO(jnienv, jthis);
  143. if (dbtji) {
  144. /* Free any data related to DBT here */
  145. dbjit_release(dbtji, jnienv);
  146. /* Extra paranoia */
  147. memset(dbtji, 0, sizeof(DBT_JAVAINFO));
  148. free(dbtji);
  149. }
  150. }