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

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.  * $Id: java_util.h,v 11.44 2002/08/29 14:22:24 margo Exp $
  8.  */
  9. #ifndef _JAVA_UTIL_H_
  10. #define _JAVA_UTIL_H_
  11. #ifdef _MSC_VER
  12. /*
  13.  * These are level 4 warnings that are explicitly disabled.
  14.  * With Visual C++, by default you do not see above level 3 unless
  15.  * you use /W4.  But we like to compile with the highest level
  16.  * warnings to catch other errors.
  17.  *
  18.  * 4201: nameless struct/union
  19.  *       triggered by standard include file <winnt.h>
  20.  *
  21.  * 4244: '=' : convert from '__int64' to 'unsigned int', possible loss of data
  22.  *       results from making size_t data members correspond to jlongs
  23.  *
  24.  * 4514: unreferenced inline function has been removed
  25.  *       jni.h defines methods that are not called
  26.  *
  27.  * 4127: conditional expression is constant
  28.  *       occurs because of arg in JAVADB_RW_ACCESS_STRING macro
  29.  */
  30. #pragma warning(disable: 4244 4201 4514 4127)
  31. #endif
  32. #include "db_config.h"
  33. #include "db.h"
  34. #include "db_int.h"
  35. #include <jni.h>
  36. #include "java_info.h"
  37. #include "java_locked.h"
  38. #include <string.h>             /* needed for memset */
  39. #define DB_PACKAGE_NAME "com/sleepycat/db/"
  40. /* Union to convert longs to pointers (see {get,set}_private_dbobj). */
  41. typedef union {
  42.     jlong java_long;
  43.     void *ptr;
  44. } long_to_ptr;
  45. /****************************************************************
  46.  *
  47.  * Utility functions and definitions used by "glue" functions.
  48.  */
  49. #define NOT_IMPLEMENTED(str) 
  50. report_exception(jnienv, str /*concatenate*/ ": not implemented", 0)
  51. /*
  52.  * Get, delete a global reference.
  53.  * Making this operation a function call allows for
  54.  * easier tracking for debugging.  Global references
  55.  * are mostly grabbed at 'open' and 'close' points,
  56.  * so there shouldn't be a big performance hit.
  57.  *
  58.  * Macro-izing this makes it easier to add debugging code
  59.  * to track unreleased references.
  60.  */
  61. #ifdef DBJAVA_DEBUG
  62. #include <unistd.h>
  63. static void wrdebug(const char *str)
  64. {
  65. write(2, str, strlen(str));
  66. write(2, "n", 1);
  67. }
  68. static jobject debug_new_global_ref(JNIEnv *jnienv, jobject obj, const char *s)
  69. {
  70. wrdebug(s);
  71. return ((*jnienv)->NewGlobalRef(jnienv, obj));
  72. }
  73. static void debug_delete_global_ref(JNIEnv *jnienv, jobject obj, const char *s)
  74. {
  75. wrdebug(s);
  76. (*jnienv)->DeleteGlobalRef(jnienv, obj);
  77. }
  78. #define NEW_GLOBAL_REF(jnienv, obj)  
  79. debug_new_global_ref(jnienv, obj, "+Ref: " #obj)
  80. #define DELETE_GLOBAL_REF(jnienv, obj) 
  81. debug_delete_global_ref(jnienv, obj, "-Ref: " #obj)
  82. #else
  83. #define NEW_GLOBAL_REF(jnienv, obj)     (*jnienv)->NewGlobalRef(jnienv, obj)
  84. #define DELETE_GLOBAL_REF(jnienv, obj)  (*jnienv)->DeleteGlobalRef(jnienv, obj)
  85. #define wrdebug(x)
  86. #endif
  87. /*
  88.  * Do any one time initialization, especially initializing any
  89.  * unchanging methodIds, fieldIds, etc.
  90.  */
  91. void one_time_init(JNIEnv *jnienv);
  92. /*
  93.  * Get the current JNIEnv from the java VM.
  94.  * If the jvm argument is null, uses the default
  95.  * jvm stored during the first invocation.
  96.  */
  97. JNIEnv *get_jnienv(JavaVM *jvm);
  98. /*
  99.  * Get the private data from a Db* object that points back to a C DB_* object.
  100.  * The private data is stored in the object as a Java long (64 bits),
  101.  * which is long enough to store a pointer on current architectures.
  102.  */
  103. void *get_private_dbobj(JNIEnv *jnienv, const char *classname,
  104.        jobject obj);
  105. /*
  106.  * Set the private data in a Db* object that points back to a C DB_* object.
  107.  * The private data is stored in the object as a Java long (64 bits),
  108.  * which is long enough to store a pointer on current architectures.
  109.  */
  110. void set_private_dbobj(JNIEnv *jnienv, const char *classname,
  111.       jobject obj, void *value);
  112. /*
  113.  * Get the private data in a Db/DbEnv object that holds additional 'side data'.
  114.  * The private data is stored in the object as a Java long (64 bits),
  115.  * which is long enough to store a pointer on current architectures.
  116.  */
  117. void *get_private_info(JNIEnv *jnienv, const char *classname,
  118.        jobject obj);
  119. /*
  120.  * Set the private data in a Db/DbEnv object that holds additional 'side data'.
  121.  * The private data is stored in the object as a Java long (64 bits),
  122.  * which is long enough to store a pointer on current architectures.
  123.  */
  124. void set_private_info(JNIEnv *jnienv, const char *classname,
  125.       jobject obj, void *value);
  126. /*
  127.  * Given a non-qualified name (e.g. "foo"), get the class handle
  128.  * for the fully qualified name (e.g. "com.sleepycat.db.foo")
  129.  */
  130. jclass get_class(JNIEnv *jnienv, const char *classname);
  131. /*
  132.  * Set an individual field in a Db* object.
  133.  * The field must be a DB object type.
  134.  */
  135. void set_object_field(JNIEnv *jnienv, jclass class_of_this,
  136.       jobject jthis, const char *object_classname,
  137.       const char *name_of_field, jobject obj);
  138. /*
  139.  * Set an individual field in a Db* object.
  140.  * The field must be an integer type.
  141.  */
  142. void set_int_field(JNIEnv *jnienv, jclass class_of_this,
  143.    jobject jthis, const char *name_of_field, jint value);
  144. /*
  145.  * Set an individual field in a Db* object.
  146.  * The field must be an integer type.
  147.  */
  148. void set_long_field(JNIEnv *jnienv, jclass class_of_this,
  149. jobject jthis, const char *name_of_field, jlong value);
  150. /*
  151.  * Set an individual field in a Db* object.
  152.  * The field must be an DbLsn type.
  153.  */
  154. void set_lsn_field(JNIEnv *jnienv, jclass class_of_this,
  155.    jobject jthis, const char *name_of_field, DB_LSN value);
  156. /*
  157.  * Values of flags for verify_return() and report_exception().
  158.  * These indicate what sort of exceptions the method may throw
  159.  * (in addition to DbException).
  160.  */
  161. static const u_int32_t EXCEPTION_FILE_NOT_FOUND = 0x0001; /*FileNotFound*/
  162. /*
  163.  * Report an exception back to the java side.
  164.  */
  165. void report_exception(JNIEnv *jnienv, const char *text,
  166.       int err, unsigned long expect_mask);
  167. /*
  168.  * Report an exception back to the java side, for the specific
  169.  * case of DB_LOCK_NOTGRANTED, as more things are added to the
  170.  * constructor of this type of exception.
  171.  */
  172. void report_notgranted_exception(JNIEnv *jnienv, const char *text,
  173.  db_lockop_t op, db_lockmode_t mode,
  174.  jobject jdbt, jobject jlock, int index);
  175. /*
  176.  * Create an exception object and return it.
  177.  * The given class must have a constructor that has a
  178.  * constructor with args (java.lang.String text, int errno);
  179.  * DbException and its subclasses fit this bill.
  180.  */
  181. jobject create_exception(JNIEnv *jnienv, jstring text,
  182.  int err, jclass dbexcept);
  183. /*
  184.  * Report an error via the errcall mechanism.
  185.  */
  186. void report_errcall(JNIEnv *jnienv, jobject errcall,
  187.     jstring prefix, const char *message);
  188. /*
  189.  * If the object is null, report an exception and return false (0),
  190.  * otherwise return true (1).
  191.  */
  192. int verify_non_null(JNIEnv *jnienv, void *obj);
  193. /*
  194.  * If the error code is non-zero, report an exception and return false (0),
  195.  * otherwise return true (1).
  196.  */
  197. int verify_return(JNIEnv *jnienv, int err, unsigned long flags);
  198. /*
  199.  * Verify that there was no memory error due to undersized Dbt.
  200.  * If there is report a DbMemoryException, with the Dbt attached
  201.  * and return false (0), otherwise return true (1).
  202.  */
  203. int verify_dbt(JNIEnv *jnienv, int err, LOCKED_DBT *locked_dbt);
  204. /*
  205.  * Create an object of the given class, calling its default constructor.
  206.  */
  207. jobject create_default_object(JNIEnv *jnienv, const char *class_name);
  208. /*
  209.  * Create a Dbt object, , calling its default constructor.
  210.  */
  211. jobject create_dbt(JNIEnv *jnienv, const char *class_name);
  212. /*
  213.  * Convert an DB object to a Java encapsulation of that object.
  214.  * Note: This implementation creates a new Java object on each call,
  215.  * so it is generally useful when a new DB object has just been created.
  216.  */
  217. jobject convert_object(JNIEnv *jnienv, const char *class_name, void *dbobj);
  218. /*
  219.  * Create a copy of the java string using __os_malloc.
  220.  * Caller must free it.
  221.  */
  222. char *get_c_string(JNIEnv *jnienv, jstring jstr);
  223. /*
  224.  * Create a java string from the given string
  225.  */
  226. jstring get_java_string(JNIEnv *jnienv, const char* string);
  227. /*
  228.  * Convert a java object to the various C pointers they represent.
  229.  */
  230. DB             *get_DB            (JNIEnv *jnienv, jobject obj);
  231. DB_BTREE_STAT  *get_DB_BTREE_STAT (JNIEnv *jnienv, jobject obj);
  232. DBC            *get_DBC           (JNIEnv *jnienv, jobject obj);
  233. DB_ENV         *get_DB_ENV        (JNIEnv *jnienv, jobject obj);
  234. DB_ENV_JAVAINFO *get_DB_ENV_JAVAINFO (JNIEnv *jnienv, jobject obj);
  235. DB_HASH_STAT   *get_DB_HASH_STAT  (JNIEnv *jnienv, jobject obj);
  236. DB_JAVAINFO    *get_DB_JAVAINFO   (JNIEnv *jnienv, jobject obj);
  237. DB_LOCK        *get_DB_LOCK       (JNIEnv *jnienv, jobject obj);
  238. DB_LOGC        *get_DB_LOGC       (JNIEnv *jnienv, jobject obj);
  239. DB_LOG_STAT    *get_DB_LOG_STAT   (JNIEnv *jnienv, jobject obj);
  240. DB_LSN         *get_DB_LSN        (JNIEnv *jnienv, jobject obj);
  241. DB_MPOOL_FSTAT *get_DB_MPOOL_FSTAT(JNIEnv *jnienv, jobject obj);
  242. DB_MPOOL_STAT  *get_DB_MPOOL_STAT (JNIEnv *jnienv, jobject obj);
  243. DB_QUEUE_STAT  *get_DB_QUEUE_STAT (JNIEnv *jnienv, jobject obj);
  244. DB_TXN         *get_DB_TXN        (JNIEnv *jnienv, jobject obj);
  245. DB_TXN_STAT    *get_DB_TXN_STAT   (JNIEnv *jnienv, jobject obj);
  246. DBT            *get_DBT           (JNIEnv *jnienv, jobject obj);
  247. DBT_JAVAINFO   *get_DBT_JAVAINFO  (JNIEnv *jnienv, jobject obj);
  248. /*
  249.  * From a C object, create a Java object.
  250.  */
  251. jobject get_DbBtreeStat  (JNIEnv *jnienv, DB_BTREE_STAT *dbobj);
  252. jobject get_Dbc          (JNIEnv *jnienv, DBC *dbobj);
  253. jobject get_DbHashStat   (JNIEnv *jnienv, DB_HASH_STAT *dbobj);
  254. jobject get_DbLogc       (JNIEnv *jnienv, DB_LOGC *dbobj);
  255. jobject get_DbLogStat    (JNIEnv *jnienv, DB_LOG_STAT *dbobj);
  256. jobject get_DbLsn        (JNIEnv *jnienv, DB_LSN dbobj);
  257. jobject get_DbMpoolStat  (JNIEnv *jnienv, DB_MPOOL_STAT *dbobj);
  258. jobject get_DbMpoolFStat (JNIEnv *jnienv, DB_MPOOL_FSTAT *dbobj);
  259. jobject get_DbQueueStat  (JNIEnv *jnienv, DB_QUEUE_STAT *dbobj);
  260. jobject get_const_Dbt    (JNIEnv *jnienv, const DBT *dbt, DBT_JAVAINFO **retp);
  261. jobject get_Dbt          (JNIEnv *jnienv, DBT *dbt, DBT_JAVAINFO **retp);
  262. jobject get_DbTxn        (JNIEnv *jnienv, DB_TXN *dbobj);
  263. jobject get_DbTxnStat    (JNIEnv *jnienv, DB_TXN_STAT *dbobj);
  264. /* The java names of DB classes */
  265. extern const char * const name_DB;
  266. extern const char * const name_DB_BTREE_STAT;
  267. extern const char * const name_DBC;
  268. extern const char * const name_DB_DEADLOCK_EX;
  269. extern const char * const name_DB_ENV;
  270. extern const char * const name_DB_EXCEPTION;
  271. extern const char * const name_DB_HASH_STAT;
  272. extern const char * const name_DB_LOCK;
  273. extern const char * const name_DB_LOCK_STAT;
  274. extern const char * const name_DB_LOGC;
  275. extern const char * const name_DB_LOG_STAT;
  276. extern const char * const name_DB_LSN;
  277. extern const char * const name_DB_MEMORY_EX;
  278. extern const char * const name_DB_MPOOL_FSTAT;
  279. extern const char * const name_DB_MPOOL_STAT;
  280. extern const char * const name_DB_LOCKNOTGRANTED_EX;
  281. extern const char * const name_DB_PREPLIST;
  282. extern const char * const name_DB_QUEUE_STAT;
  283. extern const char * const name_DB_REP_STAT;
  284. extern const char * const name_DB_RUNRECOVERY_EX;
  285. extern const char * const name_DBT;
  286. extern const char * const name_DB_TXN;
  287. extern const char * const name_DB_TXN_STAT;
  288. extern const char * const name_DB_TXN_STAT_ACTIVE;
  289. extern const char * const name_DB_UTIL;
  290. extern const char * const name_DbAppendRecno;
  291. extern const char * const name_DbBtreeCompare;
  292. extern const char * const name_DbBtreePrefix;
  293. extern const char * const name_DbDupCompare;
  294. extern const char * const name_DbEnvFeedback;
  295. extern const char * const name_DbErrcall;
  296. extern const char * const name_DbFeedback;
  297. extern const char * const name_DbHash;
  298. extern const char * const name_DbRecoveryInit;
  299. extern const char * const name_DbRepTransport;
  300. extern const char * const name_DbSecondaryKeyCreate;
  301. extern const char * const name_DbTxnRecover;
  302. extern const char * const name_RepElectResult;
  303. extern const char * const name_RepProcessMessage;
  304. extern const char * const string_signature;
  305. extern jfieldID fid_Dbt_data;
  306. extern jfieldID fid_Dbt_offset;
  307. extern jfieldID fid_Dbt_size;
  308. extern jfieldID fid_Dbt_ulen;
  309. extern jfieldID fid_Dbt_dlen;
  310. extern jfieldID fid_Dbt_doff;
  311. extern jfieldID fid_Dbt_flags;
  312. extern jfieldID fid_Dbt_must_create_data;
  313. extern jfieldID fid_DbLockRequest_op;
  314. extern jfieldID fid_DbLockRequest_mode;
  315. extern jfieldID fid_DbLockRequest_timeout;
  316. extern jfieldID fid_DbLockRequest_obj;
  317. extern jfieldID fid_DbLockRequest_lock;
  318. extern jfieldID fid_RepProcessMessage_envid;
  319. #define JAVADB_ARGS JNIEnv *jnienv, jobject jthis
  320. #define JAVADB_GET_FLD(j_class, j_fieldtype, j_field, c_type, c_field)       
  321. JNIEXPORT j_fieldtype JNICALL       
  322.   Java_com_sleepycat_db_##j_class##_get_1##j_field       
  323.   (JAVADB_ARGS)       
  324. {       
  325. c_type *db= get_##c_type(jnienv, jthis);       
  326.       
  327. if (verify_non_null(jnienv, db))       
  328. return (db->c_field);       
  329. return (0);       
  330. }
  331. #define JAVADB_SET_FLD(j_class, j_fieldtype, j_field, c_type, c_field)       
  332. JNIEXPORT void JNICALL       
  333.   Java_com_sleepycat_db_##j_class##_set_1##j_field       
  334.   (JAVADB_ARGS, j_fieldtype value)       
  335. {       
  336. c_type *db= get_##c_type(jnienv, jthis);       
  337.       
  338. if (verify_non_null(jnienv, db))       
  339. db->c_field = value;       
  340. }
  341. #define JAVADB_METHOD(_meth, _argspec, c_type, c_meth, _args)       
  342. JNIEXPORT void JNICALL Java_com_sleepycat_db_##_meth _argspec       
  343. {       
  344. c_type *c_this = get_##c_type(jnienv, jthis);       
  345. int ret;       
  346.       
  347. if (!verify_non_null(jnienv, c_this))       
  348. return;       
  349. ret = c_this->c_meth _args;       
  350. if (!DB_RETOK_STD(ret))       
  351. report_exception(jnienv, db_strerror(ret), ret, 0);       
  352. }
  353. #define JAVADB_METHOD_INT(_meth, _argspec, c_type, c_meth, _args, _retok)     
  354. JNIEXPORT jint JNICALL Java_com_sleepycat_db_##_meth _argspec       
  355. {       
  356. c_type *c_this = get_##c_type(jnienv, jthis);       
  357. int ret;       
  358.       
  359. if (!verify_non_null(jnienv, c_this))       
  360. return (0);       
  361. ret = c_this->c_meth _args;       
  362. if (!_retok(ret))       
  363. report_exception(jnienv, db_strerror(ret), ret, 0);       
  364. return ((jint)ret);       
  365. }
  366. #define JAVADB_SET_METH(j_class, j_type, j_fld, c_type, c_field)       
  367.     JAVADB_METHOD(j_class##_set_1##j_fld, (JAVADB_ARGS, j_type val), c_type,  
  368.     set_##c_field, (c_this, val))
  369. #define JAVADB_SET_METH_STR(j_class, j_fld, c_type, c_field)       
  370.     JAVADB_METHOD(j_class##_set_1##j_fld, (JAVADB_ARGS, jstring val), c_type, 
  371.     set_##c_field, (c_this, (*jnienv)->GetStringUTFChars(jnienv, val, NULL)))
  372. /*
  373.  * These macros are used by code generated by the s_java script.
  374.  */
  375. #define JAVADB_STAT_INT(env, cl, jobj, statp, name) 
  376. set_int_field(jnienv, cl, jobj, #name, statp->name)
  377. #define JAVADB_STAT_LSN(env, cl, jobj, statp, name) 
  378. set_lsn_field(jnienv, cl, jobj, #name, statp->name)
  379. #define JAVADB_STAT_LONG(env, cl, jobj, statp, name) 
  380. set_long_field(jnienv, cl, jobj, #name, statp->name)
  381. /*
  382.  * We build the active list separately.
  383.  */
  384. #define JAVADB_STAT_ACTIVE(env, cl, jobj, statp, name) 
  385. do {} while(0)
  386. #endif /* !_JAVA_UTIL_H_ */