java_DbEnv.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:36k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: java_DbEnv.c,v 11.37 2001/01/11 18:19:52 bostic Exp $";
  10. #endif /* not lint */
  11. #include <jni.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include "db.h"
  15. #include "db_int.h"
  16. #include "java_util.h"
  17. #include "com_sleepycat_db_DbEnv.h"
  18. /* We keep these lined up, and alphabetical by field name,
  19.  * for comparison with C++'s list.
  20.  */
  21. JAVADB_WO_ACCESS_STRING(DbEnv,        data_1dir, DB_ENV, data_dir)
  22. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  lg_1bsize, DB_ENV, lg_bsize)
  23. JAVADB_WO_ACCESS_STRING(DbEnv,        lg_1dir, DB_ENV, lg_dir)
  24. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  lg_1max, DB_ENV, lg_max)
  25. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  lk_1detect, DB_ENV, lk_detect)
  26. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  lk_1max, DB_ENV, lk_max)
  27. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  lk_1max_1locks, DB_ENV, lk_max_locks)
  28. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  lk_1max_1lockers, DB_ENV, lk_max_lockers)
  29. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  lk_1max_1objects, DB_ENV, lk_max_objects)
  30. /* mp_mmapsize is declared below, it needs an extra cast */
  31. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  mutexlocks, DB_ENV, mutexlocks)
  32. JAVADB_WO_ACCESS_STRING(DbEnv,        tmp_1dir, DB_ENV, tmp_dir)
  33. JAVADB_WO_ACCESS_METHOD(DbEnv, jint,  tx_1max, DB_ENV, tx_max)
  34. static void DbEnv_errcall_callback(const char *prefix, char *message)
  35. {
  36. JNIEnv *jnienv;
  37. DB_ENV_JAVAINFO *envinfo = (DB_ENV_JAVAINFO *)prefix;
  38. jstring pre;
  39. /* Note: these error cases are "impossible", and would
  40.  * normally warrant an exception.  However, without
  41.  * a jnienv, we cannot throw an exception...
  42.  * We don't want to trap or exit, since the point of
  43.  * this facility is for the user to completely control
  44.  * error situations.
  45.  */
  46. if (envinfo == NULL) {
  47. /* Something is *really* wrong here, the
  48.  * prefix is set in every environment created.
  49.  */
  50. fprintf(stderr, "Error callback failed!n");
  51. fprintf(stderr, "error: %sn", message);
  52. return;
  53. }
  54. /* Should always succeed... */
  55. jnienv = dbjie_get_jnienv(envinfo);
  56. if (jnienv == NULL) {
  57. /* But just in case... */
  58. fprintf(stderr, "Cannot attach to current thread!n");
  59. fprintf(stderr, "error: %sn", message);
  60. return;
  61. }
  62. pre = dbjie_get_errpfx(envinfo, jnienv);
  63. report_errcall(jnienv,  dbjie_get_errcall(envinfo), pre, message);
  64. }
  65. static void DbEnv_initialize(JNIEnv *jnienv, DB_ENV *dbenv,
  66.      /*DbEnv*/ jobject jenv,
  67.      /*DbErrcall*/ jobject jerrcall,
  68.      int is_dbopen)
  69. {
  70. DB_ENV_JAVAINFO *envinfo;
  71. envinfo = get_DB_ENV_JAVAINFO(jnienv, jenv);
  72. DB_ASSERT(envinfo == NULL);
  73. envinfo = dbjie_construct(jnienv, jerrcall, is_dbopen);
  74. set_private_info(jnienv, name_DB_ENV, jenv, envinfo);
  75. dbenv->set_errpfx(dbenv, (const char*)envinfo);
  76. dbenv->set_errcall(dbenv, DbEnv_errcall_callback);
  77. dbenv->cj_internal = envinfo;
  78. set_private_dbobj(jnienv, name_DB_ENV, jenv, dbenv);
  79. }
  80. /* This is called when this DbEnv was made on behalf of a Db
  81.  * created directly (without a parent DbEnv), and the Db is
  82.  * being closed.  We'll zero out the pointer to the DB_ENV,
  83.  * since it is no longer valid, to prevent mistakes.
  84.  */
  85. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1notify_1db_1close
  86.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  87. {
  88. DB_ENV_JAVAINFO *dbenvinfo;
  89. set_private_dbobj(jnienv, name_DB_ENV, jthis, 0);
  90. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  91. if (dbenvinfo != NULL)
  92. dbjie_dealloc(dbenvinfo, jnienv);
  93. }
  94. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_feedback_1changed
  95.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbFeedback*/ jobject jfeedback)
  96. {
  97. DB_ENV *dbenv;
  98. DB_ENV_JAVAINFO *dbenvinfo;
  99. dbenv = get_DB_ENV(jnienv, jthis);
  100. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  101. if (!verify_non_null(jnienv, dbenv) ||
  102.     !verify_non_null(jnienv, dbenvinfo))
  103. return;
  104. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  105. dbjie_set_feedback_object(dbenvinfo, jnienv, dbenv, jfeedback);
  106. JAVADB_ENV_API_END(dbenv);
  107. }
  108. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1init
  109.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobject /*DbErrcall*/ jerrcall,
  110.    jint flags)
  111. {
  112. int err;
  113. DB_ENV *dbenv;
  114. err = db_env_create(&dbenv, flags);
  115. if (verify_return(jnienv, err, 0))
  116. DbEnv_initialize(jnienv, dbenv, jthis, jerrcall, 0);
  117. }
  118. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1init_1using_1db
  119.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobject /*DbErrcall*/ jerrcall,
  120.    /*Db*/ jobject jdb)
  121. {
  122. DB_ENV *dbenv;
  123. DB *db;
  124. db = get_DB(jnienv, jdb);
  125. dbenv = db->dbenv;
  126. DbEnv_initialize(jnienv, dbenv, jthis, jerrcall, 1);
  127. }
  128. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_open
  129.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring db_home,
  130.    jint flags, jint mode)
  131. {
  132. int err;
  133. DB_ENV *dbenv;
  134. JSTR j_home;
  135. DB_ENV_JAVAINFO *dbenvinfo;
  136. dbenv = get_DB_ENV(jnienv, jthis);
  137. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  138. if (!verify_non_null(jnienv, dbenv) ||
  139.     !verify_non_null(jnienv, dbenvinfo))
  140. return;
  141. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  142. if (jstr_lock(&j_home, jnienv, db_home) != 0)
  143. goto out;
  144. /* Java is assumed to be threaded. */
  145. flags |= DB_THREAD;
  146. err = dbenv->open(dbenv, j_home.string, flags, mode);
  147. verify_return(jnienv, err, EXCEPTION_FILE_NOT_FOUND);
  148.  out:
  149. jstr_unlock(&j_home, jnienv);
  150. JAVADB_ENV_API_END(dbenv);
  151. }
  152. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_remove
  153.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring db_home, jint flags)
  154. {
  155. DB_ENV *dbenv;
  156. DB_ENV_JAVAINFO *dbenvinfo;
  157. JSTR j_home;
  158. int err = 0;
  159. dbenv = get_DB_ENV(jnienv, jthis);
  160. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  161. if (!verify_non_null(jnienv, dbenv))
  162. return;
  163. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  164. if (jstr_lock(&j_home, jnienv, db_home) != 0)
  165. goto out;
  166. err = dbenv->remove(dbenv, j_home.string, flags);
  167. set_private_dbobj(jnienv, name_DB_ENV, jthis, 0);
  168. if (dbenvinfo != NULL)
  169. dbjie_dealloc(dbenvinfo, jnienv);
  170. verify_return(jnienv, err, 0);
  171.  out:
  172. jstr_unlock(&j_home, jnienv);
  173. /* don't call JAVADB_ENV_API_END - env cannot be used */
  174. }
  175. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1close
  176.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  177. {
  178. int err;
  179. DB_ENV *dbenv;
  180. DB_ENV_JAVAINFO *dbenvinfo;
  181. dbenv = get_DB_ENV(jnienv, jthis);
  182. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  183. if (!verify_non_null(jnienv, dbenv))
  184. return;
  185. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  186. err = dbenv->close(dbenv, flags);
  187. set_private_dbobj(jnienv, name_DB_ENV, jthis, 0);
  188. if (dbenvinfo != NULL)
  189. dbjie_dealloc(dbenvinfo, jnienv);
  190. /* Throw an exception if the close failed. */
  191. verify_return(jnienv, err, 0);
  192. /* don't call JAVADB_ENV_API_END - env cannot be used */
  193. }
  194. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_err
  195.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint ecode, jstring msg)
  196. {
  197. JSTR msg_string;
  198. DB_ENV *dbenv;
  199. dbenv = get_DB_ENV(jnienv, jthis);
  200. if (!verify_non_null(jnienv, dbenv))
  201. return;
  202. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  203. if (jstr_lock(&msg_string, jnienv, msg) != 0)
  204. goto out;
  205. dbenv->err(dbenv, ecode, msg_string.string);
  206.  out:
  207. jstr_unlock(&msg_string, jnienv);
  208. JAVADB_ENV_API_END(dbenv);
  209. }
  210. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_errx
  211.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring msg)
  212. {
  213. JSTR msg_string;
  214. DB_ENV *dbenv;
  215. dbenv = get_DB_ENV(jnienv, jthis);
  216. if (!verify_non_null(jnienv, dbenv))
  217. return;
  218. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  219. if (jstr_lock(&msg_string, jnienv, msg) != 0)
  220. goto out;
  221. dbenv->errx(dbenv, msg_string.string);
  222.  out:
  223. jstr_unlock(&msg_string, jnienv);
  224. JAVADB_ENV_API_END(dbenv);
  225. }
  226. /*static*/
  227. JNIEXPORT jstring JNICALL Java_com_sleepycat_db_DbEnv_strerror
  228.   (JNIEnv *jnienv, jclass jthis_class, jint ecode)
  229. {
  230. const char *message;
  231. COMPQUIET(jthis_class, NULL);
  232. message = db_strerror(ecode);
  233. return (get_java_string(jnienv, message));
  234. }
  235. JNIEXPORT void JNICALL
  236.   Java_com_sleepycat_db_DbEnv_set_1cachesize
  237.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint gbytes, jint bytes,
  238.    jint ncaches)
  239. {
  240. DB_ENV *dbenv;
  241. int err;
  242. dbenv = get_DB_ENV(jnienv, jthis);
  243. if (verify_non_null(jnienv, dbenv)) {
  244. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  245. err = dbenv->set_cachesize(dbenv, gbytes, bytes, ncaches);
  246. verify_return(jnienv, err, 0);
  247. JAVADB_ENV_API_END(dbenv);
  248. }
  249. }
  250. JNIEXPORT void JNICALL
  251.   Java_com_sleepycat_db_DbEnv_set_1flags
  252.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags, jint onoff)
  253. {
  254. DB_ENV *dbenv;
  255. int err;
  256. dbenv = get_DB_ENV(jnienv, jthis);
  257. if (verify_non_null(jnienv, dbenv)) {
  258. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  259. err = dbenv->set_flags(dbenv, flags, onoff);
  260. verify_return(jnienv, err, 0);
  261. JAVADB_ENV_API_END(dbenv);
  262. }
  263. }
  264. JNIEXPORT void JNICALL
  265.   Java_com_sleepycat_db_DbEnv_set_1mp_1mmapsize
  266.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jlong value)
  267. {
  268. DB_ENV *dbenv;
  269. int err;
  270. dbenv = get_DB_ENV(jnienv, jthis);
  271. if (verify_non_null(jnienv, dbenv)) {
  272. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  273. err = dbenv->set_mp_mmapsize(dbenv, (size_t)value);
  274. verify_return(jnienv, err, 0);
  275. JAVADB_ENV_API_END(dbenv);
  276. }
  277. }
  278. /*static*/
  279. JNIEXPORT void JNICALL
  280.   Java_com_sleepycat_db_DbEnv_set_1pageyield
  281.   (JNIEnv *jnienv, jclass jthis_class, jint value)
  282. {
  283. int err;
  284. COMPQUIET(jthis_class, NULL);
  285. err = db_env_set_pageyield(value);
  286. verify_return(jnienv, err, 0);
  287. }
  288. /*static*/
  289. JNIEXPORT void JNICALL
  290.   Java_com_sleepycat_db_DbEnv_set_1panicstate
  291.   (JNIEnv *jnienv, jclass jthis_class, jint value)
  292. {
  293. int err;
  294. COMPQUIET(jthis_class, NULL);
  295. err = db_env_set_panicstate(value);
  296. verify_return(jnienv, err, 0);
  297. }
  298. /*static*/
  299. JNIEXPORT void JNICALL
  300.   Java_com_sleepycat_db_DbEnv_set_1region_1init
  301.   (JNIEnv *jnienv, jclass jthis_class, jint value)
  302. {
  303. int err;
  304. COMPQUIET(jthis_class, NULL);
  305. err = db_env_set_region_init(value);
  306. verify_return(jnienv, err, 0);
  307. }
  308. /*static*/
  309. JNIEXPORT void JNICALL
  310.   Java_com_sleepycat_db_DbEnv_set_1tas_1spins
  311.   (JNIEnv *jnienv, jclass jthis_class, jint value)
  312. {
  313. int err;
  314. COMPQUIET(jthis_class, NULL);
  315. err = db_env_set_tas_spins(value);
  316. verify_return(jnienv, err, 0);
  317. }
  318. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_recovery_1init_1changed
  319.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbRecoveryInit*/ jobject jrecoveryinit)
  320. {
  321. DB_ENV *dbenv;
  322. DB_ENV_JAVAINFO *dbenvinfo;
  323. dbenv = get_DB_ENV(jnienv, jthis);
  324. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  325. if (!verify_non_null(jnienv, dbenv) ||
  326.     !verify_non_null(jnienv, dbenv))
  327. return;
  328. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  329. dbjie_set_recovery_init_object(dbenvinfo, jnienv, dbenv, jrecoveryinit);
  330. JAVADB_ENV_API_END(dbenv);
  331. }
  332. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_set_1lk_1conflicts
  333.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobjectArray array)
  334. {
  335. DB_ENV *dbenv;
  336. DB_ENV_JAVAINFO *dbenvinfo;
  337. int err;
  338. jsize i, len;
  339. unsigned char *newarr;
  340. dbenv = get_DB_ENV(jnienv, jthis);
  341. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  342. if (!verify_non_null(jnienv, dbenv) ||
  343.     !verify_non_null(jnienv, dbenvinfo))
  344. return;
  345. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  346. len = (*jnienv)->GetArrayLength(jnienv, array);
  347. newarr = (unsigned char *)malloc(sizeof(unsigned char) * len * len);
  348. for (i=0; i<len; i++) {
  349. jobject subArray =
  350. (*jnienv)->GetObjectArrayElement(jnienv, array, i);
  351. (*jnienv)->GetByteArrayRegion(jnienv, (jbyteArray)subArray,
  352.       0, len,
  353.       (jbyte *)&newarr[i*len]);
  354. }
  355. dbjie_set_conflict(dbenvinfo, newarr);
  356. err = dbenv->set_lk_conflicts(dbenv, newarr, len);
  357. verify_return(jnienv, err, 0);
  358. JAVADB_ENV_API_END(dbenv);
  359. }
  360. JNIEXPORT void JNICALL
  361.   Java_com_sleepycat_db_DbEnv_set_1server
  362.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring jhost, jlong tsec,
  363.    jlong ssec, jint flags)
  364. {
  365. int err;
  366. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  367. const char *host = (*jnienv)->GetStringUTFChars(jnienv, jhost, NULL);
  368. if (verify_non_null(jnienv, dbenv)) {
  369. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  370. err = dbenv->set_server(dbenv, (char *)host,
  371. (long)tsec, (long)ssec, flags);
  372. /* Throw an exception if the call failed. */
  373. verify_return(jnienv, err, 0);
  374. JAVADB_ENV_API_END(dbenv);
  375. }
  376. }
  377. JNIEXPORT void JNICALL
  378.   Java_com_sleepycat_db_DbEnv_set_1shm_1key
  379.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jlong shm_key)
  380. {
  381. int err;
  382. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  383. if (verify_non_null(jnienv, dbenv)) {
  384. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  385. err = dbenv->set_shm_key(dbenv, (long)shm_key);
  386. /* Throw an exception if the call failed. */
  387. verify_return(jnienv, err, 0);
  388. JAVADB_ENV_API_END(dbenv);
  389. }
  390. }
  391. JNIEXPORT void JNICALL
  392.   Java_com_sleepycat_db_DbEnv__1set_1tx_1timestamp
  393.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jlong seconds)
  394. {
  395. int err;
  396. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  397. time_t time = seconds;
  398. if (verify_non_null(jnienv, dbenv)) {
  399. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  400. err = dbenv->set_tx_timestamp(dbenv, &time);
  401. /* Throw an exception if the call failed. */
  402. verify_return(jnienv, err, 0);
  403. JAVADB_ENV_API_END(dbenv);
  404. }
  405. }
  406. JNIEXPORT void JNICALL
  407.   Java_com_sleepycat_db_DbEnv_set_1verbose
  408.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint which, jint onoff)
  409. {
  410. int err;
  411. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  412. if (verify_non_null(jnienv, dbenv)) {
  413. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  414. err = dbenv->set_verbose(dbenv, which, onoff);
  415. /* Throw an exception if the call failed. */
  416. verify_return(jnienv, err, 0);
  417. JAVADB_ENV_API_END(dbenv);
  418. }
  419. }
  420. /*static*/
  421. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_get_1version_1major
  422.   (JNIEnv * jnienv, jclass this_class)
  423. {
  424. COMPQUIET(jnienv, NULL);
  425. COMPQUIET(this_class, NULL);
  426. return (DB_VERSION_MAJOR);
  427. }
  428. /*static*/
  429. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_get_1version_1minor
  430.   (JNIEnv * jnienv, jclass this_class)
  431. {
  432. COMPQUIET(jnienv, NULL);
  433. COMPQUIET(this_class, NULL);
  434. return (DB_VERSION_MINOR);
  435. }
  436. /*static*/
  437. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_get_1version_1patch
  438.   (JNIEnv * jnienv, jclass this_class)
  439. {
  440. COMPQUIET(jnienv, NULL);
  441. COMPQUIET(this_class, NULL);
  442. return (DB_VERSION_PATCH);
  443. }
  444. /*static*/
  445. JNIEXPORT jstring JNICALL Java_com_sleepycat_db_DbEnv_get_1version_1string
  446.   (JNIEnv *jnienv, jclass this_class)
  447. {
  448. COMPQUIET(this_class, NULL);
  449. return ((*jnienv)->NewStringUTF(jnienv, DB_VERSION_STRING));
  450. }
  451. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_lock_1id
  452.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  453. {
  454. int err;
  455. u_int32_t id;
  456. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  457. if (!verify_non_null(jnienv, dbenv))
  458. return (-1);
  459. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  460. err = lock_id(dbenv, &id);
  461. verify_return(jnienv, err, 0);
  462. JAVADB_ENV_API_END(dbenv);
  463. return (id);
  464. }
  465. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_lock_1stat
  466.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  467. {
  468. int err;
  469. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  470. DB_LOCK_STAT *statp = NULL;
  471. jobject retval = NULL;
  472. jclass dbclass;
  473. if (!verify_non_null(jnienv, dbenv))
  474. return (NULL);
  475. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  476. /* We cannot use the default allocator (on Win* platforms anyway)
  477.  * because it often causes problems when we free storage
  478.  * in a DLL that was allocated in another DLL.  Using
  479.  * our own allocator (ours just calls malloc!) ensures
  480.  * that there is no mismatch.
  481.  */
  482. err = lock_stat(dbenv, &statp, NULL);
  483. if (verify_return(jnienv, err, 0)) {
  484. retval = create_default_object(jnienv, name_DB_LOCK_STAT);
  485. dbclass = get_class(jnienv, name_DB_LOCK_STAT);
  486. /* Set the individual fields */
  487. set_int_field(jnienv, dbclass, retval,
  488.       "st_maxlocks", statp->st_maxlocks);
  489. set_int_field(jnienv, dbclass, retval,
  490.       "st_nmodes", statp->st_nmodes);
  491. set_int_field(jnienv, dbclass, retval,
  492.       "st_nlockers", statp->st_nlockers);
  493. set_int_field(jnienv, dbclass, retval,
  494.       "st_nconflicts", statp->st_nconflicts);
  495. set_int_field(jnienv, dbclass, retval,
  496.       "st_nrequests", statp->st_nrequests);
  497. set_int_field(jnienv, dbclass, retval,
  498.       "st_nreleases", statp->st_nreleases);
  499. set_int_field(jnienv, dbclass, retval,
  500.       "st_ndeadlocks", statp->st_ndeadlocks);
  501. set_int_field(jnienv, dbclass, retval,
  502.       "st_region_wait", statp->st_region_wait);
  503. set_int_field(jnienv, dbclass, retval,
  504.       "st_region_nowait", statp->st_region_nowait);
  505. set_int_field(jnienv, dbclass, retval,
  506.       "st_regsize", statp->st_regsize);
  507. free(statp);
  508. }
  509. JAVADB_ENV_API_END(dbenv);
  510. return (retval);
  511. }
  512. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_lock_1detect
  513.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint atype, jint flags)
  514. {
  515. int err;
  516. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  517. int aborted;
  518. if (!verify_non_null(jnienv, dbenv))
  519. return (0);
  520. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  521. err = lock_detect(dbenv, atype, flags, &aborted);
  522. verify_return(jnienv, err, 0);
  523. JAVADB_ENV_API_END(dbenv);
  524. return (aborted);
  525. }
  526. JNIEXPORT /*DbLock*/ jobject JNICALL Java_com_sleepycat_db_DbEnv_lock_1get
  527.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*u_int32_t*/ jint locker,
  528.    jint flags, /*const Dbt*/ jobject obj, /*db_lockmode_t*/ jint lock_mode)
  529. {
  530. int err;
  531. DB_ENV *dbenv;
  532. DB_LOCK *dblock;
  533. JDBT dbobj;
  534. /*DbLock*/ jobject retval;
  535. dbenv = get_DB_ENV(jnienv, jthis);
  536. if (!verify_non_null(jnienv, dbenv))
  537. return (NULL);
  538. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  539. dblock = (DB_LOCK*)malloc(sizeof(DB_LOCK));
  540. memset(dblock, 0, sizeof(DB_LOCK));
  541. err = 0;
  542. retval = NULL;
  543. if (jdbt_lock(&dbobj, jnienv, obj, inOp) != 0)
  544. goto out;
  545. err = lock_get(dbenv, locker, flags, &dbobj.dbt->dbt,
  546.        (db_lockmode_t)lock_mode, dblock);
  547. if (verify_return(jnienv, err, 0)) {
  548. retval = create_default_object(jnienv, name_DB_LOCK);
  549. set_private_dbobj(jnienv, name_DB_LOCK, retval, dblock);
  550. }
  551.  out:
  552. jdbt_unlock(&dbobj, jnienv);
  553. JAVADB_ENV_API_END(dbenv);
  554. return (retval);
  555. }
  556. JNIEXPORT jobjectArray JNICALL Java_com_sleepycat_db_DbEnv_log_1archive
  557.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  558. {
  559. int err, len, i;
  560. char** ret;
  561. jclass stringClass;
  562. jobjectArray strarray;
  563. DB_ENV *dbenv;
  564. dbenv = get_DB_ENV(jnienv, jthis);
  565. strarray = NULL;
  566. if (!verify_non_null(jnienv, dbenv))
  567. return (0);
  568. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  569. err = log_archive(dbenv, &ret, flags, 0);
  570. if (!verify_return(jnienv, err, 0))
  571. return (0);
  572. if (ret != NULL) {
  573. len = 0;
  574. while (ret[len] != NULL)
  575. len++;
  576. stringClass = (*jnienv)->FindClass(jnienv, "java/lang/String");
  577. strarray = (*jnienv)->NewObjectArray(jnienv, len,
  578.      stringClass, 0);
  579. for (i=0; i<len; i++) {
  580. jstring str = (*jnienv)->NewStringUTF(jnienv, ret[i]);
  581. (*jnienv)->SetObjectArrayElement(jnienv, strarray,
  582.  i, str);
  583. }
  584. }
  585. JAVADB_ENV_API_END(dbenv);
  586. return (strarray);
  587. }
  588. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_log_1compare
  589.   (JNIEnv *jnienv, jclass jthis_class,
  590.    /*DbLsn*/ jobject lsn0, /*DbLsn*/ jobject lsn1)
  591. {
  592. DB_LSN *dblsn0;
  593. DB_LSN *dblsn1;
  594. COMPQUIET(jthis_class, NULL);
  595. dblsn0 = get_DB_LSN(jnienv, lsn0);
  596. dblsn1 = get_DB_LSN(jnienv, lsn1);
  597. return (log_compare(dblsn0, dblsn1));
  598. }
  599. JNIEXPORT jstring JNICALL Java_com_sleepycat_db_DbEnv_log_1file
  600.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbLsn*/ jobject lsn)
  601. {
  602. int err;
  603. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  604. DB_LSN *dblsn = get_DB_LSN(jnienv, lsn);
  605. char filename[FILENAME_MAX+1] = "";
  606. if (!verify_non_null(jnienv, dbenv))
  607. return (NULL);
  608. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  609. err = log_file(dbenv, dblsn, filename, FILENAME_MAX);
  610. verify_return(jnienv, err, 0);
  611. filename[FILENAME_MAX] = ''; /* just to be sure */
  612. JAVADB_ENV_API_END(dbenv);
  613. return (get_java_string(jnienv, filename));
  614. }
  615. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_log_1flush
  616.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbLsn*/ jobject lsn)
  617. {
  618. int err;
  619. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  620. DB_LSN *dblsn = get_DB_LSN(jnienv, lsn);
  621. if (!verify_non_null(jnienv, dbenv))
  622. return;
  623. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  624. err = log_flush(dbenv, dblsn);
  625. verify_return(jnienv, err, 0);
  626. JAVADB_ENV_API_END(dbenv);
  627. }
  628. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_log_1get
  629.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbLsn*/ jobject lsn,
  630.    /*DbDbt*/ jobject data, jint flags)
  631. {
  632. int err, retry;
  633. DB_ENV *dbenv;
  634. DB_LSN *dblsn;
  635. JDBT dbdata;
  636. dbenv = get_DB_ENV(jnienv, jthis);
  637. dblsn = get_DB_LSN(jnienv, lsn);
  638. if (!verify_non_null(jnienv, dbenv))
  639. return;
  640. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  641. if (jdbt_lock(&dbdata, jnienv, data, outOp) != 0)
  642. goto out;
  643. for (retry = 0; retry < 3; retry++) {
  644. err = log_get(dbenv, dblsn, &dbdata.dbt->dbt, flags);
  645. /* If we failed due to lack of memory in our DBT arrays,
  646.  * retry.
  647.  */
  648. if (err != ENOMEM)
  649. break;
  650. if (!jdbt_realloc(&dbdata, jnienv))
  651. break;
  652. }
  653. verify_return(jnienv, err, 0);
  654.  out:
  655. jdbt_unlock(&dbdata, jnienv);
  656. JAVADB_ENV_API_END(dbenv);
  657. }
  658. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_log_1put
  659.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbLsn*/ jobject lsn,
  660.    /*DbDbt*/ jobject data, jint flags)
  661. {
  662. int err;
  663. DB_ENV *dbenv;
  664. DB_LSN *dblsn;
  665. JDBT dbdata;
  666. dbenv = get_DB_ENV(jnienv, jthis);
  667. dblsn = get_DB_LSN(jnienv, lsn);
  668. if (!verify_non_null(jnienv, dbenv))
  669. return;
  670. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  671. if (jdbt_lock(&dbdata, jnienv, data, inOp) != 0)
  672. goto out;
  673. err = log_put(dbenv, dblsn, &dbdata.dbt->dbt, flags);
  674. verify_return(jnienv, err, 0);
  675.  out:
  676. jdbt_unlock(&dbdata, jnienv);
  677. JAVADB_ENV_API_END(dbenv);
  678. }
  679. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_log_1register
  680.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*Db*/ jobject dbp,
  681.    jstring name)
  682. {
  683. int err;
  684. DB_ENV *dbenv;
  685. DB *dbdb;
  686. JSTR dbname;
  687. dbenv = get_DB_ENV(jnienv, jthis);
  688. dbdb = get_DB(jnienv, dbp);
  689. if (!verify_non_null(jnienv, dbenv))
  690. return;
  691. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  692. if (jstr_lock(&dbname, jnienv, name) != 0)
  693. goto out;
  694. err = log_register(dbenv, dbdb, dbname.string);
  695. verify_return(jnienv, err, 0);
  696.  out:
  697. jstr_unlock(&dbname, jnienv);
  698. JAVADB_ENV_API_END(dbenv);
  699. }
  700. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_log_1unregister
  701.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*Db*/ jobject dbp)
  702. {
  703. int err;
  704. DB_ENV *dbenv;
  705. DB *dbdb;
  706. dbenv = get_DB_ENV(jnienv, jthis);
  707. dbdb = get_DB(jnienv, dbp);
  708. if (!verify_non_null(jnienv, dbenv))
  709. return;
  710. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  711. err = log_unregister(dbenv, dbdb);
  712. verify_return(jnienv, err, 0);
  713. JAVADB_ENV_API_END(dbenv);
  714. }
  715. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_log_1stat
  716.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  717. {
  718. int err;
  719. DB_ENV *dbenv;
  720. DB_LOG_STAT *statp;
  721. jobject retval;
  722. jclass dbclass;
  723. retval = NULL;
  724. statp = NULL;
  725. dbenv = get_DB_ENV(jnienv, jthis);
  726. if (!verify_non_null(jnienv, dbenv))
  727. return (NULL);
  728. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  729. /* We cannot use the default allocator (on Win* platforms anyway)
  730.  * because it often causes problems when we free storage
  731.  * in a DLL that was allocated in another DLL.  Using
  732.  * our own allocator (ours just calls malloc!) ensures
  733.  * that there is no mismatch.
  734.  */
  735. err = log_stat(dbenv, &statp, NULL);
  736. if (verify_return(jnienv, err, 0)) {
  737. retval = create_default_object(jnienv, name_DB_LOG_STAT);
  738. dbclass = get_class(jnienv, name_DB_LOG_STAT);
  739. /* Set the individual fields */
  740. set_int_field(jnienv, dbclass, retval,
  741.       "st_magic", statp->st_magic);
  742. set_int_field(jnienv, dbclass, retval,
  743.       "st_version", statp->st_version);
  744. set_int_field(jnienv, dbclass, retval,
  745.       "st_mode", statp->st_mode);
  746. set_int_field(jnienv, dbclass, retval,
  747.       "st_lg_max", statp->st_lg_max);
  748. set_int_field(jnienv, dbclass, retval,
  749.       "st_w_bytes", statp->st_w_bytes);
  750. set_int_field(jnienv, dbclass, retval,
  751.       "st_w_mbytes", statp->st_w_mbytes);
  752. set_int_field(jnienv, dbclass, retval,
  753.       "st_wc_bytes", statp->st_wc_bytes);
  754. set_int_field(jnienv, dbclass, retval,
  755.       "st_wc_mbytes", statp->st_wc_mbytes);
  756. set_int_field(jnienv, dbclass, retval,
  757.       "st_wcount", statp->st_wcount);
  758. set_int_field(jnienv, dbclass, retval,
  759.       "st_scount", statp->st_scount);
  760. set_int_field(jnienv, dbclass, retval,
  761.       "st_region_wait", statp->st_region_wait);
  762. set_int_field(jnienv, dbclass, retval,
  763.       "st_region_nowait", statp->st_region_nowait);
  764. set_int_field(jnienv, dbclass, retval,
  765.       "st_cur_file", statp->st_cur_file);
  766. set_int_field(jnienv, dbclass, retval,
  767.       "st_cur_offset", statp->st_cur_offset);
  768. set_int_field(jnienv, dbclass, retval,
  769.       "st_regsize", statp->st_regsize);
  770. free(statp);
  771. }
  772. JAVADB_ENV_API_END(dbenv);
  773. return (retval);
  774. }
  775. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_memp_1stat
  776.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  777. {
  778. int err;
  779. jclass dbclass;
  780. DB_ENV *dbenv;
  781. DB_MPOOL_STAT *statp;
  782. jobject retval;
  783. retval = NULL;
  784. statp = NULL;
  785. dbenv = get_DB_ENV(jnienv, jthis);
  786. if (!verify_non_null(jnienv, dbenv))
  787. return (NULL);
  788. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  789. /* We cannot use the default allocator (on Win* platforms anyway)
  790.  * because it often causes problems when we free storage
  791.  * in a DLL that was allocated in another DLL.  Using
  792.  * our own allocator (ours just calls malloc!) ensures
  793.  * that there is no mismatch.
  794.  */
  795. err = memp_stat(dbenv, &statp, 0, NULL);
  796. if (verify_return(jnienv, err, 0)) {
  797. retval = create_default_object(jnienv, name_DB_MPOOL_STAT);
  798. dbclass = get_class(jnienv, name_DB_MPOOL_STAT);
  799. set_int_field(jnienv, dbclass, retval, "st_cachesize", 0);
  800. set_int_field(jnienv, dbclass, retval,
  801.       "st_cache_hit", statp->st_cache_hit);
  802. set_int_field(jnienv, dbclass, retval,
  803.       "st_cache_miss", statp->st_cache_miss);
  804. set_int_field(jnienv, dbclass, retval,
  805.       "st_map", statp->st_map);
  806. set_int_field(jnienv, dbclass, retval,
  807.       "st_page_create", statp->st_page_create);
  808. set_int_field(jnienv, dbclass, retval,
  809.       "st_page_in", statp->st_page_in);
  810. set_int_field(jnienv, dbclass, retval,
  811.       "st_page_out", statp->st_page_out);
  812. set_int_field(jnienv, dbclass, retval,
  813.       "st_ro_evict", statp->st_ro_evict);
  814. set_int_field(jnienv, dbclass, retval,
  815.       "st_rw_evict", statp->st_rw_evict);
  816. set_int_field(jnienv, dbclass, retval,
  817.       "st_hash_buckets", statp->st_hash_buckets);
  818. set_int_field(jnienv, dbclass, retval,
  819.       "st_hash_searches", statp->st_hash_searches);
  820. set_int_field(jnienv, dbclass, retval,
  821.       "st_hash_longest", statp->st_hash_longest);
  822. set_int_field(jnienv, dbclass, retval,
  823.       "st_hash_examined", statp->st_hash_examined);
  824. set_int_field(jnienv, dbclass, retval,
  825.       "st_page_clean", statp->st_page_clean);
  826. set_int_field(jnienv, dbclass, retval,
  827.       "st_page_dirty", statp->st_page_dirty);
  828. set_int_field(jnienv, dbclass, retval,
  829.       "st_page_trickle", statp->st_page_trickle);
  830. set_int_field(jnienv, dbclass, retval,
  831.       "st_region_wait", statp->st_region_wait);
  832. set_int_field(jnienv, dbclass, retval,
  833.       "st_region_nowait", statp->st_region_nowait);
  834. set_int_field(jnienv, dbclass, retval,
  835.       "st_regsize", statp->st_regsize);
  836. free(statp);
  837. }
  838. JAVADB_ENV_API_END(dbenv);
  839. return (retval);
  840. }
  841. JNIEXPORT jobjectArray JNICALL Java_com_sleepycat_db_DbEnv_memp_1fstat
  842.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  843. {
  844. int err, i, len;
  845. jclass fstat_class;
  846. DB_ENV *dbenv;
  847. DB_MPOOL_FSTAT **fstatp;
  848. jobjectArray retval;
  849. jfieldID filename_id;
  850. jstring jfilename;
  851. fstatp = NULL;
  852. retval = NULL;
  853. dbenv = get_DB_ENV(jnienv, jthis);
  854. if (!verify_non_null(jnienv, dbenv))
  855. return (NULL);
  856. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  857. /* We cannot use the default allocator (on Win* platforms anyway)
  858.  * because it often causes problems when we free storage
  859.  * in a DLL that was allocated in another DLL.  Using
  860.  * our own allocator (ours just calls malloc!) ensures
  861.  * that there is no mismatch.
  862.  */
  863. err = memp_stat(dbenv, 0, &fstatp, NULL);
  864. if (verify_return(jnienv, err, 0)) {
  865. len = 0;
  866. while (fstatp[len])
  867. len++;
  868. fstat_class = get_class(jnienv, name_DB_MPOOL_FSTAT);
  869. retval = (*jnienv)->NewObjectArray(jnienv, len,
  870.    fstat_class, 0);
  871. for (i=0; i<len; i++) {
  872. jobject obj = create_default_object(jnienv,
  873.     name_DB_MPOOL_FSTAT);
  874. (*jnienv)->SetObjectArrayElement(jnienv, retval,
  875.  i, obj);
  876. /* Set the string field. */
  877. filename_id =
  878. (*jnienv)->GetFieldID(jnienv, fstat_class,
  879.       "file_name",
  880.       string_signature);
  881. jfilename =
  882. get_java_string(jnienv, fstatp[i]->file_name);
  883. (*jnienv)->SetObjectField(jnienv, obj,
  884.   filename_id, jfilename);
  885. set_int_field(jnienv, fstat_class, obj,
  886.       "st_pagesize", fstatp[i]->st_pagesize);
  887. set_int_field(jnienv, fstat_class, obj,
  888.       "st_cache_hit", fstatp[i]->st_cache_hit);
  889. set_int_field(jnienv, fstat_class, obj,
  890.       "st_cache_miss", fstatp[i]->st_cache_miss);
  891. set_int_field(jnienv, fstat_class, obj,
  892.       "st_map", fstatp[i]->st_map);
  893. set_int_field(jnienv, fstat_class, obj,
  894.       "st_page_create", fstatp[i]->st_page_create);
  895. set_int_field(jnienv, fstat_class, obj,
  896.       "st_page_in", fstatp[i]->st_page_in);
  897. set_int_field(jnienv, fstat_class, obj,
  898.       "st_page_out", fstatp[i]->st_page_out);
  899. free(fstatp[i]);
  900. }
  901. free(fstatp);
  902. }
  903. JAVADB_ENV_API_END(dbenv);
  904. return (retval);
  905. }
  906. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_memp_1trickle
  907.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint pct)
  908. {
  909. int err;
  910. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  911. int result = 0;
  912. if (verify_non_null(jnienv, dbenv)) {
  913. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  914. err = memp_trickle(dbenv, pct, &result);
  915. verify_return(jnienv, err, 0);
  916. JAVADB_ENV_API_END(dbenv);
  917. }
  918. return (result);
  919. }
  920. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_txn_1begin
  921.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbTxn*/ jobject pid, jint flags)
  922. {
  923. int err;
  924. DB_TXN *dbpid, *result;
  925. DB_ENV *dbenv;
  926. dbenv = get_DB_ENV(jnienv, jthis);
  927. if (!verify_non_null(jnienv, dbenv))
  928. return (0);
  929. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  930. dbpid = get_DB_TXN(jnienv, pid);
  931. result = 0;
  932. err = txn_begin(dbenv, dbpid, &result, flags);
  933. if (!verify_return(jnienv, err, 0))
  934. return (0);
  935. JAVADB_ENV_API_END(dbenv);
  936. return (get_DbTxn(jnienv, result));
  937. }
  938. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_txn_1checkpoint
  939.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint kbyte, jint min, jint flags)
  940. {
  941. int err;
  942. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  943. if (!verify_non_null(jnienv, dbenv))
  944. return (0);
  945. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  946. err = txn_checkpoint(dbenv, kbyte, min, flags);
  947. if (err != DB_INCOMPLETE)
  948. verify_return(jnienv, err, 0);
  949. JAVADB_ENV_API_END(dbenv);
  950. return (err);
  951. }
  952. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_tx_1recover_1changed
  953.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbFeedback*/ jobject jtxrecover)
  954. {
  955. DB_ENV *dbenv;
  956. DB_ENV_JAVAINFO *dbenvinfo;
  957. dbenv = get_DB_ENV(jnienv, jthis);
  958. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  959. if (!verify_non_null(jnienv, dbenv) ||
  960.     !verify_non_null(jnienv, dbenvinfo))
  961. return;
  962. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  963. dbjie_set_tx_recover_object(dbenvinfo, jnienv, dbenv, jtxrecover);
  964. JAVADB_ENV_API_END(dbenv);
  965. }
  966. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_txn_1stat
  967.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  968. {
  969. int err;
  970. DB_ENV *dbenv;
  971. DB_TXN_STAT *statp;
  972. jobject retval, obj;
  973. jclass dbclass, active_class;
  974. char active_signature[512];
  975. jfieldID arrid;
  976. jobjectArray actives;
  977. unsigned int i;
  978. retval = NULL;
  979. statp = NULL;
  980. dbenv = get_DB_ENV(jnienv, jthis);
  981. if (!verify_non_null(jnienv, dbenv))
  982. return (NULL);
  983. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  984. /* We cannot use the default allocator (on Win* platforms anyway)
  985.  * because it often causes problems when we free storage
  986.  * in a DLL that was allocated in another DLL.  Using
  987.  * our own allocator (ours just calls malloc!) ensures
  988.  * that there is no mismatch.
  989.  */
  990. err = txn_stat(dbenv, &statp, NULL);
  991. if (verify_return(jnienv, err, 0)) {
  992. retval = create_default_object(jnienv, name_DB_TXN_STAT);
  993. dbclass = get_class(jnienv, name_DB_TXN_STAT);
  994. /* Set the individual fields */
  995. set_lsn_field(jnienv, dbclass, retval,
  996.       "st_last_ckp", statp->st_last_ckp);
  997. set_lsn_field(jnienv, dbclass, retval,
  998.       "st_pending_ckp", statp->st_pending_ckp);
  999. set_long_field(jnienv, dbclass, retval,
  1000.        "st_time_ckp", statp->st_time_ckp);
  1001. set_int_field(jnienv, dbclass, retval,
  1002.       "st_last_txnid", statp->st_last_txnid);
  1003. set_int_field(jnienv, dbclass, retval,
  1004.       "st_maxtxns", statp->st_maxtxns);
  1005. set_int_field(jnienv, dbclass, retval,
  1006.       "st_naborts", statp->st_naborts);
  1007. set_int_field(jnienv, dbclass, retval,
  1008.       "st_nbegins", statp->st_nbegins);
  1009. set_int_field(jnienv, dbclass, retval,
  1010.       "st_ncommits", statp->st_ncommits);
  1011. set_int_field(jnienv, dbclass, retval,
  1012.       "st_nactive", statp->st_nactive);
  1013. set_int_field(jnienv, dbclass, retval,
  1014.       "st_maxnactive", statp->st_maxnactive);
  1015. active_class = get_class(jnienv, name_DB_TXN_STAT_ACTIVE);
  1016. actives =
  1017. (*jnienv)->NewObjectArray(jnienv, statp->st_nactive,
  1018.   active_class, 0);
  1019. /* Set the st_txnarray field.  This is a little more involved
  1020.  * than other fields, since the type is an array, so none
  1021.  * of our utility functions help.
  1022.  */
  1023. strncpy(active_signature, "[L", sizeof(active_signature));
  1024. strncat(active_signature, DB_PACKAGE_NAME,
  1025. sizeof(active_signature));
  1026. strncat(active_signature, name_DB_TXN_STAT_ACTIVE,
  1027. sizeof(active_signature));
  1028. strncat(active_signature, ";", sizeof(active_signature));
  1029. arrid = (*jnienv)->GetFieldID(jnienv, dbclass, "st_txnarray",
  1030.       active_signature);
  1031. (*jnienv)->SetObjectField(jnienv, retval, arrid, actives);
  1032. /* Now fill the in the elements of st_txnarray. */
  1033. for (i=0; i<statp->st_nactive; i++) {
  1034. obj = create_default_object(jnienv, name_DB_TXN_STAT_ACTIVE);
  1035. (*jnienv)->SetObjectArrayElement(jnienv, actives, i, obj);
  1036. set_int_field(jnienv, active_class, obj,
  1037.       "txnid", statp->st_txnarray[i].txnid);
  1038. set_int_field(jnienv, active_class, obj,
  1039.       "parentid", statp->st_txnarray[i].parentid);
  1040. set_lsn_field(jnienv, active_class, obj,
  1041.       "lsn", statp->st_txnarray[i].lsn);
  1042. }
  1043. set_int_field(jnienv, dbclass, retval,
  1044.       "st_region_wait", statp->st_region_wait);
  1045. set_int_field(jnienv, dbclass, retval,
  1046.       "st_region_nowait", statp->st_region_nowait);
  1047. set_int_field(jnienv, dbclass, retval,
  1048.       "st_regsize", statp->st_regsize);
  1049. free(statp);
  1050. }
  1051. JAVADB_ENV_API_END(dbenv);
  1052. return (retval);
  1053. }
  1054. /* See discussion on errpfx, errcall in DB_ENV_JAVAINFO */
  1055. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1set_1errcall
  1056.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobject errcall)
  1057. {
  1058. DB_ENV *dbenv;
  1059. DB_ENV_JAVAINFO *dbenvinfo;
  1060. dbenv = get_DB_ENV(jnienv, jthis);
  1061. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  1062. if (verify_non_null(jnienv, dbenv) &&
  1063.     verify_non_null(jnienv, dbenvinfo)) {
  1064. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  1065. dbjie_set_errcall(dbenvinfo, jnienv, errcall);
  1066. JAVADB_ENV_API_END(dbenv);
  1067. }
  1068. }
  1069. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1set_1errpfx
  1070.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring str)
  1071. {
  1072. DB_ENV *dbenv;
  1073. DB_ENV_JAVAINFO *dbenvinfo;
  1074. dbenv = get_DB_ENV(jnienv, jthis);
  1075. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  1076. if (verify_non_null(jnienv, dbenv) &&
  1077.     verify_non_null(jnienv, dbenvinfo)) {
  1078. JAVADB_ENV_API_BEGIN(dbenv, jthis);
  1079. dbjie_set_errpfx(dbenvinfo, jnienv, str);
  1080. JAVADB_ENV_API_END(dbenv);
  1081. }
  1082. }
  1083. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1finalize
  1084.     (JNIEnv *jnienv, /*DbEnv*/ jobject jthis,
  1085.      jobject /*DbErrcall*/ errcall, jstring errpfx)
  1086. {
  1087. DB_ENV *dbenv;
  1088. DB_ENV_JAVAINFO *envinfo;
  1089. dbenv = get_DB_ENV(jnienv, jthis);
  1090. envinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  1091. DB_ASSERT(envinfo != NULL);
  1092. /* Note:  We detect unclosed DbEnvs and report it.
  1093.  */
  1094. if (dbenv != NULL && envinfo != NULL && !dbjie_is_dbopen(envinfo)) {
  1095. /* If this error occurs, this object was never closed. */
  1096. report_errcall(jnienv, errcall, errpfx,
  1097.        "DbEnv.finalize: open DbEnv object destroyed");
  1098. }
  1099. /* Shouldn't see this object again, but just in case */
  1100. set_private_dbobj(jnienv, name_DB_ENV, jthis, 0);
  1101. set_private_info(jnienv, name_DB_ENV, jthis, 0);
  1102. dbjie_destroy(envinfo, jnienv);
  1103. }