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

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. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: java_DbEnv.c,v 11.105 2002/08/29 14:22:23 margo Exp $";
  10. #endif /* not lint */
  11. #include <jni.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include "db_int.h"
  15. #include "java_util.h"
  16. #include "java_stat_auto.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_SET_METH_STR(DbEnv,   data_1dir, DB_ENV, data_dir)
  22. JAVADB_SET_METH(DbEnv, jint, lg_1bsize, DB_ENV, lg_bsize)
  23. JAVADB_SET_METH_STR(DbEnv,   lg_1dir, DB_ENV, lg_dir)
  24. JAVADB_SET_METH(DbEnv, jint, lg_1max, DB_ENV, lg_max)
  25. JAVADB_SET_METH(DbEnv, jint, lg_1regionmax, DB_ENV, lg_regionmax)
  26. JAVADB_SET_METH(DbEnv, jint, lk_1detect, DB_ENV, lk_detect)
  27. JAVADB_SET_METH(DbEnv, jint, lk_1max, DB_ENV, lk_max)
  28. JAVADB_SET_METH(DbEnv, jint, lk_1max_1locks, DB_ENV, lk_max_locks)
  29. JAVADB_SET_METH(DbEnv, jint, lk_1max_1lockers, DB_ENV, lk_max_lockers)
  30. JAVADB_SET_METH(DbEnv, jint, lk_1max_1objects, DB_ENV, lk_max_objects)
  31. /* mp_mmapsize is declared below, it needs an extra cast */
  32. JAVADB_SET_METH_STR(DbEnv,   tmp_1dir, DB_ENV, tmp_dir)
  33. JAVADB_SET_METH(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. /*
  40.  * Note: these error cases are "impossible", and would
  41.  * normally warrant an exception.  However, without
  42.  * a jnienv, we cannot throw an exception...
  43.  * We don't want to trap or exit, since the point of
  44.  * this facility is for the user to completely control
  45.  * error situations.
  46.  */
  47. if (envinfo == NULL) {
  48. /*
  49.  * Something is *really* wrong here, the
  50.  * prefix is set in every environment created.
  51.  */
  52. fprintf(stderr, "Error callback failed!n");
  53. fprintf(stderr, "error: %sn", message);
  54. return;
  55. }
  56. /* Should always succeed... */
  57. jnienv = dbjie_get_jnienv(envinfo);
  58. if (jnienv == NULL) {
  59. /* But just in case... */
  60. fprintf(stderr, "Cannot attach to current thread!n");
  61. fprintf(stderr, "error: %sn", message);
  62. return;
  63. }
  64. pre = dbjie_get_errpfx(envinfo, jnienv);
  65. report_errcall(jnienv, dbjie_get_errcall(envinfo), pre, message);
  66. }
  67. static void DbEnv_initialize(JNIEnv *jnienv, DB_ENV *dbenv,
  68.      /*DbEnv*/ jobject jenv,
  69.      /*DbErrcall*/ jobject jerrcall,
  70.      int is_dbopen)
  71. {
  72. DB_ENV_JAVAINFO *envinfo;
  73. envinfo = get_DB_ENV_JAVAINFO(jnienv, jenv);
  74. DB_ASSERT(envinfo == NULL);
  75. envinfo = dbjie_construct(jnienv, jenv, jerrcall, is_dbopen);
  76. set_private_info(jnienv, name_DB_ENV, jenv, envinfo);
  77. dbenv->set_errpfx(dbenv, (const char*)envinfo);
  78. dbenv->set_errcall(dbenv, DbEnv_errcall_callback);
  79. dbenv->api2_internal = envinfo;
  80. set_private_dbobj(jnienv, name_DB_ENV, jenv, dbenv);
  81. }
  82. /*
  83.  * This is called when this DbEnv was made on behalf of a Db
  84.  * created directly (without a parent DbEnv), and the Db is
  85.  * being closed.  We'll zero out the pointer to the DB_ENV,
  86.  * since it is no longer valid, to prevent mistakes.
  87.  */
  88. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1notify_1db_1close
  89.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  90. {
  91. DB_ENV_JAVAINFO *dbenvinfo;
  92. set_private_dbobj(jnienv, name_DB_ENV, jthis, 0);
  93. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  94. if (dbenvinfo != NULL)
  95. dbjie_dealloc(dbenvinfo, jnienv);
  96. }
  97. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_feedback_1changed
  98.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis,
  99.    /*DbEnvFeedback*/ jobject jfeedback)
  100. {
  101. DB_ENV *dbenv;
  102. DB_ENV_JAVAINFO *dbenvinfo;
  103. dbenv = get_DB_ENV(jnienv, jthis);
  104. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  105. if (!verify_non_null(jnienv, dbenv) ||
  106.     !verify_non_null(jnienv, dbenvinfo))
  107. return;
  108. dbjie_set_feedback_object(dbenvinfo, jnienv, dbenv, jfeedback);
  109. }
  110. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1init
  111.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobject /*DbErrcall*/ jerrcall,
  112.    jint flags)
  113. {
  114. int err;
  115. DB_ENV *dbenv;
  116. err = db_env_create(&dbenv, flags);
  117. if (verify_return(jnienv, err, 0))
  118. DbEnv_initialize(jnienv, dbenv, jthis, jerrcall, 0);
  119. }
  120. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1init_1using_1db
  121.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobject /*DbErrcall*/ jerrcall,
  122.    /*Db*/ jobject jdb)
  123. {
  124. DB_ENV *dbenv;
  125. DB *db;
  126. db = get_DB(jnienv, jdb);
  127. dbenv = db->dbenv;
  128. DbEnv_initialize(jnienv, dbenv, jthis, jerrcall, 0);
  129. }
  130. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_open
  131.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring db_home,
  132.    jint flags, jint mode)
  133. {
  134. int err;
  135. DB_ENV *dbenv;
  136. LOCKED_STRING ls_home;
  137. DB_ENV_JAVAINFO *dbenvinfo;
  138. dbenv = get_DB_ENV(jnienv, jthis);
  139. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  140. if (!verify_non_null(jnienv, dbenv) ||
  141.     !verify_non_null(jnienv, dbenvinfo))
  142. return;
  143. if (locked_string_get(&ls_home, jnienv, db_home) != 0)
  144. goto out;
  145. /* Java is assumed to be threaded. */
  146. flags |= DB_THREAD;
  147. err = dbenv->open(dbenv, ls_home.string, flags, mode);
  148. verify_return(jnienv, err, EXCEPTION_FILE_NOT_FOUND);
  149.  out:
  150. locked_string_put(&ls_home, jnienv);
  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. LOCKED_STRING ls_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. if (locked_string_get(&ls_home, jnienv, db_home) != 0)
  164. goto out;
  165. err = dbenv->remove(dbenv, ls_home.string, flags);
  166. set_private_dbobj(jnienv, name_DB_ENV, jthis, 0);
  167. verify_return(jnienv, err, 0);
  168.  out:
  169. locked_string_put(&ls_home, jnienv);
  170. if (dbenvinfo != NULL)
  171. dbjie_dealloc(dbenvinfo, jnienv);
  172. }
  173. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1close
  174.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  175. {
  176. int err;
  177. DB_ENV *dbenv;
  178. DB_ENV_JAVAINFO *dbenvinfo;
  179. dbenv = get_DB_ENV(jnienv, jthis);
  180. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  181. if (!verify_non_null(jnienv, dbenv))
  182. return;
  183. err = dbenv->close(dbenv, flags);
  184. set_private_dbobj(jnienv, name_DB_ENV, jthis, 0);
  185. if (dbenvinfo != NULL)
  186. dbjie_dealloc(dbenvinfo, jnienv);
  187. /* Throw an exception if the close failed. */
  188. verify_return(jnienv, err, 0);
  189. }
  190. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_dbremove
  191.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbTxn*/ jobject jtxn,
  192.    jstring name, jstring subdb, jint flags)
  193. {
  194. LOCKED_STRING ls_name, ls_subdb;
  195. DB_ENV *dbenv;
  196. DB_TXN *txn;
  197. int err;
  198. dbenv = get_DB_ENV(jnienv, jthis);
  199. if (!verify_non_null(jnienv, dbenv))
  200. return;
  201. txn = get_DB_TXN(jnienv, jtxn);
  202. if (locked_string_get(&ls_name, jnienv, name) != 0)
  203. return;
  204. if (locked_string_get(&ls_subdb, jnienv, subdb) != 0)
  205. goto err1;
  206. err = dbenv->dbremove(dbenv, txn, ls_name.string, ls_subdb.string,
  207.     flags);
  208. /* Throw an exception if the dbremove failed. */
  209. verify_return(jnienv, err, 0);
  210. locked_string_put(&ls_subdb, jnienv);
  211. err1: locked_string_put(&ls_name, jnienv);
  212. }
  213. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_dbrename
  214.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbTxn*/ jobject jtxn,
  215.    jstring name, jstring subdb, jstring newname, jint flags)
  216. {
  217. LOCKED_STRING ls_name, ls_subdb, ls_newname;
  218. DB_ENV *dbenv;
  219. DB_TXN *txn;
  220. int err;
  221. dbenv = get_DB_ENV(jnienv, jthis);
  222. if (!verify_non_null(jnienv, dbenv))
  223. return;
  224. txn = get_DB_TXN(jnienv, jtxn);
  225. if (locked_string_get(&ls_name, jnienv, name) != 0)
  226. return;
  227. if (locked_string_get(&ls_subdb, jnienv, subdb) != 0)
  228. goto err2;
  229. if (locked_string_get(&ls_newname, jnienv, newname) != 0)
  230. goto err1;
  231. err = dbenv->dbrename(dbenv, txn, ls_name.string, ls_subdb.string,
  232.     ls_newname.string, flags);
  233. /* Throw an exception if the dbrename failed. */
  234. verify_return(jnienv, err, 0);
  235. locked_string_put(&ls_newname, jnienv);
  236. err1: locked_string_put(&ls_subdb, jnienv);
  237. err2: locked_string_put(&ls_name, jnienv);
  238. }
  239. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_err
  240.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint ecode, jstring msg)
  241. {
  242. LOCKED_STRING ls_msg;
  243. DB_ENV *dbenv;
  244. dbenv = get_DB_ENV(jnienv, jthis);
  245. if (!verify_non_null(jnienv, dbenv))
  246. return;
  247. if (locked_string_get(&ls_msg, jnienv, msg) != 0)
  248. goto out;
  249. dbenv->err(dbenv, ecode, "%s", ls_msg.string);
  250.  out:
  251. locked_string_put(&ls_msg, jnienv);
  252. }
  253. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_errx
  254.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring msg)
  255. {
  256. LOCKED_STRING ls_msg;
  257. DB_ENV *dbenv;
  258. dbenv = get_DB_ENV(jnienv, jthis);
  259. if (!verify_non_null(jnienv, dbenv))
  260. return;
  261. if (locked_string_get(&ls_msg, jnienv, msg) != 0)
  262. goto out;
  263. dbenv->errx(dbenv, "%s", ls_msg.string);
  264.  out:
  265. locked_string_put(&ls_msg, jnienv);
  266. }
  267. /*static*/
  268. JNIEXPORT jstring JNICALL Java_com_sleepycat_db_DbEnv_strerror
  269.   (JNIEnv *jnienv, jclass jthis_class, jint ecode)
  270. {
  271. const char *message;
  272. COMPQUIET(jthis_class, NULL);
  273. message = db_strerror(ecode);
  274. return (get_java_string(jnienv, message));
  275. }
  276. JAVADB_METHOD(DbEnv_set_1cachesize,
  277.     (JAVADB_ARGS, jint gbytes, jint bytes, jint ncaches), DB_ENV,
  278.     set_cachesize, (c_this, gbytes, bytes, ncaches))
  279. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_set_1encrypt
  280.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring jpasswd, jint flags)
  281. {
  282. int err;
  283. DB_ENV *dbenv;
  284. LOCKED_STRING ls_passwd;
  285. dbenv = get_DB_ENV(jnienv, jthis);
  286. if (!verify_non_null(jnienv, dbenv))
  287. return;
  288. if (locked_string_get(&ls_passwd, jnienv, jpasswd) != 0)
  289. goto out;
  290. err = dbenv->set_encrypt(dbenv, ls_passwd.string, flags);
  291. verify_return(jnienv, err, 0);
  292. out: locked_string_put(&ls_passwd, jnienv);
  293. }
  294. JAVADB_METHOD(DbEnv_set_1flags,
  295.     (JAVADB_ARGS, jint flags, jboolean onoff), DB_ENV,
  296.     set_flags, (c_this, flags, onoff ? 1 : 0))
  297. JAVADB_METHOD(DbEnv_set_1mp_1mmapsize, (JAVADB_ARGS, jlong value), DB_ENV,
  298.     set_mp_mmapsize, (c_this, (size_t)value))
  299. JAVADB_METHOD(DbEnv_set_1tas_1spins, (JAVADB_ARGS, jint spins), DB_ENV,
  300.     set_tas_spins, (c_this, (u_int32_t)spins))
  301. JAVADB_METHOD(DbEnv_set_1timeout,
  302.     (JAVADB_ARGS, jlong timeout, jint flags), DB_ENV,
  303.     set_timeout, (c_this, (u_int32_t)timeout, flags))
  304. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_set_1lk_1conflicts
  305.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobjectArray array)
  306. {
  307. DB_ENV *dbenv;
  308. DB_ENV_JAVAINFO *dbenvinfo;
  309. int err;
  310. jsize i, len;
  311. u_char *newarr;
  312. int bytesize;
  313. dbenv = get_DB_ENV(jnienv, jthis);
  314. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  315. if (!verify_non_null(jnienv, dbenv) ||
  316.     !verify_non_null(jnienv, dbenvinfo))
  317. return;
  318. len = (*jnienv)->GetArrayLength(jnienv, array);
  319. bytesize = sizeof(u_char) * len * len;
  320. if ((err = __os_malloc(dbenv, bytesize, &newarr)) != 0) {
  321. if (!verify_return(jnienv, err, 0))
  322. return;
  323. }
  324. for (i=0; i<len; i++) {
  325. jobject subArray =
  326. (*jnienv)->GetObjectArrayElement(jnienv, array, i);
  327. (*jnienv)->GetByteArrayRegion(jnienv, (jbyteArray)subArray,
  328.       0, len,
  329.       (jbyte *)&newarr[i*len]);
  330. }
  331. dbjie_set_conflict(dbenvinfo, newarr, bytesize);
  332. err = dbenv->set_lk_conflicts(dbenv, newarr, len);
  333. verify_return(jnienv, err, 0);
  334. }
  335. JNIEXPORT jint JNICALL
  336.   Java_com_sleepycat_db_DbEnv_rep_1elect
  337.   (JNIEnv *jnienv, /* DbEnv */ jobject jthis, jint nsites, jint pri,
  338.    jint timeout)
  339. {
  340. DB_ENV *dbenv;
  341. int err, id;
  342. if (!verify_non_null(jnienv, jthis))
  343. return (DB_EID_INVALID);
  344. dbenv = get_DB_ENV(jnienv, jthis);
  345. err = dbenv->rep_elect(dbenv, (int)nsites,
  346.     (int)pri, (u_int32_t)timeout, &id);
  347. verify_return(jnienv, err, 0);
  348. return ((jint)id);
  349. }
  350. JNIEXPORT jint JNICALL
  351.   Java_com_sleepycat_db_DbEnv_rep_1process_1message
  352.   (JNIEnv *jnienv, /* DbEnv */ jobject jthis, /* Dbt */ jobject control,
  353.   /* Dbt */ jobject rec, /* RepProcessMessage */ jobject result)
  354. {
  355. DB_ENV *dbenv;
  356. LOCKED_DBT cdbt, rdbt;
  357. int err, envid;
  358. if (!verify_non_null(jnienv, jthis) || !verify_non_null(jnienv, result))
  359. return (-1);
  360. dbenv = get_DB_ENV(jnienv, jthis);
  361. err = 0;
  362. /* The DBTs are always inputs. */
  363. if (locked_dbt_get(&cdbt, jnienv, dbenv, control, inOp) != 0)
  364. goto out2;
  365. if (locked_dbt_get(&rdbt, jnienv, dbenv, rec, inOp) != 0)
  366. goto out1;
  367. envid = (*jnienv)->GetIntField(jnienv,
  368.     result, fid_RepProcessMessage_envid);
  369. err = dbenv->rep_process_message(dbenv, &cdbt.javainfo->dbt,
  370.     &rdbt.javainfo->dbt, &envid);
  371. if (err == DB_REP_NEWMASTER)
  372. (*jnienv)->SetIntField(jnienv,
  373.     result, fid_RepProcessMessage_envid, envid);
  374. else if (!DB_RETOK_REPPMSG(err))
  375. verify_return(jnienv, err, 0);
  376. out1: locked_dbt_put(&rdbt, jnienv, dbenv);
  377. out2: locked_dbt_put(&cdbt, jnienv, dbenv);
  378. return (err);
  379. }
  380. JNIEXPORT void JNICALL
  381.   Java_com_sleepycat_db_DbEnv_rep_1start
  382.   (JNIEnv *jnienv, /* DbEnv */ jobject jthis, /* Dbt */ jobject cookie,
  383.    jint flags)
  384. {
  385. DB_ENV *dbenv;
  386. DBT *dbtp;
  387. LOCKED_DBT ldbt;
  388. int err;
  389. if (!verify_non_null(jnienv, jthis))
  390. return;
  391. dbenv = get_DB_ENV(jnienv, jthis);
  392. /* The Dbt cookie may be null;  if so, pass in a NULL DBT. */
  393. if (cookie != NULL) {
  394. if (locked_dbt_get(&ldbt, jnienv, dbenv, cookie, inOp) != 0)
  395. goto out;
  396. dbtp = &ldbt.javainfo->dbt;
  397. } else
  398. dbtp = NULL;
  399. err = dbenv->rep_start(dbenv, dbtp, flags);
  400. verify_return(jnienv, err, 0);
  401. out: if (cookie != NULL)
  402. locked_dbt_put(&ldbt, jnienv, dbenv);
  403. }
  404. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_rep_1stat
  405.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  406. {
  407. int err;
  408. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  409. DB_REP_STAT *statp = NULL;
  410. jobject retval = NULL;
  411. jclass dbclass;
  412. if (!verify_non_null(jnienv, dbenv))
  413. return (NULL);
  414. err = dbenv->rep_stat(dbenv, &statp, (u_int32_t)flags);
  415. if (verify_return(jnienv, err, 0)) {
  416. if ((dbclass = get_class(jnienv, name_DB_REP_STAT)) == NULL ||
  417.     (retval =
  418.       create_default_object(jnienv, name_DB_REP_STAT)) == NULL)
  419. goto err; /* An exception has been posted. */
  420. __jv_fill_rep_stat(jnienv, dbclass, retval, statp);
  421. err: __os_ufree(dbenv, statp);
  422. }
  423. return (retval);
  424. }
  425. JNIEXPORT void JNICALL
  426. Java_com_sleepycat_db_DbEnv_set_1rep_1limit
  427.   (JNIEnv *jnienv, /* DbEnv */ jobject jthis, jint gbytes, jint bytes)
  428. {
  429. DB_ENV *dbenv;
  430. int err;
  431. dbenv = get_DB_ENV(jnienv, jthis);
  432. if (verify_non_null(jnienv, dbenv)) {
  433. err = dbenv->set_rep_limit(dbenv,
  434.     (u_int32_t)gbytes, (u_int32_t)bytes);
  435. verify_return(jnienv, err, 0);
  436. }
  437. }
  438. JNIEXPORT void JNICALL
  439.   Java_com_sleepycat_db_DbEnv_rep_1transport_1changed
  440.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint envid,
  441.    /* DbRepTransport */ jobject jreptransport)
  442. {
  443. DB_ENV *dbenv;
  444. DB_ENV_JAVAINFO *dbenvinfo;
  445. dbenv = get_DB_ENV(jnienv, jthis);
  446. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  447. if (!verify_non_null(jnienv, dbenv) ||
  448.     !verify_non_null(jnienv, dbenvinfo) ||
  449.     !verify_non_null(jnienv, jreptransport))
  450. return;
  451. dbjie_set_rep_transport_object(dbenvinfo,
  452.     jnienv, dbenv, envid, jreptransport);
  453. }
  454. JNIEXPORT void JNICALL
  455.   Java_com_sleepycat_db_DbEnv_set_1rpc_1server
  456.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbClient*/ jobject jclient,
  457.    jstring jhost, jlong tsec, jlong ssec, jint flags)
  458. {
  459. int err;
  460. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  461. const char *host = (*jnienv)->GetStringUTFChars(jnienv, jhost, NULL);
  462. if (jclient != NULL) {
  463. report_exception(jnienv, "DbEnv.set_rpc_server client arg "
  464.  "must be null; reserved for future use",
  465.  EINVAL, 0);
  466. return;
  467. }
  468. if (verify_non_null(jnienv, dbenv)) {
  469. err = dbenv->set_rpc_server(dbenv, NULL, host,
  470. (long)tsec, (long)ssec, flags);
  471. /* Throw an exception if the call failed. */
  472. verify_return(jnienv, err, 0);
  473. }
  474. }
  475. JAVADB_METHOD(DbEnv_set_1shm_1key, (JAVADB_ARGS, jlong shm_key), DB_ENV,
  476.     set_shm_key, (c_this, (long)shm_key))
  477. JNIEXPORT void JNICALL
  478.   Java_com_sleepycat_db_DbEnv__1set_1tx_1timestamp
  479.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jlong seconds)
  480. {
  481. int err;
  482. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  483. time_t time = seconds;
  484. if (verify_non_null(jnienv, dbenv)) {
  485. err = dbenv->set_tx_timestamp(dbenv, &time);
  486. /* Throw an exception if the call failed. */
  487. verify_return(jnienv, err, 0);
  488. }
  489. }
  490. JAVADB_METHOD(DbEnv_set_1verbose,
  491.     (JAVADB_ARGS, jint which, jboolean onoff), DB_ENV,
  492.     set_verbose, (c_this, which, onoff ? 1 : 0))
  493. /*static*/
  494. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_get_1version_1major
  495.   (JNIEnv * jnienv, jclass this_class)
  496. {
  497. COMPQUIET(jnienv, NULL);
  498. COMPQUIET(this_class, NULL);
  499. return (DB_VERSION_MAJOR);
  500. }
  501. /*static*/
  502. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_get_1version_1minor
  503.   (JNIEnv * jnienv, jclass this_class)
  504. {
  505. COMPQUIET(jnienv, NULL);
  506. COMPQUIET(this_class, NULL);
  507. return (DB_VERSION_MINOR);
  508. }
  509. /*static*/
  510. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_get_1version_1patch
  511.   (JNIEnv * jnienv, jclass this_class)
  512. {
  513. COMPQUIET(jnienv, NULL);
  514. COMPQUIET(this_class, NULL);
  515. return (DB_VERSION_PATCH);
  516. }
  517. /*static*/
  518. JNIEXPORT jstring JNICALL Java_com_sleepycat_db_DbEnv_get_1version_1string
  519.   (JNIEnv *jnienv, jclass this_class)
  520. {
  521. COMPQUIET(this_class, NULL);
  522. return ((*jnienv)->NewStringUTF(jnienv, DB_VERSION_STRING));
  523. }
  524. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_lock_1id
  525.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis)
  526. {
  527. int err;
  528. u_int32_t id;
  529. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  530. if (!verify_non_null(jnienv, dbenv))
  531. return (-1);
  532. err = dbenv->lock_id(dbenv, &id);
  533. verify_return(jnienv, err, 0);
  534. return (id);
  535. }
  536. JAVADB_METHOD(DbEnv_lock_1id_1free, (JAVADB_ARGS, jint id), DB_ENV,
  537.     lock_id_free, (c_this, id))
  538. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_lock_1stat
  539.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  540. {
  541. int err;
  542. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  543. DB_LOCK_STAT *statp = NULL;
  544. jobject retval = NULL;
  545. jclass dbclass;
  546. if (!verify_non_null(jnienv, dbenv))
  547. return (NULL);
  548. err = dbenv->lock_stat(dbenv, &statp, (u_int32_t)flags);
  549. if (verify_return(jnienv, err, 0)) {
  550. if ((dbclass = get_class(jnienv, name_DB_LOCK_STAT)) == NULL ||
  551.     (retval =
  552.       create_default_object(jnienv, name_DB_LOCK_STAT)) == NULL)
  553. goto err; /* An exception has been posted. */
  554. __jv_fill_lock_stat(jnienv, dbclass, retval, statp);
  555. err: __os_ufree(dbenv, statp);
  556. }
  557. return (retval);
  558. }
  559. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_lock_1detect
  560.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint atype, jint flags)
  561. {
  562. int err;
  563. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  564. int aborted;
  565. if (!verify_non_null(jnienv, dbenv))
  566. return (0);
  567. err = dbenv->lock_detect(dbenv, atype, flags, &aborted);
  568. verify_return(jnienv, err, 0);
  569. return (aborted);
  570. }
  571. JNIEXPORT /*DbLock*/ jobject JNICALL Java_com_sleepycat_db_DbEnv_lock_1get
  572.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*u_int32_t*/ jint locker,
  573.    jint flags, /*const Dbt*/ jobject obj, /*db_lockmode_t*/ jint lock_mode)
  574. {
  575. int err;
  576. DB_ENV *dbenv;
  577. DB_LOCK *dblock;
  578. LOCKED_DBT lobj;
  579. /*DbLock*/ jobject retval;
  580. dbenv = get_DB_ENV(jnienv, jthis);
  581. if (!verify_non_null(jnienv, dbenv))
  582. return (NULL);
  583. if ((err = __os_malloc(dbenv, sizeof(DB_LOCK), &dblock)) != 0)
  584. if (!verify_return(jnienv, err, 0))
  585. return (NULL);
  586. memset(dblock, 0, sizeof(DB_LOCK));
  587. err = 0;
  588. retval = NULL;
  589. if (locked_dbt_get(&lobj, jnienv, dbenv, obj, inOp) != 0)
  590. goto out;
  591. err = dbenv->lock_get(dbenv, locker, flags, &lobj.javainfo->dbt,
  592.        (db_lockmode_t)lock_mode, dblock);
  593. if (err == DB_LOCK_NOTGRANTED)
  594. report_notgranted_exception(jnienv,
  595.     "DbEnv.lock_get not granted",
  596.     DB_LOCK_GET, lock_mode, obj,
  597.     NULL, -1);
  598. else if (verify_return(jnienv, err, 0)) {
  599. retval = create_default_object(jnienv, name_DB_LOCK);
  600. set_private_dbobj(jnienv, name_DB_LOCK, retval, dblock);
  601. }
  602.  out:
  603. locked_dbt_put(&lobj, jnienv, dbenv);
  604. return (retval);
  605. }
  606. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_lock_1vec
  607.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*u_int32_t*/ jint locker,
  608.    jint flags, /*const Dbt*/ jobjectArray list, jint offset, jint count)
  609. {
  610. DB_ENV *dbenv;
  611. DB_LOCKREQ *lockreq;
  612. DB_LOCKREQ *prereq; /* preprocessed requests */
  613. DB_LOCKREQ *failedreq;
  614. DB_LOCK *lockp;
  615. LOCKED_DBT *locked_dbts;
  616. int err;
  617. int alloc_err;
  618. int i;
  619. size_t bytesize;
  620. size_t ldbtsize;
  621. jobject jlockreq;
  622. db_lockop_t op;
  623. jobject jobj;
  624. jobject jlock;
  625. int completed;
  626. dbenv = get_DB_ENV(jnienv, jthis);
  627. if (!verify_non_null(jnienv, dbenv))
  628. goto out0;
  629. if ((*jnienv)->GetArrayLength(jnienv, list) < offset + count) {
  630. report_exception(jnienv,
  631.  "DbEnv.lock_vec array not large enough",
  632.  0, 0);
  633. goto out0;
  634. }
  635. bytesize = sizeof(DB_LOCKREQ) * count;
  636. if ((err = __os_malloc(dbenv, bytesize, &lockreq)) != 0) {
  637. verify_return(jnienv, err, 0);
  638. goto out0;
  639. }
  640. memset(lockreq, 0, bytesize);
  641. ldbtsize = sizeof(LOCKED_DBT) * count;
  642. if ((err = __os_malloc(dbenv, ldbtsize, &locked_dbts)) != 0) {
  643. verify_return(jnienv, err, 0);
  644. goto out1;
  645. }
  646. memset(lockreq, 0, ldbtsize);
  647. prereq = &lockreq[0];
  648. /* fill in the lockreq array */
  649. for (i = 0, prereq = &lockreq[0]; i < count; i++, prereq++) {
  650. jlockreq = (*jnienv)->GetObjectArrayElement(jnienv, list,
  651.     offset + i);
  652. if (jlockreq == NULL) {
  653. report_exception(jnienv,
  654.  "DbEnv.lock_vec list entry is null",
  655.  0, 0);
  656. goto out2;
  657. }
  658. op = (*jnienv)->GetIntField(jnienv, jlockreq,
  659.     fid_DbLockRequest_op);
  660. prereq->op = op;
  661. switch (op) {
  662. case DB_LOCK_GET_TIMEOUT:
  663. /* Needed: mode, timeout, obj.  Returned: lock. */
  664. prereq->op = (*jnienv)->GetIntField(jnienv, jlockreq,
  665.     fid_DbLockRequest_timeout);
  666. /* FALLTHROUGH */
  667. case DB_LOCK_GET:
  668. /* Needed: mode, obj.  Returned: lock. */
  669. prereq->mode = (*jnienv)->GetIntField(jnienv, jlockreq,
  670.     fid_DbLockRequest_mode);
  671. jobj = (*jnienv)->GetObjectField(jnienv, jlockreq,
  672.     fid_DbLockRequest_obj);
  673. if ((err = locked_dbt_get(&locked_dbts[i], jnienv,
  674.     dbenv, jobj, inOp)) != 0)
  675. goto out2;
  676. prereq->obj = &locked_dbts[i].javainfo->dbt;
  677. break;
  678. case DB_LOCK_PUT:
  679. /* Needed: lock.  Ignored: mode, obj. */
  680. jlock = (*jnienv)->GetObjectField(jnienv, jlockreq,
  681. fid_DbLockRequest_lock);
  682. if (!verify_non_null(jnienv, jlock))
  683. goto out2;
  684. lockp = get_DB_LOCK(jnienv, jlock);
  685. if (!verify_non_null(jnienv, lockp))
  686. goto out2;
  687. prereq->lock = *lockp;
  688. break;
  689. case DB_LOCK_PUT_ALL:
  690. case DB_LOCK_TIMEOUT:
  691. /* Needed: (none).  Ignored: lock, mode, obj. */
  692. break;
  693. case DB_LOCK_PUT_OBJ:
  694. /* Needed: obj.  Ignored: lock, mode. */
  695. jobj = (*jnienv)->GetObjectField(jnienv, jlockreq,
  696. fid_DbLockRequest_obj);
  697. if ((err = locked_dbt_get(&locked_dbts[i], jnienv,
  698.    dbenv, jobj, inOp)) != 0)
  699. goto out2;
  700. prereq->obj = &locked_dbts[i].javainfo->dbt;
  701. break;
  702. default:
  703. report_exception(jnienv,
  704.  "DbEnv.lock_vec bad op value",
  705.  0, 0);
  706. goto out2;
  707. }
  708. }
  709. err = dbenv->lock_vec(dbenv, locker, flags, lockreq, count, &failedreq);
  710. if (err == 0)
  711. completed = count;
  712. else
  713. completed = failedreq - lockreq;
  714. /* do post processing for any and all requests that completed */
  715. for (i = 0; i < completed; i++) {
  716. op = lockreq[i].op;
  717. if (op == DB_LOCK_PUT) {
  718. /*
  719.  * After a successful put, the DbLock can no longer
  720.  * be used, so we release the storage related to it.
  721.  */
  722. jlockreq = (*jnienv)->GetObjectArrayElement(jnienv,
  723.     list, i + offset);
  724. jlock = (*jnienv)->GetObjectField(jnienv, jlockreq,
  725. fid_DbLockRequest_lock);
  726. lockp = get_DB_LOCK(jnienv, jlock);
  727. __os_free(NULL, lockp);
  728. set_private_dbobj(jnienv, name_DB_LOCK, jlock, 0);
  729. }
  730. else if (op == DB_LOCK_GET) {
  731. /*
  732.  * Store the lock that was obtained.
  733.  * We need to create storage for it since
  734.  * the lockreq array only exists during this
  735.  * method call.
  736.  */
  737. alloc_err = __os_malloc(dbenv, sizeof(DB_LOCK), &lockp);
  738. if (!verify_return(jnienv, alloc_err, 0))
  739. goto out2;
  740. *lockp = lockreq[i].lock;
  741. jlockreq = (*jnienv)->GetObjectArrayElement(jnienv,
  742.     list, i + offset);
  743. jlock = create_default_object(jnienv, name_DB_LOCK);
  744. set_private_dbobj(jnienv, name_DB_LOCK, jlock, lockp);
  745. (*jnienv)->SetObjectField(jnienv, jlockreq,
  746.   fid_DbLockRequest_lock,
  747.   jlock);
  748. }
  749. }
  750. /* If one of the locks was not granted, build the exception now. */
  751. if (err == DB_LOCK_NOTGRANTED && i < count) {
  752. jlockreq = (*jnienv)->GetObjectArrayElement(jnienv,
  753.     list, i + offset);
  754. jobj = (*jnienv)->GetObjectField(jnienv, jlockreq,
  755.  fid_DbLockRequest_obj);
  756. jlock = (*jnienv)->GetObjectField(jnienv, jlockreq,
  757.   fid_DbLockRequest_lock);
  758. report_notgranted_exception(jnienv,
  759.     "DbEnv.lock_vec incomplete",
  760.     lockreq[i].op,
  761.     lockreq[i].mode,
  762.     jobj,
  763.     jlock,
  764.     i);
  765. }
  766. else
  767. verify_return(jnienv, err, 0);
  768.  out2:
  769. /* Free the dbts that we have locked */
  770. for (i = 0 ; i < (prereq - lockreq); i++) {
  771. if ((op = lockreq[i].op) == DB_LOCK_GET ||
  772.     op == DB_LOCK_PUT_OBJ)
  773. locked_dbt_put(&locked_dbts[i], jnienv, dbenv);
  774. }
  775. __os_free(dbenv, locked_dbts);
  776.  out1:
  777. __os_free(dbenv, lockreq);
  778.  out0:
  779. return;
  780. }
  781. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_lock_1put
  782.   (JNIEnv *jnienv, jobject jthis, /*DbLock*/ jobject jlock)
  783. {
  784. int err;
  785. DB_ENV *dbenv;
  786. DB_LOCK *dblock;
  787. dbenv = get_DB_ENV(jnienv, jthis);
  788. if (!verify_non_null(jnienv, dbenv))
  789. return;
  790. dblock = get_DB_LOCK(jnienv, jlock);
  791. if (!verify_non_null(jnienv, dblock))
  792. return;
  793. err = dbenv->lock_put(dbenv, dblock);
  794. if (verify_return(jnienv, err, 0)) {
  795. /*
  796.  * After a successful put, the DbLock can no longer
  797.  * be used, so we release the storage related to it
  798.  * (allocated in DbEnv.lock_get()).
  799.  */
  800. __os_free(NULL, dblock);
  801. set_private_dbobj(jnienv, name_DB_LOCK, jlock, 0);
  802. }
  803. }
  804. JNIEXPORT jobjectArray JNICALL Java_com_sleepycat_db_DbEnv_log_1archive
  805.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  806. {
  807. int err, len, i;
  808. char** ret;
  809. jclass stringClass;
  810. jobjectArray strarray;
  811. DB_ENV *dbenv;
  812. dbenv = get_DB_ENV(jnienv, jthis);
  813. strarray = NULL;
  814. if (!verify_non_null(jnienv, dbenv))
  815. return (0);
  816. err = dbenv->log_archive(dbenv, &ret, flags);
  817. if (!verify_return(jnienv, err, 0))
  818. return (0);
  819. if (ret != NULL) {
  820. len = 0;
  821. while (ret[len] != NULL)
  822. len++;
  823. stringClass = (*jnienv)->FindClass(jnienv, "java/lang/String");
  824. if ((strarray = (*jnienv)->NewObjectArray(jnienv,
  825.     len, stringClass, 0)) == NULL)
  826. goto out;
  827. for (i=0; i<len; i++) {
  828. jstring str = (*jnienv)->NewStringUTF(jnienv, ret[i]);
  829. (*jnienv)->SetObjectArrayElement(jnienv, strarray,
  830.      i, str);
  831. }
  832. }
  833. out: return (strarray);
  834. }
  835. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_log_1compare
  836.   (JNIEnv *jnienv, jclass jthis_class,
  837.    /*DbLsn*/ jobject lsn0, /*DbLsn*/ jobject lsn1)
  838. {
  839. DB_LSN *dblsn0;
  840. DB_LSN *dblsn1;
  841. COMPQUIET(jthis_class, NULL);
  842. dblsn0 = get_DB_LSN(jnienv, lsn0);
  843. dblsn1 = get_DB_LSN(jnienv, lsn1);
  844. return (log_compare(dblsn0, dblsn1));
  845. }
  846. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_log_1cursor
  847.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  848. {
  849. int err;
  850. DB_LOGC *dblogc;
  851. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  852. if (!verify_non_null(jnienv, dbenv))
  853. return (NULL);
  854. err = dbenv->log_cursor(dbenv, &dblogc, flags);
  855. verify_return(jnienv, err, 0);
  856. return (get_DbLogc(jnienv, dblogc));
  857. }
  858. JNIEXPORT jstring JNICALL Java_com_sleepycat_db_DbEnv_log_1file
  859.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbLsn*/ jobject lsn)
  860. {
  861. int err;
  862. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  863. DB_LSN *dblsn = get_DB_LSN(jnienv, lsn);
  864. char filename[FILENAME_MAX+1] = "";
  865. if (!verify_non_null(jnienv, dbenv))
  866. return (NULL);
  867. err = dbenv->log_file(dbenv, dblsn, filename, FILENAME_MAX);
  868. verify_return(jnienv, err, 0);
  869. filename[FILENAME_MAX] = ''; /* just to be sure */
  870. return (get_java_string(jnienv, filename));
  871. }
  872. JAVADB_METHOD(DbEnv_log_1flush,
  873.     (JAVADB_ARGS, /*DbLsn*/ jobject lsn), DB_ENV,
  874.     log_flush, (c_this, get_DB_LSN(jnienv, lsn)))
  875. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_log_1put
  876.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbLsn*/ jobject lsn,
  877.    /*DbDbt*/ jobject data, jint flags)
  878. {
  879. int err;
  880. DB_ENV *dbenv;
  881. DB_LSN *dblsn;
  882. LOCKED_DBT ldata;
  883. dbenv = get_DB_ENV(jnienv, jthis);
  884. dblsn = get_DB_LSN(jnienv, lsn);
  885. if (!verify_non_null(jnienv, dbenv))
  886. return;
  887. /* log_put's DB_LSN argument may not be NULL. */
  888. if (!verify_non_null(jnienv, dblsn))
  889. return;
  890. if (locked_dbt_get(&ldata, jnienv, dbenv, data, inOp) != 0)
  891. goto out;
  892. err = dbenv->log_put(dbenv, dblsn, &ldata.javainfo->dbt, flags);
  893. verify_return(jnienv, err, 0);
  894.  out:
  895. locked_dbt_put(&ldata, jnienv, dbenv);
  896. }
  897. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_log_1stat
  898.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  899. {
  900. int err;
  901. DB_ENV *dbenv;
  902. DB_LOG_STAT *statp;
  903. jobject retval;
  904. jclass dbclass;
  905. retval = NULL;
  906. statp = NULL;
  907. dbenv = get_DB_ENV(jnienv, jthis);
  908. if (!verify_non_null(jnienv, dbenv))
  909. return (NULL);
  910. err = dbenv->log_stat(dbenv, &statp, (u_int32_t)flags);
  911. if (verify_return(jnienv, err, 0)) {
  912. if ((dbclass = get_class(jnienv, name_DB_LOG_STAT)) == NULL ||
  913.     (retval =
  914.        create_default_object(jnienv, name_DB_LOG_STAT)) == NULL)
  915. goto err; /* An exception has been posted. */
  916. __jv_fill_log_stat(jnienv, dbclass, retval, statp);
  917. err: __os_ufree(dbenv, statp);
  918. }
  919. return (retval);
  920. }
  921. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_memp_1stat
  922.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  923. {
  924. int err;
  925. jclass dbclass;
  926. DB_ENV *dbenv;
  927. DB_MPOOL_STAT *statp;
  928. jobject retval;
  929. retval = NULL;
  930. statp = NULL;
  931. dbenv = get_DB_ENV(jnienv, jthis);
  932. if (!verify_non_null(jnienv, dbenv))
  933. return (NULL);
  934. err = dbenv->memp_stat(dbenv, &statp, 0, (u_int32_t)flags);
  935. if (verify_return(jnienv, err, 0)) {
  936. if ((dbclass = get_class(jnienv, name_DB_MPOOL_STAT)) == NULL ||
  937.     (retval =
  938.      create_default_object(jnienv, name_DB_MPOOL_STAT)) == NULL)
  939. goto err; /* An exception has been posted. */
  940. __jv_fill_mpool_stat(jnienv, dbclass, retval, statp);
  941. err: __os_ufree(dbenv, statp);
  942. }
  943. return (retval);
  944. }
  945. JNIEXPORT jobjectArray JNICALL Java_com_sleepycat_db_DbEnv_memp_1fstat
  946.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  947. {
  948. int err, i, len;
  949. jclass fstat_class;
  950. DB_ENV *dbenv;
  951. DB_MPOOL_FSTAT **fstatp;
  952. jobjectArray retval;
  953. jfieldID filename_id;
  954. jstring jfilename;
  955. fstatp = NULL;
  956. retval = NULL;
  957. dbenv = get_DB_ENV(jnienv, jthis);
  958. if (!verify_non_null(jnienv, dbenv))
  959. return (NULL);
  960. err = dbenv->memp_stat(dbenv, 0, &fstatp, (u_int32_t)flags);
  961. if (verify_return(jnienv, err, 0)) {
  962. len = 0;
  963. while (fstatp[len] != NULL)
  964. len++;
  965. if ((fstat_class =
  966. get_class(jnienv, name_DB_MPOOL_FSTAT)) == NULL ||
  967.     (retval = (*jnienv)->NewObjectArray(jnienv, len,
  968. fstat_class, 0)) == NULL)
  969. goto err;
  970. for (i=0; i<len; i++) {
  971. jobject obj;
  972. if ((obj = create_default_object(jnienv,
  973.     name_DB_MPOOL_FSTAT)) == NULL)
  974. goto err;
  975. (*jnienv)->SetObjectArrayElement(jnienv, retval,
  976.     i, obj);
  977. /* Set the string field. */
  978. filename_id = (*jnienv)->GetFieldID(jnienv,
  979.     fstat_class, "file_name", string_signature);
  980. jfilename = get_java_string(jnienv,
  981.     fstatp[i]->file_name);
  982. (*jnienv)->SetObjectField(jnienv, obj,
  983.     filename_id, jfilename);
  984. set_int_field(jnienv, fstat_class, obj,
  985.     "st_pagesize", fstatp[i]->st_pagesize);
  986. set_int_field(jnienv, fstat_class, obj,
  987.     "st_cache_hit", fstatp[i]->st_cache_hit);
  988. set_int_field(jnienv, fstat_class, obj,
  989.     "st_cache_miss", fstatp[i]->st_cache_miss);
  990. set_int_field(jnienv, fstat_class, obj,
  991.     "st_map", fstatp[i]->st_map);
  992. set_int_field(jnienv, fstat_class, obj,
  993.     "st_page_create", fstatp[i]->st_page_create);
  994. set_int_field(jnienv, fstat_class, obj,
  995.     "st_page_in", fstatp[i]->st_page_in);
  996. set_int_field(jnienv, fstat_class, obj,
  997.     "st_page_out", fstatp[i]->st_page_out);
  998. __os_ufree(dbenv, fstatp[i]);
  999. }
  1000. err: __os_ufree(dbenv, fstatp);
  1001. }
  1002. return (retval);
  1003. }
  1004. JNIEXPORT jint JNICALL Java_com_sleepycat_db_DbEnv_memp_1trickle
  1005.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint pct)
  1006. {
  1007. int err;
  1008. DB_ENV *dbenv = get_DB_ENV(jnienv, jthis);
  1009. int result = 0;
  1010. if (verify_non_null(jnienv, dbenv)) {
  1011. err = dbenv->memp_trickle(dbenv, pct, &result);
  1012. verify_return(jnienv, err, 0);
  1013. }
  1014. return (result);
  1015. }
  1016. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_txn_1begin
  1017.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbTxn*/ jobject pid, jint flags)
  1018. {
  1019. int err;
  1020. DB_TXN *dbpid, *result;
  1021. DB_ENV *dbenv;
  1022. dbenv = get_DB_ENV(jnienv, jthis);
  1023. if (!verify_non_null(jnienv, dbenv))
  1024. return (0);
  1025. dbpid = get_DB_TXN(jnienv, pid);
  1026. result = 0;
  1027. err = dbenv->txn_begin(dbenv, dbpid, &result, flags);
  1028. if (!verify_return(jnienv, err, 0))
  1029. return (0);
  1030. return (get_DbTxn(jnienv, result));
  1031. }
  1032. JAVADB_METHOD(DbEnv_txn_1checkpoint,
  1033.     (JAVADB_ARGS, jint kbyte, jint min, jint flags), DB_ENV,
  1034.     txn_checkpoint, (c_this, kbyte, min, flags))
  1035. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv_app_1dispatch_1changed
  1036.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, /*DbFeedback*/ jobject jappdispatch)
  1037. {
  1038. DB_ENV *dbenv;
  1039. DB_ENV_JAVAINFO *dbenvinfo;
  1040. dbenv = get_DB_ENV(jnienv, jthis);
  1041. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  1042. if (!verify_non_null(jnienv, dbenv) ||
  1043.     !verify_non_null(jnienv, dbenvinfo))
  1044. return;
  1045. dbjie_set_app_dispatch_object(dbenvinfo, jnienv, dbenv, jappdispatch);
  1046. }
  1047. JNIEXPORT jobjectArray JNICALL Java_com_sleepycat_db_DbEnv_txn_1recover
  1048.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint count, jint flags)
  1049. {
  1050. int err;
  1051. DB_ENV *dbenv;
  1052. DB_PREPLIST *preps;
  1053. long retcount;
  1054. int i;
  1055. char signature[128];
  1056. size_t bytesize;
  1057. jobject retval;
  1058. jobject obj;
  1059. jobject txnobj;
  1060. jbyteArray bytearr;
  1061. jclass preplist_class;
  1062. jfieldID txn_fieldid;
  1063. jfieldID gid_fieldid;
  1064. retval = NULL;
  1065. dbenv = get_DB_ENV(jnienv, jthis);
  1066. if (!verify_non_null(jnienv, dbenv))
  1067. return (NULL);
  1068. /*
  1069.  * We need to allocate some local storage for the
  1070.  * returned preplist, and that requires us to do
  1071.  * our own argument validation.
  1072.  */
  1073. if (count <= 0) {
  1074. verify_return(jnienv, EINVAL, 0);
  1075. goto out;
  1076. }
  1077. bytesize = sizeof(DB_PREPLIST) * count;
  1078. if ((err = __os_malloc(dbenv, bytesize, &preps)) != 0) {
  1079. verify_return(jnienv, err, 0);
  1080. goto out;
  1081. }
  1082. err = dbenv->txn_recover(dbenv, preps, count, &retcount, flags);
  1083. if (verify_return(jnienv, err, 0)) {
  1084. if ((preplist_class =
  1085.     get_class(jnienv, name_DB_PREPLIST)) == NULL ||
  1086.     (retval = (*jnienv)->NewObjectArray(jnienv, retcount,
  1087.     preplist_class, 0)) == NULL)
  1088. goto err;
  1089. (void)snprintf(signature, sizeof(signature),
  1090.     "L%s%s;", DB_PACKAGE_NAME, name_DB_TXN);
  1091. txn_fieldid = (*jnienv)->GetFieldID(jnienv, preplist_class,
  1092.     "txn", signature);
  1093. gid_fieldid = (*jnienv)->GetFieldID(jnienv, preplist_class,
  1094.     "gid", "[B");
  1095. for (i=0; i<retcount; i++) {
  1096. /*
  1097.  * First, make a blank DbPreplist object
  1098.  * and set the array entry.
  1099.  */
  1100. if ((obj = create_default_object(jnienv,
  1101.     name_DB_PREPLIST)) == NULL)
  1102. goto err;
  1103. (*jnienv)->SetObjectArrayElement(jnienv,
  1104.     retval, i, obj);
  1105. /* Set the txn field. */
  1106. txnobj = get_DbTxn(jnienv, preps[i].txn);
  1107. (*jnienv)->SetObjectField(jnienv,
  1108.     obj, txn_fieldid, txnobj);
  1109. /* Build the gid array and set the field. */
  1110. if ((bytearr = (*jnienv)->NewByteArray(jnienv,
  1111.     sizeof(preps[i].gid))) == NULL)
  1112. goto err;
  1113. (*jnienv)->SetByteArrayRegion(jnienv, bytearr, 0,
  1114.     sizeof(preps[i].gid), (jbyte *)&preps[i].gid[0]);
  1115. (*jnienv)->SetObjectField(jnienv, obj,
  1116.     gid_fieldid, bytearr);
  1117. }
  1118. }
  1119. err: __os_free(dbenv, preps);
  1120. out: return (retval);
  1121. }
  1122. JNIEXPORT jobject JNICALL Java_com_sleepycat_db_DbEnv_txn_1stat
  1123.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jint flags)
  1124. {
  1125. int err;
  1126. DB_ENV *dbenv;
  1127. DB_TXN_STAT *statp;
  1128. jobject retval, obj;
  1129. jclass dbclass, active_class;
  1130. char active_signature[512];
  1131. jfieldID arrid;
  1132. jobjectArray actives;
  1133. unsigned int i;
  1134. retval = NULL;
  1135. statp = NULL;
  1136. dbenv = get_DB_ENV(jnienv, jthis);
  1137. if (!verify_non_null(jnienv, dbenv))
  1138. return (NULL);
  1139. err = dbenv->txn_stat(dbenv, &statp, (u_int32_t)flags);
  1140. if (verify_return(jnienv, err, 0)) {
  1141. if ((dbclass = get_class(jnienv, name_DB_TXN_STAT)) == NULL ||
  1142.     (retval =
  1143.        create_default_object(jnienv, name_DB_TXN_STAT)) == NULL)
  1144. goto err;
  1145. /* Set the individual fields */
  1146. __jv_fill_txn_stat(jnienv, dbclass, retval, statp);
  1147. if ((active_class =
  1148.     get_class(jnienv, name_DB_TXN_STAT_ACTIVE)) == NULL ||
  1149.     (actives = (*jnienv)->NewObjectArray(jnienv,
  1150.     statp->st_nactive, active_class, 0)) == NULL)
  1151. goto err;
  1152. /*
  1153.  * Set the st_txnarray field.  This is a little more involved
  1154.  * than other fields, since the type is an array, so none
  1155.  * of our utility functions help.
  1156.  */
  1157. (void)snprintf(active_signature, sizeof(active_signature),
  1158.     "[L%s%s;", DB_PACKAGE_NAME, name_DB_TXN_STAT_ACTIVE);
  1159. arrid = (*jnienv)->GetFieldID(jnienv, dbclass, "st_txnarray",
  1160.       active_signature);
  1161. (*jnienv)->SetObjectField(jnienv, retval, arrid, actives);
  1162. /* Now fill the in the elements of st_txnarray. */
  1163. for (i=0; i<statp->st_nactive; i++) {
  1164. obj = create_default_object(jnienv,
  1165. name_DB_TXN_STAT_ACTIVE);
  1166. (*jnienv)->SetObjectArrayElement(jnienv,
  1167. actives, i, obj);
  1168. set_int_field(jnienv, active_class, obj,
  1169.       "txnid", statp->st_txnarray[i].txnid);
  1170. set_int_field(jnienv, active_class, obj, "parentid",
  1171.       statp->st_txnarray[i].parentid);
  1172. set_lsn_field(jnienv, active_class, obj,
  1173.       "lsn", statp->st_txnarray[i].lsn);
  1174. }
  1175. err: __os_ufree(dbenv, statp);
  1176. }
  1177. return (retval);
  1178. }
  1179. /* See discussion on errpfx, errcall in DB_ENV_JAVAINFO */
  1180. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1set_1errcall
  1181.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jobject errcall)
  1182. {
  1183. DB_ENV *dbenv;
  1184. DB_ENV_JAVAINFO *dbenvinfo;
  1185. dbenv = get_DB_ENV(jnienv, jthis);
  1186. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  1187. if (verify_non_null(jnienv, dbenv) &&
  1188.     verify_non_null(jnienv, dbenvinfo)) {
  1189. dbjie_set_errcall(dbenvinfo, jnienv, errcall);
  1190. }
  1191. }
  1192. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1set_1errpfx
  1193.   (JNIEnv *jnienv, /*DbEnv*/ jobject jthis, jstring str)
  1194. {
  1195. DB_ENV *dbenv;
  1196. DB_ENV_JAVAINFO *dbenvinfo;
  1197. dbenv = get_DB_ENV(jnienv, jthis);
  1198. dbenvinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  1199. if (verify_non_null(jnienv, dbenv) &&
  1200.     verify_non_null(jnienv, dbenvinfo)) {
  1201. dbjie_set_errpfx(dbenvinfo, jnienv, str);
  1202. }
  1203. }
  1204. JNIEXPORT void JNICALL Java_com_sleepycat_db_DbEnv__1finalize
  1205.     (JNIEnv *jnienv, /*DbEnv*/ jobject jthis,
  1206.      jobject /*DbErrcall*/ errcall, jstring errpfx)
  1207. {
  1208. DB_ENV *dbenv;
  1209. DB_ENV_JAVAINFO *envinfo;
  1210. dbenv = get_DB_ENV(jnienv, jthis);
  1211. envinfo = get_DB_ENV_JAVAINFO(jnienv, jthis);
  1212. DB_ASSERT(envinfo != NULL);
  1213. /* Note:  We detect and report unclosed DbEnvs. */
  1214. if (dbenv != NULL && envinfo != NULL && !dbjie_is_dbopen(envinfo)) {
  1215. /* If this error occurs, this object was never closed. */
  1216. report_errcall(jnienv, errcall, errpfx,
  1217.        "DbEnv.finalize: open DbEnv object destroyed");
  1218. }
  1219. /* Shouldn't see this object again, but just in case */
  1220. set_private_dbobj(jnienv, name_DB_ENV, jthis, 0);
  1221. set_private_info(jnienv, name_DB_ENV, jthis, 0);
  1222. dbjie_destroy(envinfo, jnienv);
  1223. }