diff options
Diffstat (limited to 'bdb/libdb_java/java_DbLogc.c')
-rw-r--r-- | bdb/libdb_java/java_DbLogc.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/bdb/libdb_java/java_DbLogc.c b/bdb/libdb_java/java_DbLogc.c new file mode 100644 index 00000000000..69294d9baac --- /dev/null +++ b/bdb/libdb_java/java_DbLogc.c @@ -0,0 +1,110 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1997-2002 + * Sleepycat Software. All rights reserved. + */ +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: java_DbLogc.c,v 11.6 2002/07/02 12:03:03 mjc Exp $"; +#endif /* not lint */ + +#include <jni.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#ifdef DIAGNOSTIC +#include <stdio.h> +#endif + +#include "db_int.h" +#include "java_util.h" +#include "com_sleepycat_db_DbLogc.h" + +JNIEXPORT void JNICALL Java_com_sleepycat_db_DbLogc_close + (JNIEnv *jnienv, jobject jthis, jint flags) +{ + int err; + DB_LOGC *dblogc = get_DB_LOGC(jnienv, jthis); + + if (!verify_non_null(jnienv, dblogc)) + return; + err = dblogc->close(dblogc, flags); + if (verify_return(jnienv, err, 0)) { + set_private_dbobj(jnienv, name_DB_LOGC, jthis, 0); + } +} + +JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbLogc_get + (JNIEnv *jnienv, jobject jthis, + /*DbLsn*/ jobject lsn, /*Dbt*/ jobject data, jint flags) +{ + int err, retry; + DB_LOGC *dblogc; + DB_LSN *dblsn; + LOCKED_DBT ldata; + OpKind dataop; + + /* + * Depending on flags, the user may be supplying the key, + * or else we may have to retrieve it. + */ + err = 0; + dataop = outOp; + + dblogc = get_DB_LOGC(jnienv, jthis); + dblsn = get_DB_LSN(jnienv, lsn); + if (locked_dbt_get(&ldata, jnienv, dblogc->dbenv, data, dataop) != 0) + goto out1; + + if (!verify_non_null(jnienv, dblogc)) + goto out1; + + for (retry = 0; retry < 3; retry++) { + err = dblogc->get(dblogc, dblsn, &ldata.javainfo->dbt, flags); + + /* + * If we failed due to lack of memory in our DBT arrays, + * retry. + */ + if (err != ENOMEM) + break; + if (!locked_dbt_realloc(&ldata, jnienv, dblogc->dbenv)) + break; + } + out1: + locked_dbt_put(&ldata, jnienv, dblogc->dbenv); + if (!DB_RETOK_LGGET(err)) { + if (verify_dbt(jnienv, err, &ldata)) + verify_return(jnienv, err, 0); + } + return (err); +} + +JNIEXPORT void JNICALL Java_com_sleepycat_db_DbLogc_finalize + (JNIEnv *jnienv, jobject jthis) +{ + /* + * Free any data related to DB_LOGC here. + * If we ever have java-only data embedded in the DB_LOGC + * and need to do this, we'll have to track DbLogc's + * according to which DbEnv owns them, just as + * we track Db's according to which DbEnv owns them. + * That's necessary to avoid double freeing that + * comes about when closes interact with GC. + */ + +#ifdef DIAGNOSTIC + DB_LOGC *dblogc; + + dblogc = get_DB_LOGC(jnienv, jthis); + if (dblogc != NULL) + fprintf(stderr, "Java API: DbLogc has not been closed\n"); +#else + + COMPQUIET(jnienv, NULL); + COMPQUIET(jthis, NULL); + +#endif +} |