⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java_info.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
📖 第 1 页 / 共 2 页
字号:
/*- * 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_info.c,v 11.46 2002/08/29 14:22:23 margo Exp $";#endif /* not lint */#include <jni.h>#include <errno.h>#include <stdlib.h>#include <string.h>#include "db_int.h"#include "java_util.h"/**************************************************************** * * Callback functions */static int Db_assoc_callback(DB *db,			     const DBT *key,			     const DBT *data,			     DBT *retval){	DB_JAVAINFO *dbinfo;	DB_ASSERT(db != NULL);	dbinfo = (DB_JAVAINFO *)db->api_internal;	return (dbji_call_assoc(dbinfo, db, dbinfo->jdbref,	    key, data, retval));}static void Db_feedback_callback(DB *db, int opcode, int percent){	DB_JAVAINFO *dbinfo;	DB_ASSERT(db != NULL);	dbinfo = (DB_JAVAINFO *)db->api_internal;	dbji_call_feedback(dbinfo, db, dbinfo->jdbref, opcode, percent);}static int Db_append_recno_callback(DB *db, DBT *dbt, db_recno_t recno){	DB_JAVAINFO *dbinfo;	dbinfo = (DB_JAVAINFO *)db->api_internal;	return (dbji_call_append_recno(dbinfo, db, dbinfo->jdbref, dbt, recno));}static int Db_bt_compare_callback(DB *db, const DBT *dbt1, const DBT *dbt2){	DB_JAVAINFO *dbinfo;	dbinfo = (DB_JAVAINFO *)db->api_internal;	return (dbji_call_bt_compare(dbinfo, db, dbinfo->jdbref, dbt1, dbt2));}static size_t Db_bt_prefix_callback(DB *db, const DBT *dbt1, const DBT *dbt2){	DB_JAVAINFO *dbinfo;	dbinfo = (DB_JAVAINFO *)db->api_internal;	return (dbji_call_bt_prefix(dbinfo, db, dbinfo->jdbref, dbt1, dbt2));}static int Db_dup_compare_callback(DB *db, const DBT *dbt1, const DBT *dbt2){	DB_JAVAINFO *dbinfo;	dbinfo = (DB_JAVAINFO *)db->api_internal;	return (dbji_call_dup_compare(dbinfo, db, dbinfo->jdbref, dbt1, dbt2));}static u_int32_t Db_h_hash_callback(DB *db, const void *data, u_int32_t len){	DB_JAVAINFO *dbinfo;	dbinfo = (DB_JAVAINFO *)db->api_internal;	return (dbji_call_h_hash(dbinfo, db, dbinfo->jdbref, data, len));}static void DbEnv_feedback_callback(DB_ENV *dbenv, int opcode, int percent){	DB_ENV_JAVAINFO *dbinfo;	DB_ASSERT(dbenv != NULL);	dbinfo = (DB_ENV_JAVAINFO *)dbenv->api2_internal;	dbjie_call_feedback(dbinfo, dbenv, dbinfo->jenvref, opcode, percent);}static int DbEnv_rep_transport_callback(DB_ENV *dbenv,					const DBT *control, const DBT *rec,					int envid, u_int32_t flags){	DB_ENV_JAVAINFO *dbinfo;	dbinfo = (DB_ENV_JAVAINFO *)dbenv->api2_internal;	return (dbjie_call_rep_transport(dbinfo, dbenv,	    dbinfo->jenvref, control, rec, envid, (int)flags));}static int DbEnv_app_dispatch_callback(DB_ENV *dbenv, DBT *dbt,				     DB_LSN *lsn, db_recops recops){	DB_ENV_JAVAINFO *dbinfo;	DB_ASSERT(dbenv != NULL);	dbinfo = (DB_ENV_JAVAINFO *)dbenv->api2_internal;	return (dbjie_call_app_dispatch(dbinfo, dbenv, dbinfo->jenvref, dbt,	    lsn, recops));}/**************************************************************** * * Implementation of class DBT_javainfo */DBT_JAVAINFO *dbjit_construct(){	DBT_JAVAINFO *dbjit;	int err;	/*XXX should return err*/	if ((err = __os_malloc(NULL, sizeof(DBT_JAVAINFO), &dbjit)) != 0)		return (NULL);	memset(dbjit, 0, sizeof(DBT_JAVAINFO));	return (dbjit);}void dbjit_destroy(DBT_JAVAINFO *dbjit){	DB_ASSERT(!F_ISSET(dbjit, DBT_JAVAINFO_LOCKED));	/* Extra paranoia */	memset(dbjit, 0, sizeof(DBT_JAVAINFO));	(void)__os_free(NULL, dbjit);}/**************************************************************** * * Implementation of class DB_ENV_JAVAINFO *//* create/initialize an object */DB_ENV_JAVAINFO *dbjie_construct(JNIEnv *jnienv,		jobject jenv,		jobject default_errcall,		int is_dbopen){	DB_ENV_JAVAINFO *dbjie;	int err;	/*XXX should return err*/	if ((err = __os_malloc(NULL, sizeof(DB_ENV_JAVAINFO), &dbjie)) != 0)		return (NULL);	memset(dbjie, 0, sizeof(DB_ENV_JAVAINFO));	dbjie->is_dbopen = is_dbopen;	if ((*jnienv)->GetJavaVM(jnienv, &dbjie->javavm) != 0) {		__os_free(NULL, dbjie);		report_exception(jnienv, "cannot get Java VM", 0, 0);		return (NULL);	}	/*	 * The default error call just prints to the 'System.err'	 * stream.  If the user does set_errcall to null, we'll	 * want to have a reference to set it back to.	 *	 * Why do we have always set db_errcall to our own callback?	 * Because it makes the interaction between setting the	 * error prefix, error stream, and user's error callback	 * that much easier.	 */	dbjie->default_errcall = NEW_GLOBAL_REF(jnienv, default_errcall);	dbjie->errcall = NEW_GLOBAL_REF(jnienv, default_errcall);	dbjie->jenvref = NEW_GLOBAL_REF(jnienv, jenv);	return (dbjie);}/* release all objects held by this this one */void dbjie_dealloc(DB_ENV_JAVAINFO *dbjie, JNIEnv *jnienv){	if (dbjie->feedback != NULL) {		DELETE_GLOBAL_REF(jnienv, dbjie->feedback);		dbjie->feedback = NULL;	}	if (dbjie->app_dispatch != NULL) {		DELETE_GLOBAL_REF(jnienv, dbjie->app_dispatch);		dbjie->app_dispatch = NULL;	}	if (dbjie->errcall != NULL) {		DELETE_GLOBAL_REF(jnienv, dbjie->errcall);		dbjie->errcall = NULL;	}	if (dbjie->default_errcall != NULL) {		DELETE_GLOBAL_REF(jnienv, dbjie->default_errcall);		dbjie->default_errcall = NULL;	}	if (dbjie->jenvref != NULL) {		DELETE_GLOBAL_REF(jnienv, dbjie->jenvref);		dbjie->jenvref = NULL;	}	if (dbjie->conflict != NULL) {		__os_free(NULL, dbjie->conflict);		dbjie->conflict = NULL;		dbjie->conflict_size = 0;	}	if (dbjie->errpfx != NULL) {		__os_free(NULL, dbjie->errpfx);		dbjie->errpfx = NULL;	}}/* free this object, releasing anything allocated on its behalf */void dbjie_destroy(DB_ENV_JAVAINFO *dbjie, JNIEnv *jnienv){	dbjie_dealloc(dbjie, jnienv);	/* Extra paranoia */	memset(dbjie, 0, sizeof(DB_ENV_JAVAINFO));	(void)__os_free(NULL, dbjie);}/* * Attach to the current thread that is running and * return that.  We use the java virtual machine * that we saved in the constructor. */JNIEnv *dbjie_get_jnienv(DB_ENV_JAVAINFO *dbjie){	/*	 * Note:	 * Different versions of the JNI disagree on the signature	 * for AttachCurrentThread.  The most recent documentation	 * seems to say that (JNIEnv **) is correct, but newer	 * JNIs seem to use (void **), oddly enough.	 */#ifdef JNI_VERSION_1_2	void *attachret = 0;#else	JNIEnv *attachret = 0;#endif	/*	 * This should always succeed, as we are called via	 * some Java activity.  I think therefore I am (a thread).	 */	if ((*dbjie->javavm)->AttachCurrentThread(dbjie->javavm, &attachret, 0)	    != 0)		return (0);	return ((JNIEnv *)attachret);}jstringdbjie_get_errpfx(DB_ENV_JAVAINFO *dbjie, JNIEnv *jnienv){	return (get_java_string(jnienv, dbjie->errpfx));}voiddbjie_set_errcall(DB_ENV_JAVAINFO *dbjie, JNIEnv *jnienv, jobject new_errcall){	/*	 * If the new_errcall is null, we'll set the error call	 * to the default one.	 */	if (new_errcall == NULL)		new_errcall = dbjie->default_errcall;	DELETE_GLOBAL_REF(jnienv, dbjie->errcall);	dbjie->errcall = NEW_GLOBAL_REF(jnienv, new_errcall);}voiddbjie_set_errpfx(DB_ENV_JAVAINFO *dbjie, JNIEnv *jnienv, jstring errpfx){	if (dbjie->errpfx != NULL)		__os_free(NULL, dbjie->errpfx);	if (errpfx)		dbjie->errpfx = get_c_string(jnienv, errpfx);	else		dbjie->errpfx = NULL;}voiddbjie_set_conflict(DB_ENV_JAVAINFO *dbjie, u_char *newarr, size_t size){	if (dbjie->conflict != NULL)		(void)__os_free(NULL, dbjie->conflict);	dbjie->conflict = newarr;	dbjie->conflict_size = size;}void dbjie_set_feedback_object(DB_ENV_JAVAINFO *dbjie, JNIEnv *jnienv,			       DB_ENV *dbenv, jobject jfeedback){	int err;	if (dbjie->feedback != NULL) {		DELETE_GLOBAL_REF(jnienv, dbjie->feedback);	}	if (jfeedback == NULL) {		if ((err = dbenv->set_feedback(dbenv, NULL)) != 0)			report_exception(jnienv, "set_feedback failed",					 err, 0);	}	else {		if ((err = dbenv->set_feedback(dbenv,					       DbEnv_feedback_callback)) != 0)			report_exception(jnienv, "set_feedback failed",					 err, 0);	}	dbjie->feedback = NEW_GLOBAL_REF(jnienv, jfeedback);}void dbjie_call_feedback(DB_ENV_JAVAINFO *dbjie, DB_ENV *dbenv, jobject jenv,			 int opcode, int percent){	JNIEnv *jnienv;	jclass feedback_class;	jmethodID id;	COMPQUIET(dbenv, NULL);	jnienv = dbjie_get_jnienv(dbjie);	if (jnienv == NULL) {		fprintf(stderr, "Cannot attach to current thread!\n");		return;	}	if ((feedback_class =	    get_class(jnienv, name_DbEnvFeedback)) == NULL) {		fprintf(stderr, "Cannot find callback class %s\n",		    name_DbEnvFeedback);		return;	/* An exception has been posted. */	}	id = (*jnienv)->GetMethodID(jnienv, feedback_class,				    "feedback",				    "(Lcom/sleepycat/db/DbEnv;II)V");	if (!id) {		fprintf(stderr, "Cannot find callback method feedback\n");		return;	}	(*jnienv)->CallVoidMethod(jnienv, dbjie->feedback, id,				  jenv, (jint)opcode, (jint)percent);}void dbjie_set_rep_transport_object(DB_ENV_JAVAINFO *dbjie, JNIEnv *jnienv,				    DB_ENV *dbenv, int id, jobject jtransport){	int err;	if (dbjie->rep_transport != NULL)		DELETE_GLOBAL_REF(jnienv, dbjie->rep_transport);	err = dbenv->set_rep_transport(dbenv, id,	    DbEnv_rep_transport_callback);	verify_return(jnienv, err, 0);	dbjie->rep_transport = NEW_GLOBAL_REF(jnienv, jtransport);}int dbjie_call_rep_transport(DB_ENV_JAVAINFO *dbjie, DB_ENV *dbenv,			     jobject jenv, const DBT *control,			     const DBT *rec, int flags, int envid){	JNIEnv *jnienv;	jclass rep_transport_class;	jmethodID jid;	jobject jcdbt, jrdbt;	COMPQUIET(dbenv, NULL);	jnienv = dbjie_get_jnienv(dbjie);	if (jnienv == NULL) {		fprintf(stderr, "Cannot attach to current thread!\n");		return (0);	}	if ((rep_transport_class =	    get_class(jnienv, name_DbRepTransport)) == NULL) {		fprintf(stderr, "Cannot find callback class %s\n",		    name_DbRepTransport);		return (0);	/* An exception has been posted. */	}	jid = (*jnienv)->GetMethodID(jnienv, rep_transport_class,				     "send",				     "(Lcom/sleepycat/db/DbEnv;"				     "Lcom/sleepycat/db/Dbt;"				     "Lcom/sleepycat/db/Dbt;II)I");	if (!jid) {		fprintf(stderr, "Cannot find callback method send\n");		return (0);	}	jcdbt = get_const_Dbt(jnienv, control, NULL);	jrdbt = get_const_Dbt(jnienv, rec, NULL);	return (*jnienv)->CallIntMethod(jnienv, dbjie->rep_transport, jid, jenv,					jcdbt, jrdbt, flags, envid);}void dbjie_set_app_dispatch_object(DB_ENV_JAVAINFO *dbjie, JNIEnv *jnienv,				 DB_ENV *dbenv, jobject japp_dispatch){	int err;	if (dbjie->app_dispatch != NULL) {		DELETE_GLOBAL_REF(jnienv, dbjie->app_dispatch);	}	if (japp_dispatch == NULL) {		if ((err = dbenv->set_app_dispatch(dbenv, NULL)) != 0)			report_exception(jnienv, "set_app_dispatch failed",					 err, 0);	}	else {		if ((err = dbenv->set_app_dispatch(dbenv,		    DbEnv_app_dispatch_callback)) != 0)			report_exception(jnienv, "set_app_dispatch failed",					 err, 0);	}	dbjie->app_dispatch = NEW_GLOBAL_REF(jnienv, japp_dispatch);}int dbjie_call_app_dispatch(DB_ENV_JAVAINFO *dbjie, DB_ENV *dbenv, jobject jenv,			  DBT *dbt, DB_LSN *lsn, int recops){	JNIEnv *jnienv;	jclass app_dispatch_class;	jmethodID id;	jobject jdbt;	jobject jlsn;	COMPQUIET(dbenv, NULL);	jnienv = dbjie_get_jnienv(dbjie);	if (jnienv == NULL) {		fprintf(stderr, "Cannot attach to current thread!\n");		return (0);	}	if ((app_dispatch_class =	    get_class(jnienv, name_DbTxnRecover)) == NULL) {		fprintf(stderr, "Cannot find callback class %s\n",		    name_DbTxnRecover);		return (0);	/* An exception has been posted. */	}	id = (*jnienv)->GetMethodID(jnienv, app_dispatch_class,				    "app_dispatch",				    "(Lcom/sleepycat/db/DbEnv;"				    "Lcom/sleepycat/db/Dbt;"				    "Lcom/sleepycat/db/DbLsn;"				    "I)I");	if (!id) {		fprintf(stderr, "Cannot find callback method app_dispatch\n");		return (0);	}	jdbt = get_Dbt(jnienv, dbt, NULL);	if (lsn == NULL)		jlsn = NULL;	else		jlsn = get_DbLsn(jnienv, *lsn);	return (*jnienv)->CallIntMethod(jnienv, dbjie->app_dispatch, id, jenv,					jdbt, jlsn, recops);}jobject dbjie_get_errcall(DB_ENV_JAVAINFO *dbjie){	return (dbjie->errcall);}jint dbjie_is_dbopen(DB_ENV_JAVAINFO *dbjie){	return (dbjie->is_dbopen);}/**************************************************************** * * Implementation of class DB_JAVAINFO */DB_JAVAINFO *dbji_construct(JNIEnv *jnienv, jobject jdb, jint flags){	DB_JAVAINFO *dbji;	int err;	/*XXX should return err*/	if ((err = __os_malloc(NULL, sizeof(DB_JAVAINFO), &dbji)) != 0)		return (NULL);	memset(dbji, 0, sizeof(DB_JAVAINFO));	if ((*jnienv)->GetJavaVM(jnienv, &dbji->javavm) != 0) {		report_exception(jnienv, "cannot get Java VM", 0, 0);		(void)__os_free(NULL, dbji);		return (NULL);	}	dbji->jdbref = NEW_GLOBAL_REF(jnienv, jdb);	dbji->construct_flags = flags;	return (dbji);}voiddbji_dealloc(DB_JAVAINFO *dbji, JNIEnv *jnienv){	if (dbji->append_recno != NULL) {		DELETE_GLOBAL_REF(jnienv, dbji->append_recno);		dbji->append_recno = NULL;	}	if (dbji->assoc != NULL) {		DELETE_GLOBAL_REF(jnienv, dbji->assoc);		dbji->assoc = NULL;	}	if (dbji->bt_compare != NULL) {		DELETE_GLOBAL_REF(jnienv, dbji->bt_compare);		dbji->bt_compare = NULL;	}	if (dbji->bt_prefix != NULL) {		DELETE_GLOBAL_REF(jnienv, dbji->bt_prefix);		dbji->bt_prefix = NULL;	}	if (dbji->dup_compare != NULL) {		DELETE_GLOBAL_REF(jnienv, dbji->dup_compare);		dbji->dup_compare = NULL;	}	if (dbji->feedback != NULL) {		DELETE_GLOBAL_REF(jnienv, dbji->feedback);		dbji->feedback = NULL;	}	if (dbji->h_hash != NULL) {		DELETE_GLOBAL_REF(jnienv, dbji->h_hash);		dbji->h_hash = NULL;	}	if (dbji->jdbref != NULL) {		DELETE_GLOBAL_REF(jnienv, dbji->jdbref);		dbji->jdbref = NULL;	}}voiddbji_destroy(DB_JAVAINFO *dbji, JNIEnv *jnienv){	dbji_dealloc(dbji, jnienv);	__os_free(NULL, dbji);}JNIEnv *dbji_get_jnienv(DB_JAVAINFO *dbji)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -