📄 java_dbenv.c
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1997-2002 * Sleepycat Software. All rights reserved. */#include "db_config.h"#ifndef lintstatic const char revid[] = "$Id: java_DbEnv.c,v 11.105 2002/08/29 14:22:23 margo Exp $";#endif /* not lint */#include <jni.h>#include <stdlib.h>#include <string.h>#include "db_int.h"#include "java_util.h"#include "java_stat_auto.h"#include "com_sleepycat_db_DbEnv.h"/* We keep these lined up, and alphabetical by field name, * for comparison with C++'s list. */JAVADB_SET_METH_STR(DbEnv, data_1dir, DB_ENV, data_dir)JAVADB_SET_METH(DbEnv, jint, lg_1bsize, DB_ENV, lg_bsize)JAVADB_SET_METH_STR(DbEnv, lg_1dir, DB_ENV, lg_dir)JAVADB_SET_METH(DbEnv, jint, lg_1max, DB_ENV, lg_max)JAVADB_SET_METH(DbEnv, jint, lg_1regionmax, DB_ENV, lg_regionmax)JAVADB_SET_METH(DbEnv, jint, lk_1detect, DB_ENV, lk_detect)JAVADB_SET_METH(DbEnv, jint, lk_1max, DB_ENV, lk_max)JAVADB_SET_METH(DbEnv, jint, lk_1max_1locks, DB_ENV, lk_max_locks)JAVADB_SET_METH(DbEnv, jint, lk_1max_1lockers, DB_ENV, lk_max_lockers)JAVADB_SET_METH(DbEnv, jint, lk_1max_1objects, DB_ENV, lk_max_objects)/* mp_mmapsize is declared below, it needs an extra cast */JAVADB_SET_METH_STR(DbEnv, tmp_1dir, DB_ENV, tmp_dir)JAVADB_SET_METH(DbEnv, jint, tx_1max, DB_ENV, tx_max)static void DbEnv_errcall_callback(const char *prefix, char *message){ JNIEnv *jnienv; DB_ENV_JAVAINFO *envinfo = (DB_ENV_JAVAINFO *)prefix; jstring pre; /* * Note: these error cases are "impossible", and would * normally warrant an exception. However, without * a jnienv, we cannot throw an exception... * We don't want to trap or exit, since the point of * this facility is for the user to completely control * error situations. */ if (envinfo == NULL) { /* * Something is *really* wrong here, the * prefix is set in every environment created. */ fprintf(stderr, "Error callback failed!\n"); fprintf(stderr, "error: %s\n", message); return; } /* Should always succeed... */ jnienv = dbjie_get_jnienv(envinfo); if (jnienv == NULL) { /* But just in case... */ fprintf(stderr, "Cannot attach to current thread!\n"); fprintf(stderr, "error: %s\n", message); return; } pre = dbjie_get_errpfx(envinfo, jnienv); report_errcall(jnienv, dbjie_get_errcall(envinfo), pre, message);}static void DbEnv_initialize(JNIEnv *jnienv, DB_ENV *dbenv, /*DbEnv*/ jobject jenv, /*DbErrcall*/ jobject jerrcall, int is_dbopen){ DB_ENV_JAVAINFO *envinfo; envinfo = get_DB_ENV_JAVAINFO(jnienv, jenv); DB_ASSERT(envinfo == NULL); envinfo = dbjie_construct(jnienv, jenv, jerrcall, is_dbopen); set_private_info(jnienv, name_DB_ENV, jenv, envinfo); dbenv->set_errpfx(dbenv, (const char*)envinfo); dbenv->set_errcall(dbenv, DbEnv_errcall_callback); dbenv->api2_internal = envinfo; set_private_dbobj(jnienv, name_DB_ENV, jenv, dbenv);}/* * This is called when this DbEnv was made on behalf of a Db * created directly (without a parent DbEnv), and the Db is * being closed. We'll zero out the pointer to the DB_ENV, * since it is no longer valid, to prevent mistakes. */JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1notify_1db_1close (JNIEnv *jnienv, /*DbEnv*/ jobject jthis){ DB_ENV_JAVAINFO *dbenvinfo; set_private_dbobj(jnienv, name_DB_ENV, jthis, 0); dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis); if (dbenvinfo != NULL) dbjie_dealloc(dbenvinfo, jnienv);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_feedback_1changed (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbEnvFeedback*/ jobject jfeedback){ DB_ENV *dbenv; DB_ENV_JAVAINFO *dbenvinfo; dbenv = get_DB_ENV(jnienv, jthis); dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis); if (!verify_non_null(jnienv, dbenv) || !verify_non_null(jnienv, dbenvinfo)) return; dbjie_set_feedback_object(dbenvinfo, jnienv, dbenv, jfeedback);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1init (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobject /*DbErrcall*/ jerrcall, jint flags){ int err; DB_ENV *dbenv; err = db_env_create(&dbenv, flags); if (verify_return(jnienv, err, 0)) DbEnv_initialize(jnienv, dbenv, jthis, jerrcall, 0);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1init_1using_1db (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobject /*DbErrcall*/ jerrcall, /*Db*/ jobject jdb){ DB_ENV *dbenv; DB *db; db = get_DB(jnienv, jdb); dbenv = db->dbenv; DbEnv_initialize(jnienv, dbenv, jthis, jerrcall, 0);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_open (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring db_home, jint flags, jint mode){ int err; DB_ENV *dbenv; LOCKED_STRING ls_home; DB_ENV_JAVAINFO *dbenvinfo; dbenv = get_DB_ENV(jnienv, jthis); dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis); if (!verify_non_null(jnienv, dbenv) || !verify_non_null(jnienv, dbenvinfo)) return; if (locked_string_get(&ls_home, jnienv, db_home) != 0) goto out; /* Java is assumed to be threaded. */ flags |= DB_THREAD; err = dbenv->open(dbenv, ls_home.string, flags, mode); verify_return(jnienv, err, EXCEPTION_FILE_NOT_FOUND); out: locked_string_put(&ls_home, jnienv);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_remove (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring db_home, jint flags){ DB_ENV *dbenv; DB_ENV_JAVAINFO *dbenvinfo; LOCKED_STRING ls_home; int err = 0; dbenv = get_DB_ENV(jnienv, jthis); dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis); if (!verify_non_null(jnienv, dbenv)) return; if (locked_string_get(&ls_home, jnienv, db_home) != 0) goto out; err = dbenv->remove(dbenv, ls_home.string, flags); set_private_dbobj(jnienv, name_DB_ENV, jthis, 0); verify_return(jnienv, err, 0); out: locked_string_put(&ls_home, jnienv); if (dbenvinfo != NULL) dbjie_dealloc(dbenvinfo, jnienv);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1close (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags){ int err; DB_ENV *dbenv; DB_ENV_JAVAINFO *dbenvinfo; dbenv = get_DB_ENV(jnienv, jthis); dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis); if (!verify_non_null(jnienv, dbenv)) return; err = dbenv->close(dbenv, flags); set_private_dbobj(jnienv, name_DB_ENV, jthis, 0); if (dbenvinfo != NULL) dbjie_dealloc(dbenvinfo, jnienv); /* Throw an exception if the close failed. */ verify_return(jnienv, err, 0);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_dbremove (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbTxn*/ jobject jtxn, jstring name, jstring subdb, jint flags){ LOCKED_STRING ls_name, ls_subdb; DB_ENV *dbenv; DB_TXN *txn; int err; dbenv = get_DB_ENV(jnienv, jthis); if (!verify_non_null(jnienv, dbenv)) return; txn = get_DB_TXN(jnienv, jtxn); if (locked_string_get(&ls_name, jnienv, name) != 0) return; if (locked_string_get(&ls_subdb, jnienv, subdb) != 0) goto err1; err = dbenv->dbremove(dbenv, txn, ls_name.string, ls_subdb.string, flags); /* Throw an exception if the dbremove failed. */ verify_return(jnienv, err, 0); locked_string_put(&ls_subdb, jnienv);err1: locked_string_put(&ls_name, jnienv);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_dbrename (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbTxn*/ jobject jtxn, jstring name, jstring subdb, jstring newname, jint flags){ LOCKED_STRING ls_name, ls_subdb, ls_newname; DB_ENV *dbenv; DB_TXN *txn; int err; dbenv = get_DB_ENV(jnienv, jthis); if (!verify_non_null(jnienv, dbenv)) return; txn = get_DB_TXN(jnienv, jtxn); if (locked_string_get(&ls_name, jnienv, name) != 0) return; if (locked_string_get(&ls_subdb, jnienv, subdb) != 0) goto err2; if (locked_string_get(&ls_newname, jnienv, newname) != 0) goto err1; err = dbenv->dbrename(dbenv, txn, ls_name.string, ls_subdb.string, ls_newname.string, flags); /* Throw an exception if the dbrename failed. */ verify_return(jnienv, err, 0); locked_string_put(&ls_newname, jnienv);err1: locked_string_put(&ls_subdb, jnienv);err2: locked_string_put(&ls_name, jnienv);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_err (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint ecode, jstring msg){ LOCKED_STRING ls_msg; DB_ENV *dbenv; dbenv = get_DB_ENV(jnienv, jthis); if (!verify_non_null(jnienv, dbenv)) return; if (locked_string_get(&ls_msg, jnienv, msg) != 0) goto out; dbenv->err(dbenv, ecode, "%s", ls_msg.string); out: locked_string_put(&ls_msg, jnienv);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_errx (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring msg){ LOCKED_STRING ls_msg; DB_ENV *dbenv; dbenv = get_DB_ENV(jnienv, jthis); if (!verify_non_null(jnienv, dbenv)) return; if (locked_string_get(&ls_msg, jnienv, msg) != 0) goto out; dbenv->errx(dbenv, "%s", ls_msg.string); out: locked_string_put(&ls_msg, jnienv);}/*static*/JNIEXPORT jstring JNICALL Java_com_sleepycat_db_DbEnv_strerror (JNIEnv *jnienv, jclass jthis_class, jint ecode){ const char *message; COMPQUIET(jthis_class, NULL); message = db_strerror(ecode); return (get_java_string(jnienv, message));}JAVADB_METHOD(DbEnv_set_1cachesize, (JAVADB_ARGS, jint gbytes, jint bytes, jint ncaches), DB_ENV, set_cachesize, (c_this, gbytes, bytes, ncaches))JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_set_1encrypt (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring jpasswd, jint flags){ int err; DB_ENV *dbenv; LOCKED_STRING ls_passwd; dbenv = get_DB_ENV(jnienv, jthis); if (!verify_non_null(jnienv, dbenv)) return; if (locked_string_get(&ls_passwd, jnienv, jpasswd) != 0) goto out; err = dbenv->set_encrypt(dbenv, ls_passwd.string, flags); verify_return(jnienv, err, 0);out: locked_string_put(&ls_passwd, jnienv);}JAVADB_METHOD(DbEnv_set_1flags, (JAVADB_ARGS, jint flags, jboolean onoff), DB_ENV, set_flags, (c_this, flags, onoff ? 1 : 0))JAVADB_METHOD(DbEnv_set_1mp_1mmapsize, (JAVADB_ARGS, jlong value), DB_ENV, set_mp_mmapsize, (c_this, (size_t)value))JAVADB_METHOD(DbEnv_set_1tas_1spins, (JAVADB_ARGS, jint spins), DB_ENV, set_tas_spins, (c_this, (u_int32_t)spins))JAVADB_METHOD(DbEnv_set_1timeout, (JAVADB_ARGS, jlong timeout, jint flags), DB_ENV, set_timeout, (c_this, (u_int32_t)timeout, flags))JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_set_1lk_1conflicts (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobjectArray array){ DB_ENV *dbenv; DB_ENV_JAVAINFO *dbenvinfo; int err; jsize i, len; u_char *newarr; int bytesize; dbenv = get_DB_ENV(jnienv, jthis); dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis); if (!verify_non_null(jnienv, dbenv) || !verify_non_null(jnienv, dbenvinfo)) return; len = (*jnienv)->GetArrayLength(jnienv, array); bytesize = sizeof(u_char) * len * len; if ((err = __os_malloc(dbenv, bytesize, &newarr)) != 0) { if (!verify_return(jnienv, err, 0)) return; } for (i=0; i<len; i++) { jobject subArray = (*jnienv)->GetObjectArrayElement(jnienv, array, i); (*jnienv)->GetByteArrayRegion(jnienv, (jbyteArray)subArray, 0, len, (jbyte *)&newarr[i*len]); } dbjie_set_conflict(dbenvinfo, newarr, bytesize); err = dbenv->set_lk_conflicts(dbenv, newarr, len); verify_return(jnienv, err, 0);}JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_rep_1elect (JNIEnv *jnienv, /* DbEnv */ jobject jthis, jint nsites, jint pri, jint timeout){ DB_ENV *dbenv; int err, id; if (!verify_non_null(jnienv, jthis)) return (DB_EID_INVALID); dbenv = get_DB_ENV(jnienv, jthis); err = dbenv->rep_elect(dbenv, (int)nsites, (int)pri, (u_int32_t)timeout, &id); verify_return(jnienv, err, 0); return ((jint)id);}JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_rep_1process_1message (JNIEnv *jnienv, /* DbEnv */ jobject jthis, /* Dbt */ jobject control, /* Dbt */ jobject rec, /* RepProcessMessage */ jobject result){ DB_ENV *dbenv; LOCKED_DBT cdbt, rdbt; int err, envid; if (!verify_non_null(jnienv, jthis) || !verify_non_null(jnienv, result)) return (-1); dbenv = get_DB_ENV(jnienv, jthis); err = 0; /* The DBTs are always inputs. */ if (locked_dbt_get(&cdbt, jnienv, dbenv, control, inOp) != 0) goto out2; if (locked_dbt_get(&rdbt, jnienv, dbenv, rec, inOp) != 0) goto out1; envid = (*jnienv)->GetIntField(jnienv, result, fid_RepProcessMessage_envid); err = dbenv->rep_process_message(dbenv, &cdbt.javainfo->dbt, &rdbt.javainfo->dbt, &envid); if (err == DB_REP_NEWMASTER) (*jnienv)->SetIntField(jnienv, result, fid_RepProcessMessage_envid, envid); else if (!DB_RETOK_REPPMSG(err)) verify_return(jnienv, err, 0);out1: locked_dbt_put(&rdbt, jnienv, dbenv);out2: locked_dbt_put(&cdbt, jnienv, dbenv); return (err);}JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_rep_1start (JNIEnv *jnienv, /* DbEnv */ jobject jthis, /* Dbt */ jobject cookie, jint flags){ DB_ENV *dbenv; DBT *dbtp; LOCKED_DBT ldbt; int err; if (!verify_non_null(jnienv, jthis)) return; dbenv = get_DB_ENV(jnienv, jthis); /* The Dbt cookie may be null; if so, pass in a NULL DBT. */ if (cookie != NULL) { if (locked_dbt_get(&ldbt, jnienv, dbenv, cookie, inOp) != 0) goto out; dbtp = &ldbt.javainfo->dbt; } else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -