📄 java_db.c
字号:
goto out4; dbenv = db->dbenv; /* Depending on flags, the key may be input/output. */ keyop = inOp; rkeyop = outOp; dataop = outOp; op_flags = flags & DB_OPFLAGS_MASK; if (op_flags == DB_SET_RECNO) { keyop = inOutOp; } else if (op_flags == DB_GET_BOTH) { keyop = inOutOp; rkeyop = inOutOp; dataop = inOutOp; } dbtxnid = get_DB_TXN(jnienv, txnid); if (locked_dbt_get(&lkey, jnienv, dbenv, key, keyop) != 0) goto out3; if (locked_dbt_get(&lrkey, jnienv, dbenv, rkey, rkeyop) != 0) goto out2; if (locked_dbt_get(&ldata, jnienv, dbenv, data, dataop) != 0) goto out1; for (retry = 0; retry < 3; retry++) { err = db->pget(db, dbtxnid, &lkey.javainfo->dbt, &lrkey.javainfo->dbt, &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(&lkey, jnienv, dbenv) && !locked_dbt_realloc(&lrkey, jnienv, dbenv) && !locked_dbt_realloc(&ldata, jnienv, dbenv)) break; } out1: locked_dbt_put(&ldata, jnienv, dbenv); out2: locked_dbt_put(&lrkey, jnienv, dbenv); out3: locked_dbt_put(&lkey, jnienv, dbenv); out4: if (!DB_RETOK_DBGET(err)) { if (verify_dbt(jnienv, err, &lkey) && verify_dbt(jnienv, err, &lrkey) && verify_dbt(jnienv, err, &ldata)) verify_return(jnienv, err, 0); } return (err);}JNIEXPORT jint JNICALL Java_com_sleepycat_db_Db_put (JNIEnv *jnienv, /*Db*/ jobject jthis, /*DbTxn*/ jobject txnid, /*Dbt*/ jobject key, /*Dbt*/ jobject data, jint flags){ int err; DB *db; DB_ENV *dbenv; DB_TXN *dbtxnid; LOCKED_DBT lkey, ldata; OpKind keyop; err = 0; db = get_DB(jnienv, jthis); dbtxnid = get_DB_TXN(jnienv, txnid); if (!verify_non_null(jnienv, db)) return (0); /* error will be thrown, retval doesn't matter */ dbenv = db->dbenv; /* * For DB_APPEND, the key may be output-only; for all other flags, * it's input-only. */ if ((flags & DB_OPFLAGS_MASK) == DB_APPEND) keyop = outOp; else keyop = inOp; if (locked_dbt_get(&lkey, jnienv, dbenv, key, keyop) != 0) goto out2; if (locked_dbt_get(&ldata, jnienv, dbenv, data, inOp) != 0) goto out1; if (!verify_non_null(jnienv, db)) goto out1; err = db->put(db, dbtxnid, &lkey.javainfo->dbt, &ldata.javainfo->dbt, flags); if (!DB_RETOK_DBPUT(err)) verify_return(jnienv, err, 0); out1: locked_dbt_put(&ldata, jnienv, dbenv); out2: locked_dbt_put(&lkey, jnienv, dbenv); return (err);}JNIEXPORT void JNICALL Java_com_sleepycat_db_Db__1remove (JNIEnv *jnienv, /*Db*/ jobject jthis, jstring file, jstring database, jint flags){ int err; DB *db; DB_JAVAINFO *dbinfo; LOCKED_STRING ls_file; LOCKED_STRING ls_database; db = get_DB(jnienv, jthis); dbinfo = get_DB_JAVAINFO(jnienv, jthis); if (!verify_non_null(jnienv, db)) return; if (locked_string_get(&ls_file, jnienv, file) != 0) goto out2; if (locked_string_get(&ls_database, jnienv, database) != 0) goto out1; err = db->remove(db, ls_file.string, ls_database.string, flags); set_private_dbobj(jnienv, name_DB, jthis, 0); verify_return(jnienv, err, EXCEPTION_FILE_NOT_FOUND); out1: locked_string_put(&ls_database, jnienv); out2: locked_string_put(&ls_file, jnienv); dbji_dealloc(dbinfo, jnienv);}JNIEXPORT void JNICALL Java_com_sleepycat_db_Db__1rename (JNIEnv *jnienv, /*Db*/ jobject jthis, jstring file, jstring database, jstring newname, jint flags){ int err; DB *db; DB_JAVAINFO *dbinfo; LOCKED_STRING ls_file; LOCKED_STRING ls_database; LOCKED_STRING ls_newname; db = get_DB(jnienv, jthis); dbinfo = get_DB_JAVAINFO(jnienv, jthis); if (!verify_non_null(jnienv, db)) return; if (locked_string_get(&ls_file, jnienv, file) != 0) goto out3; if (locked_string_get(&ls_database, jnienv, database) != 0) goto out2; if (locked_string_get(&ls_newname, jnienv, newname) != 0) goto out1; err = db->rename(db, ls_file.string, ls_database.string, ls_newname.string, flags); verify_return(jnienv, err, EXCEPTION_FILE_NOT_FOUND); set_private_dbobj(jnienv, name_DB, jthis, 0); out1: locked_string_put(&ls_newname, jnienv); out2: locked_string_put(&ls_database, jnienv); out3: locked_string_put(&ls_file, jnienv); dbji_dealloc(dbinfo, jnienv);}JAVADB_METHOD(Db_set_1pagesize, (JAVADB_ARGS, jlong pagesize), DB, set_pagesize, (c_this, (u_int32_t)pagesize))JAVADB_METHOD(Db_set_1cachesize, (JAVADB_ARGS, jint gbytes, jint bytes, jint ncaches), DB, set_cachesize, (c_this, gbytes, bytes, ncaches))JAVADB_METHOD(Db_set_1cache_1priority, (JAVADB_ARGS, jint priority), DB, set_cache_priority, (c_this, (DB_CACHE_PRIORITY)priority))JNIEXPORT void JNICALL Java_com_sleepycat_db_Db_set_1re_1source (JNIEnv *jnienv, /*Db*/ jobject jthis, jstring re_source){ int err; DB *db; db = get_DB(jnienv, jthis); if (verify_non_null(jnienv, db)) { /* XXX does the string from get_c_string ever get freed? */ if (re_source != NULL) err = db->set_re_source(db, get_c_string(jnienv, re_source)); else err = db->set_re_source(db, 0); verify_return(jnienv, err, 0); }}JNIEXPORT jobject JNICALL Java_com_sleepycat_db_Db_stat (JNIEnv *jnienv, jobject jthis, jint flags){ DB *db; DB_BTREE_STAT *bstp; DB_HASH_STAT *hstp; DB_QUEUE_STAT *qstp; DBTYPE dbtype; jobject retval; jclass dbclass; size_t bytesize; void *statp; bytesize = 0; retval = NULL; statp = NULL; db = get_DB(jnienv, jthis); if (!verify_non_null(jnienv, db)) return (NULL); if (verify_return(jnienv, db->stat(db, &statp, flags), 0) && verify_return(jnienv, db->get_type(db, &dbtype), 0)) { switch (dbtype) { /* Btree and recno share the same stat structure */ case DB_BTREE: case DB_RECNO: bstp = (DB_BTREE_STAT *)statp; bytesize = sizeof(DB_BTREE_STAT); retval = create_default_object(jnienv, name_DB_BTREE_STAT); if ((dbclass = get_class(jnienv, name_DB_BTREE_STAT)) == NULL) break; /* An exception has been posted. */ __jv_fill_bt_stat(jnienv, dbclass, retval, bstp); break; /* Hash stat structure */ case DB_HASH: hstp = (DB_HASH_STAT *)statp; bytesize = sizeof(DB_HASH_STAT); retval = create_default_object(jnienv, name_DB_HASH_STAT); if ((dbclass = get_class(jnienv, name_DB_HASH_STAT)) == NULL) break; /* An exception has been posted. */ __jv_fill_h_stat(jnienv, dbclass, retval, hstp); break; case DB_QUEUE: qstp = (DB_QUEUE_STAT *)statp; bytesize = sizeof(DB_QUEUE_STAT); retval = create_default_object(jnienv, name_DB_QUEUE_STAT); if ((dbclass = get_class(jnienv, name_DB_QUEUE_STAT)) == NULL) break; /* An exception has been posted. */ __jv_fill_qam_stat(jnienv, dbclass, retval, qstp); break; /* That's all the database types we're aware of! */ default: report_exception(jnienv, "Db.stat not implemented for types" " other than BTREE, HASH, QUEUE," " and RECNO", EINVAL, 0); break; } if (bytesize != 0) __os_ufree(db->dbenv, statp); } return (retval);}JAVADB_METHOD(Db_sync, (JAVADB_ARGS, jint flags), DB, sync, (c_this, flags))JNIEXPORT jboolean JNICALL Java_com_sleepycat_db_Db_get_1byteswapped (JNIEnv *jnienv, /*Db*/ jobject jthis){ DB *db; int err, isbyteswapped; /* This value should never be seen, because of the exception. */ isbyteswapped = 0; db = get_DB(jnienv, jthis); if (!verify_non_null(jnienv, db)) return (0); err = db->get_byteswapped(db, &isbyteswapped); (void)verify_return(jnienv, err, 0); return ((jboolean)isbyteswapped);}JNIEXPORT jint JNICALL Java_com_sleepycat_db_Db_get_1type (JNIEnv *jnienv, /*Db*/ jobject jthis){ DB *db; int err; DBTYPE dbtype; /* This value should never be seen, because of the exception. */ dbtype = DB_UNKNOWN; db = get_DB(jnienv, jthis); if (!verify_non_null(jnienv, db)) return (0); err = db->get_type(db, &dbtype); (void)verify_return(jnienv, err, 0); return ((jint)dbtype);}JNIEXPORT void JNICALL Java_com_sleepycat_db_Db__1open (JNIEnv *jnienv, /*Db*/ jobject jthis, /*DbTxn*/ jobject txnid, jstring file, jstring database, jint type, jint flags, jint mode){ int err; DB *db; DB_TXN *dbtxnid; LOCKED_STRING ls_file; LOCKED_STRING ls_database; /* Java is assumed to be threaded */ flags |= DB_THREAD; db = get_DB(jnienv, jthis); dbtxnid = get_DB_TXN(jnienv, txnid); if (locked_string_get(&ls_file, jnienv, file) != 0) goto out2; if (locked_string_get(&ls_database, jnienv, database) != 0) goto out1; if (verify_non_null(jnienv, db)) { err = db->open(db, dbtxnid, ls_file.string, ls_database.string, (DBTYPE)type, flags, mode); verify_return(jnienv, err, EXCEPTION_FILE_NOT_FOUND); } out1: locked_string_put(&ls_database, jnienv); out2: locked_string_put(&ls_file, jnienv);}JNIEXPORT jint JNICALL Java_com_sleepycat_db_Db_truncate (JNIEnv *jnienv, /*Db*/ jobject jthis, /*DbTxn*/ jobject jtxnid, jint flags){ int err; DB *db; u_int32_t count; DB_TXN *dbtxnid; db = get_DB(jnienv, jthis); dbtxnid = get_DB_TXN(jnienv, jtxnid); count = 0; if (verify_non_null(jnienv, db)) { err = db->truncate(db, dbtxnid, &count, flags); verify_return(jnienv, err, 0); } return (jint)count;}JNIEXPORT void JNICALL Java_com_sleepycat_db_Db_upgrade (JNIEnv *jnienv, /*Db*/ jobject jthis, jstring name, jint flags){ int err; DB *db = get_DB(jnienv, jthis); LOCKED_STRING ls_name; if (verify_non_null(jnienv, db)) { if (locked_string_get(&ls_name, jnienv, name) != 0) goto out; err = db->upgrade(db, ls_name.string, flags); verify_return(jnienv, err, 0); } out: locked_string_put(&ls_name, jnienv);}static int java_verify_callback(void *handle, const void *str_arg){ char *str; struct verify_callback_struct *vc; int len; JNIEnv *jnienv; str = (char *)str_arg; vc = (struct verify_callback_struct *)handle; jnienv = vc->env; len = strlen(str)+1; if (len > vc->nbytes) { vc->nbytes = len; vc->bytes = (*jnienv)->NewByteArray(jnienv, len); } if (vc->bytes != NULL) { (*jnienv)->SetByteArrayRegion(jnienv, vc->bytes, 0, len, (jbyte*)str); (*jnienv)->CallVoidMethod(jnienv, vc->streamobj, vc->writemid, vc->bytes, 0, len-1); } if ((*jnienv)->ExceptionOccurred(jnienv) != NULL) return (EIO); return (0);}JNIEXPORT void JNICALL Java_com_sleepycat_db_Db_verify (JNIEnv *jnienv, /*Db*/ jobject jthis, jstring name, jstring subdb, jobject stream, jint flags){ int err; DB *db; LOCKED_STRING ls_name; LOCKED_STRING ls_subdb; struct verify_callback_struct vcs; jclass streamclass; db = get_DB(jnienv, jthis); if (!verify_non_null(jnienv, db)) return; if (locked_string_get(&ls_name, jnienv, name) != 0) goto out2; if (locked_string_get(&ls_subdb, jnienv, subdb) != 0) goto out1; /* set up everything we need for the callbacks */ vcs.env = jnienv; vcs.streamobj = stream; vcs.nbytes = 100; if ((vcs.bytes = (*jnienv)->NewByteArray(jnienv, vcs.nbytes)) == NULL) goto out1; /* get the method ID for OutputStream.write(byte[], int, int); */ streamclass = (*jnienv)->FindClass(jnienv, "java/io/OutputStream"); vcs.writemid = (*jnienv)->GetMethodID(jnienv, streamclass, "write", "([BII)V"); /* invoke verify - this will invoke the callback repeatedly. */ err = __db_verify_internal(db, ls_name.string, ls_subdb.string, &vcs, java_verify_callback, flags); verify_return(jnienv, err, 0);out1: locked_string_put(&ls_subdb, jnienv);out2: locked_string_put(&ls_name, jnienv);}JNIEXPORT void JNICALL Java_com_sleepycat_db_Db__1finalize (JNIEnv *jnienv, jobject jthis, jobject /*DbErrcall*/ errcall, jstring errpfx){ DB_JAVAINFO *dbinfo; DB *db; dbinfo = get_DB_JAVAINFO(jnienv, jthis); db = get_DB(jnienv, jthis); DB_ASSERT(dbinfo != NULL); /* * Note: We can never be sure if the underlying DB is attached to * a DB_ENV that was already closed. Sure, that's a user error, * but it shouldn't crash the VM. Therefore, we cannot just * automatically close if the handle indicates we are not yet * closed. The best we can do is detect this and report it. */ if (db != NULL) { /* If this error occurs, this object was never closed. */ report_errcall(jnienv, errcall, errpfx, "Db.finalize: open Db object destroyed"); } /* Shouldn't see this object again, but just in case */ set_private_dbobj(jnienv, name_DB, jthis, 0); set_private_info(jnienv, name_DB, jthis, 0); dbji_destroy(dbinfo, jnienv);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -