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

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_DbLogc.c,v 11.6 2002/07/02 12:03:03 mjc 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_DbLogc.h"
  21. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbLogc_close
  22.   (JNIEnv *jnienv, jobject jthis, jint flags)
  23. {
  24. int err;
  25. DB_LOGC *dblogc = get_DB_LOGC(jnienv, jthis);
  26. if (!verify_non_null(jnienv, dblogc))
  27. return;
  28. err = dblogc->close(dblogc, flags);
  29. if (verify_return(jnienv, err, 0)) {
  30. set_private_dbobj(jnienv, name_DB_LOGC, jthis, 0);
  31. }
  32. }
  33. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbLogc_get
  34.   (JNIEnv *jnienv, jobject jthis,
  35.    /*DbLsn*/ jobject lsn, /*Dbt*/ jobject data, jint flags)
  36. {
  37. int err, retry;
  38. DB_LOGC *dblogc;
  39. DB_LSN *dblsn;
  40. LOCKED_DBT ldata;
  41. OpKind dataop;
  42. /*
  43.  * Depending on flags, the user may be supplying the key,
  44.  * or else we may have to retrieve it.
  45.  */
  46. err = 0;
  47. dataop = outOp;
  48. dblogc = get_DB_LOGC(jnienv, jthis);
  49. dblsn = get_DB_LSN(jnienv, lsn);
  50. if (locked_dbt_get(&ldata, jnienv, dblogc->dbenv, data, dataop) != 0)
  51. goto out1;
  52. if (!verify_non_null(jnienv, dblogc))
  53. goto out1;
  54. for (retry = 0; retry < 3; retry++) {
  55. err = dblogc->get(dblogc, dblsn, &ldata.javainfo->dbt, flags);
  56. /*
  57.  * If we failed due to lack of memory in our DBT arrays,
  58.  * retry.
  59.  */
  60. if (err != ENOMEM)
  61. break;
  62. if (!locked_dbt_realloc(&ldata, jnienv, dblogc->dbenv))
  63. break;
  64. }
  65.  out1:
  66. locked_dbt_put(&ldata, jnienv, dblogc->dbenv);
  67. if (!DB_RETOK_LGGET(err)) {
  68. if (verify_dbt(jnienv, err, &ldata))
  69. verify_return(jnienv, err, 0);
  70. }
  71. return (err);
  72. }
  73. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbLogc_finalize
  74.   (JNIEnv *jnienv, jobject jthis)
  75. {
  76. /*
  77.  * Free any data related to DB_LOGC here.
  78.  * If we ever have java-only data embedded in the DB_LOGC
  79.  * and need to do this, we'll have to track DbLogc's
  80.  * according to which DbEnv owns them, just as
  81.  * we track Db's according to which DbEnv owns them.
  82.  * That's necessary to avoid double freeing that
  83.  * comes about when closes interact with GC.
  84.  */
  85. #ifdef DIAGNOSTIC
  86. DB_LOGC *dblogc;
  87. dblogc = get_DB_LOGC(jnienv, jthis);
  88. if (dblogc != NULL)
  89. fprintf(stderr, "Java API: DbLogc has not been closedn");
  90. #else
  91. COMPQUIET(jnienv, NULL);
  92. COMPQUIET(jthis, NULL);
  93. #endif
  94. }