2 %define JAVA_CALLBACK(_sig, _jclass, _name)
3 JAVA_TYPEMAP(_sig, _jclass, jboolean)
4 %typemap(jtype) _sig "boolean"
5 %typemap(javain) _sig %{ (_name##_handler = $javainput) != null %}
8 * The Java object is stored in the Db or DbEnv class.
9 * Here we only care whether it is non-NULL.
12 $1 = ($input == JNI_TRUE) ? __dbj_##_name : NULL;
17 static void __dbj_error(const DB_ENV *dbenv,
18 const char *prefix, const char *msg)
21 JNIEnv *jenv = __dbj_get_jnienv(&detach);
22 jobject jdbenv = (jobject)DB_ENV_INTERNAL(dbenv);
25 COMPQUIET(prefix, NULL);
28 jmsg = (*jenv)->NewStringUTF(jenv, msg);
29 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv, dbenv_class,
30 errcall_method, jmsg);
31 (*jenv)->DeleteLocalRef(jenv, jmsg);
38 static void __dbj_env_feedback(DB_ENV *dbenv, int opcode, int percent)
41 JNIEnv *jenv = __dbj_get_jnienv(&detach);
42 jobject jdbenv = (jobject)DB_ENV_INTERNAL(dbenv);
45 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv, dbenv_class,
46 env_feedback_method, opcode, percent);
52 static void __dbj_message(const DB_ENV *dbenv, const char *msg)
55 JNIEnv *jenv = __dbj_get_jnienv(&detach);
56 jobject jdbenv = (jobject)DB_ENV_INTERNAL(dbenv);
60 jmsg = (*jenv)->NewStringUTF(jenv, msg);
61 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv, dbenv_class,
62 msgcall_method, jmsg);
63 (*jenv)->DeleteLocalRef(jenv, jmsg);
70 static void __dbj_panic(DB_ENV *dbenv, int err)
73 JNIEnv *jenv = __dbj_get_jnienv(&detach);
74 jobject jdbenv = (jobject)DB_ENV_INTERNAL(dbenv);
77 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv, dbenv_class,
79 __dbj_get_except(jenv, err, NULL, NULL, jdbenv));
85 static int __dbj_app_dispatch(DB_ENV *dbenv,
86 DBT *dbt, DB_LSN *lsn, db_recops recops)
89 JNIEnv *jenv = __dbj_get_jnienv(&detach);
90 jobject jdbenv = (jobject)DB_ENV_INTERNAL(dbenv);
100 jdbt = (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
101 __dbj_dbt_copyout(jenv, dbt, &jdbtarr, jdbt);
103 ret = ENOMEM; /* An exception is pending */
107 jlsn = (lsn == NULL) ? NULL : __dbj_wrap_DB_LSN(jenv, lsn);
109 ret = (*jenv)->CallNonvirtualIntMethod(jenv, jdbenv, dbenv_class,
110 app_dispatch_method, jdbt, jlsn, recops);
112 if ((*jenv)->ExceptionOccurred(jenv)) {
113 /* The exception will be thrown, so this could be any error. */
117 (*jenv)->DeleteLocalRef(jenv, jdbtarr);
118 (*jenv)->DeleteLocalRef(jenv, jdbt);
120 (*jenv)->DeleteLocalRef(jenv, jlsn);
127 static void __dbj_event_notify(DB_ENV *dbenv, u_int32_t event_id, void * info)
130 JNIEnv *jenv = __dbj_get_jnienv(&detach);
131 jobject jdbenv = (jobject)DB_ENV_INTERNAL(dbenv);
138 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv,
139 dbenv_class, panic_event_notify_method);
141 case DB_EVENT_REP_CLIENT:
142 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv,
143 dbenv_class, rep_client_event_notify_method);
145 case DB_EVENT_REP_ELECTED:
146 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv,
147 dbenv_class, rep_elected_event_notify_method);
149 case DB_EVENT_REP_MASTER:
150 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv,
151 dbenv_class, rep_master_event_notify_method);
153 case DB_EVENT_REP_NEWMASTER:
154 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv,
155 dbenv_class, rep_new_master_event_notify_method,
158 case DB_EVENT_REP_PERM_FAILED:
159 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv,
160 dbenv_class, rep_perm_failed_event_notify_method);
162 case DB_EVENT_REP_STARTUPDONE:
163 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv,
164 dbenv_class, rep_startup_done_event_notify_method);
166 case DB_EVENT_WRITE_FAILED:
167 (*jenv)->CallNonvirtualVoidMethod(jenv, jdbenv,
168 dbenv_class, write_failed_event_notify_method,
172 dbenv->errx(dbenv, "Unhandled event callback in the Java API");
173 DB_ASSERT(dbenv->env, 0);
180 static int __dbj_rep_transport(DB_ENV *dbenv,
181 const DBT *control, const DBT *rec, const DB_LSN *lsn, int envid,
185 JNIEnv *jenv = __dbj_get_jnienv(&detach);
186 jobject jdbenv = (jobject)DB_ENV_INTERNAL(dbenv);
187 jobject jcontrol, jrec, jlsn;
188 jbyteArray jcontrolarr, jrecarr;
191 if (jdbenv == NULL) {
196 jcontrol = (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
197 jrec = (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
198 if (jcontrol == NULL || jrec == NULL) {
199 ret = ENOMEM; /* An exception is pending */
203 __dbj_dbt_copyout(jenv, control, &jcontrolarr, jcontrol);
204 __dbj_dbt_copyout(jenv, rec, &jrecarr, jrec);
205 jlsn = (lsn == NULL) ? NULL : __dbj_wrap_DB_LSN(jenv, (DB_LSN *)lsn);
207 if (jcontrolarr == NULL || jrecarr == NULL) {
208 ret = ENOMEM; /* An exception is pending */
212 ret = (*jenv)->CallNonvirtualIntMethod(jenv, jdbenv, dbenv_class,
213 rep_transport_method, jcontrol, jrec, jlsn, envid, flags);
215 if ((*jenv)->ExceptionOccurred(jenv)) {
216 /* The exception will be thrown, so this could be any error. */
220 (*jenv)->DeleteLocalRef(jenv, jrecarr);
221 (*jenv)->DeleteLocalRef(jenv, jcontrolarr);
222 (*jenv)->DeleteLocalRef(jenv, jrec);
223 (*jenv)->DeleteLocalRef(jenv, jcontrol);
225 (*jenv)->DeleteLocalRef(jenv, jlsn);
232 static int __dbj_foreignkey_nullify(DB *db,
233 const DBT *key, DBT *data, const DBT *skey, int *changed)
236 JNIEnv *jenv = __dbj_get_jnienv(&detach);
238 jobject jdb = (jobject)DB_INTERNAL(db);
239 jobject jkey, jdata, jskey;
240 jbyteArray jkeyarr, jdataarr, jskeyarr;
249 jkey = (key->app_data != NULL) ?
250 ((DBT_LOCKED *)key->app_data)->jdbt :
251 (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
252 jdata = (data->app_data != NULL) ?
253 ((DBT_LOCKED *)data->app_data)->jdbt :
254 (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
255 jskey = (skey->app_data != NULL) ?
256 ((DBT_LOCKED *)skey->app_data)->jdbt :
257 (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
258 if (jkey == NULL || jdata == NULL || jskey == NULL) {
259 ret = ENOMEM; /* An exception is pending */
263 if (key->app_data == NULL) {
264 __dbj_dbt_copyout(jenv, key, &jkeyarr, jkey);
265 if (jkeyarr == NULL) {
266 ret = ENOMEM; /* An exception is pending */
270 if (data->app_data == NULL) {
271 __dbj_dbt_copyout(jenv, data, &jdataarr, jdata);
272 if (jdataarr == NULL) {
273 ret = ENOMEM; /* An exception is pending */
277 if (skey->app_data == NULL) {
278 __dbj_dbt_copyout(jenv, skey, &jskeyarr, jskey);
279 if (jskeyarr == NULL) {
280 ret = ENOMEM; /* An exception is pending */
285 jresult = (*jenv)->CallNonvirtualBooleanMethod(jenv, jdb, db_class, foreignkey_nullify_method, jkey, jdata, jskey);
287 if ((*jenv)->ExceptionOccurred(jenv)) {
288 /* The exception will be thrown, so this could be any error. */
293 if (jresult == JNI_FALSE)
297 /* copy jdata into data */
298 if ((ret = __dbj_dbt_copyin(jenv, &lresult, NULL, jdata, 0)) != 0)
300 if (lresult.dbt.size != 0){
301 data->size = lresult.dbt.size;
302 if ((ret = __os_umalloc(
303 NULL, data->size, &data->data)) != 0)
305 if ((ret = __dbj_dbt_memcopy(&lresult.dbt, 0,
306 data->data, data->size, DB_USERCOPY_GETDATA)) != 0)
308 __dbj_dbt_release(jenv, jdata, &lresult.dbt, &lresult);
309 (*jenv)->DeleteLocalRef(jenv, lresult.jarr);
310 F_SET(data, DB_DBT_APPMALLOC);
314 err: if (key->app_data == NULL) {
315 (*jenv)->DeleteLocalRef(jenv, jkeyarr);
316 (*jenv)->DeleteLocalRef(jenv, jkey);
318 if (data->app_data == NULL) {
319 (*jenv)->DeleteLocalRef(jenv, jdataarr);
320 (*jenv)->DeleteLocalRef(jenv, jdata);
328 static int __dbj_seckey_create(DB *db,
329 const DBT *key, const DBT *data, DBT *result)
332 JNIEnv *jenv = __dbj_get_jnienv(&detach);
333 jobject jdb = (jobject)DB_INTERNAL(db);
334 jobject jkey, jdata, jresult;
337 jbyteArray jkeyarr, jdataarr;
347 jkey = (key->app_data != NULL) ?
348 ((DBT_LOCKED *)key->app_data)->jdbt :
349 (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
350 jdata = (data->app_data != NULL) ?
351 ((DBT_LOCKED *)data->app_data)->jdbt :
352 (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
353 if (jkey == NULL || jdata == NULL) {
354 ret = ENOMEM; /* An exception is pending */
358 if (key->app_data == NULL) {
359 __dbj_dbt_copyout(jenv, key, &jkeyarr, jkey);
360 if (jkeyarr == NULL) {
361 ret = ENOMEM; /* An exception is pending */
365 if (data->app_data == NULL) {
366 __dbj_dbt_copyout(jenv, data, &jdataarr, jdata);
367 if (jdataarr == NULL) {
368 ret = ENOMEM; /* An exception is pending */
373 jskeys = (jobjectArray)(*jenv)->CallNonvirtualObjectMethod(jenv,
374 jdb, db_class, seckey_create_method, jkey, jdata);
376 if (jskeys == NULL ||
377 (num_skeys = (*jenv)->GetArrayLength(jenv, jskeys)) == 0) {
380 } else if (num_skeys == 1) {
381 memset(result, 0, sizeof (DBT));
384 if ((ret = __os_umalloc(db->env,
385 num_skeys * sizeof (DBT), &result->data)) != 0)
387 memset(result->data, 0, num_skeys * sizeof (DBT));
388 result->size = num_skeys;
389 F_SET(result, DB_DBT_APPMALLOC | DB_DBT_MULTIPLE);
390 tresult = (DBT *)result->data;
393 if ((*jenv)->ExceptionOccurred(jenv)) {
394 /* The exception will be thrown, so this could be any error. */
399 for (i = 0; i < num_skeys; i++, tresult++) {
400 jresult = (*jenv)->GetObjectArrayElement(jenv, jskeys, i);
403 __dbj_dbt_copyin(jenv, &lresult, NULL, jresult, 0)) != 0)
406 if (lresult.dbt.size != 0) {
407 /* If there's data, we need to take a copy of it. */
408 tresult->size = lresult.dbt.size;
409 if ((ret = __os_umalloc(NULL,
410 tresult->size, &tresult->data)) != 0)
412 if ((ret = __dbj_dbt_memcopy(&lresult.dbt, 0,
413 tresult->data, tresult->size,
414 DB_USERCOPY_GETDATA)) != 0)
416 __dbj_dbt_release(jenv,
417 jresult, &lresult.dbt, &lresult);
418 (*jenv)->DeleteLocalRef(jenv, lresult.jarr);
419 F_SET(tresult, DB_DBT_APPMALLOC);
422 (*jenv)->DeleteLocalRef(jenv, jresult);
425 err: if (key->app_data == NULL) {
426 (*jenv)->DeleteLocalRef(jenv, jkeyarr);
427 (*jenv)->DeleteLocalRef(jenv, jkey);
429 if (data->app_data == NULL) {
430 (*jenv)->DeleteLocalRef(jenv, jdataarr);
431 (*jenv)->DeleteLocalRef(jenv, jdata);
433 if (jskeys != NULL) {
434 (*jenv)->DeleteLocalRef(jenv, jskeys);
442 static int __dbj_append_recno(DB *db, DBT *dbt, db_recno_t recno)
445 JNIEnv *jenv = __dbj_get_jnienv(&detach);
446 jobject jdb = (jobject)DB_INTERNAL(db);
458 * The dbt we're passed will be from the application, but we can't
459 * just reuse it, since we will have already taken a copy of the data.
460 * Make a new DatabaseEntry object here for the callback.
462 jdbt = (*jenv)->NewObject(jenv, dbt_class, dbt_construct);
464 ret = ENOMEM; /* An exception is pending */
468 __dbj_dbt_copyout(jenv, dbt, &jdbtarr, jdbt);
469 if (jdbtarr == NULL) {
470 ret = ENOMEM; /* An exception is pending */
475 (*jenv)->CallNonvirtualVoidMethod(jenv, jdb, db_class,
476 append_recno_method, jdbt, recno);
478 if ((*jenv)->ExceptionOccurred(jenv)) {
479 /* The exception will be thrown, so this could be any error. */
484 ret = __dbj_dbt_copyin(jenv, &lresult, NULL, jdbt, 0);
485 memset(dbt, 0, sizeof (DBT));
487 if (ret == 0 && lresult.dbt.size != 0) {
488 /* If there's data, we need to take a copy of it. */
489 dbt->size = lresult.dbt.size;
491 __os_umalloc(NULL, dbt->size, &dbt->data)) != 0)
493 if ((ret = __dbj_dbt_memcopy(&lresult.dbt, 0,
494 dbt->data, dbt->size,
495 DB_USERCOPY_GETDATA)) != 0)
497 __dbj_dbt_release(jenv, jdbt, &lresult.dbt, &lresult);
498 (*jenv)->DeleteLocalRef(jenv, lresult.jarr);
499 F_SET(dbt, DB_DBT_APPMALLOC);
502 err: (*jenv)->DeleteLocalRef(jenv, jdbtarr);
503 (*jenv)->DeleteLocalRef(jenv, jdbt);
511 * Shared by __dbj_bt_compare and __dbj_h_compare
513 static int __dbj_am_compare(DB *db, const DBT *dbt1, const DBT *dbt2,
514 jmethodID compare_method)
517 JNIEnv *jenv = __dbj_get_jnienv(&detach);
518 jobject jdb = (jobject)DB_INTERNAL(db);
519 jbyteArray jdbtarr1, jdbtarr2;
527 if (dbt1->app_data != NULL)
528 jdbtarr1 = ((DBT_LOCKED *)dbt1->app_data)->jarr;
530 jdbtarr1 = (*jenv)->NewByteArray(jenv, (jsize)dbt1->size);
531 if (jdbtarr1 == NULL) {
535 (*jenv)->SetByteArrayRegion(jenv, jdbtarr1, 0,
536 (jsize)dbt1->size, (jbyte *)dbt1->data);
539 if (dbt2->app_data != NULL)
540 jdbtarr2 = ((DBT_LOCKED *)dbt2->app_data)->jarr;
542 jdbtarr2 = (*jenv)->NewByteArray(jenv, (jsize)dbt2->size);
543 if (jdbtarr2 == NULL) {
547 (*jenv)->SetByteArrayRegion(jenv, jdbtarr2, 0,
548 (jsize)dbt2->size, (jbyte *)dbt2->data);
551 ret = (int)(*jenv)->CallNonvirtualIntMethod(jenv, jdb, db_class,
552 compare_method, jdbtarr1, jdbtarr2);
554 if ((*jenv)->ExceptionOccurred(jenv)) {
555 /* The exception will be thrown, so this could be any error. */
559 err: if (dbt1->app_data == NULL)
560 (*jenv)->DeleteLocalRef(jenv, jdbtarr1);
561 if (dbt2->app_data == NULL)
562 (*jenv)->DeleteLocalRef(jenv, jdbtarr2);
569 static int __dbj_bt_compare(DB *db, const DBT *dbt1, const DBT *dbt2)
571 return __dbj_am_compare(db, dbt1, dbt2, bt_compare_method);
574 #define DBT_COPYOUT(num) \
575 if (dbt##num->app_data != NULL) \
576 jdbt##num = ((DBT_LOCKED *)dbt##num->app_data)->jdbt; \
578 if ((jdbt##num = (*jenv)->NewObject( \
579 jenv, dbt_class, dbt_construct)) == NULL) { \
580 ret = ENOMEM; /* An exception is pending */ \
583 __dbj_dbt_copyout(jenv, dbt##num, &jdbtarr##num, jdbt##num);\
584 if (jdbtarr##num == NULL) { \
585 ret = ENOMEM; /* An exception is pending */ \
590 #define DBT_COPIED_FREE(num) \
591 if (dbt##num->app_data == NULL) { \
592 (*jenv)->DeleteLocalRef(jenv, jdbtarr##num); \
593 (*jenv)->DeleteLocalRef(jenv, jdbt##num); \
596 #define DBT_COPYIN_DATA(num) \
597 ret = __dbj_dbt_copyin(jenv, &lresult, NULL, jdbt##num, 0); \
598 memset(dbt##num, 0, sizeof (DBT)); \
599 if (ret == 0 && lresult.dbt.size != 0) { \
600 /* If there's data, we need to take a copy of it. */ \
601 dbt##num->size = lresult.dbt.size; \
602 if ((ret = __os_umalloc( \
603 NULL, dbt##num->size, &dbt##num->data)) != 0) \
605 if ((ret = __dbj_dbt_memcopy(&lresult.dbt, 0, \
606 dbt##num->data, dbt##num->size, \
607 DB_USERCOPY_GETDATA)) != 0) \
609 __dbj_dbt_release(jenv, jdbt##num, &lresult.dbt, &lresult);\
610 (*jenv)->DeleteLocalRef(jenv, lresult.jarr); \
611 F_SET(dbt##num, DB_DBT_APPMALLOC); \
614 static int __dbj_bt_compress(DB *db, const DBT *dbt1, const DBT *dbt2,
615 const DBT *dbt3, const DBT *dbt4, DBT *dbt5)
618 JNIEnv *jenv = __dbj_get_jnienv(&detach);
619 jobject jdb = (jobject)DB_INTERNAL(db);
620 jobject jdbt1, jdbt2, jdbt3, jdbt4, jdbt5;
621 jbyteArray jdbtarr1, jdbtarr2, jdbtarr3, jdbtarr4, jdbtarr5;
636 ret = (int)(*jenv)->CallNonvirtualIntMethod(jenv, jdb, db_class,
637 bt_compress_method, jdbt1, jdbt2, jdbt3, jdbt4, jdbt5);
639 if ((*jenv)->ExceptionOccurred(jenv)) {
640 /* The exception will be thrown, so this could be any error. */
647 err: DBT_COPIED_FREE(1)
657 static int __dbj_bt_decompress(DB *db, const DBT *dbt1, const DBT *dbt2,
658 DBT *dbt3, DBT *dbt4, DBT *dbt5)
661 JNIEnv *jenv = __dbj_get_jnienv(&detach);
662 jobject jdb = (jobject)DB_INTERNAL(db);
663 jobject jdbt1, jdbt2, jdbt3, jdbt4, jdbt5;
664 jbyteArray jdbtarr1, jdbtarr2, jdbtarr3, jdbtarr4, jdbtarr5;
679 ret = (int)(*jenv)->CallNonvirtualIntMethod(jenv, jdb, db_class,
680 bt_decompress_method, jdbt1, jdbt2, jdbt3, jdbt4, jdbt5);
682 if ((*jenv)->ExceptionOccurred(jenv)) {
683 /* The exception will be thrown, so this could be any error. */
692 err: DBT_COPIED_FREE(1)
702 static size_t __dbj_bt_prefix(DB *db, const DBT *dbt1, const DBT *dbt2)
705 JNIEnv *jenv = __dbj_get_jnienv(&detach);
706 jobject jdb = (jobject)DB_INTERNAL(db);
707 jobject jdbt1, jdbt2;
708 jbyteArray jdbtarr1, jdbtarr2;
716 if (dbt1->app_data != NULL)
717 jdbt1 = ((DBT_LOCKED *)dbt1->app_data)->jdbt;
720 (*jenv)->NewObject(jenv, dbt_class, dbt_construct)) == NULL) {
721 ret = ENOMEM; /* An exception is pending */
724 __dbj_dbt_copyout(jenv, dbt1, &jdbtarr1, jdbt1);
725 if (jdbtarr1 == NULL) {
726 ret = ENOMEM; /* An exception is pending */
731 if (dbt2->app_data != NULL)
732 jdbt2 = ((DBT_LOCKED *)dbt2->app_data)->jdbt;
735 (*jenv)->NewObject(jenv, dbt_class, dbt_construct)) == NULL) {
736 ret = ENOMEM; /* An exception is pending */
739 __dbj_dbt_copyout(jenv, dbt2, &jdbtarr2, jdbt2);
740 if (jdbtarr2 == NULL) {
741 ret = ENOMEM; /* An exception is pending */
746 ret = (int)(*jenv)->CallNonvirtualIntMethod(jenv, jdb, db_class,
747 bt_prefix_method, jdbt1, jdbt2);
749 err: if (dbt1->app_data == NULL) {
750 (*jenv)->DeleteLocalRef(jenv, jdbtarr1);
751 (*jenv)->DeleteLocalRef(jenv, jdbt1);
753 if (dbt2->app_data == NULL) {
754 (*jenv)->DeleteLocalRef(jenv, jdbtarr2);
755 (*jenv)->DeleteLocalRef(jenv, jdbt2);
763 static int __dbj_dup_compare(DB *db, const DBT *dbt1, const DBT *dbt2)
766 JNIEnv *jenv = __dbj_get_jnienv(&detach);
767 jobject jdb = (jobject)DB_INTERNAL(db);
768 jbyteArray jdbtarr1, jdbtarr2;
774 jdbtarr1 = (*jenv)->NewByteArray(jenv, (jsize)dbt1->size);
775 if (jdbtarr1 == NULL)
777 (*jenv)->SetByteArrayRegion(jenv, jdbtarr1, 0, (jsize)dbt1->size,
778 (jbyte *)dbt1->data);
780 jdbtarr2 = (*jenv)->NewByteArray(jenv, (jsize)dbt2->size);
781 if (jdbtarr2 == NULL)
783 (*jenv)->SetByteArrayRegion(jenv, jdbtarr2, 0, (jsize)dbt2->size,
784 (jbyte *)dbt2->data);
786 ret = (int)(*jenv)->CallNonvirtualIntMethod(jenv, jdb, db_class,
787 dup_compare_method, jdbtarr1, jdbtarr2);
789 if ((*jenv)->ExceptionOccurred(jenv)) {
790 /* The exception will be thrown, so this could be any error. */
794 (*jenv)->DeleteLocalRef(jenv, jdbtarr2);
795 (*jenv)->DeleteLocalRef(jenv, jdbtarr1);
802 static void __dbj_db_feedback(DB *db, int opcode, int percent)
805 JNIEnv *jenv = __dbj_get_jnienv(&detach);
806 jobject jdb = (jobject)DB_INTERNAL(db);
809 (*jenv)->CallNonvirtualVoidMethod(jenv, jdb, db_class,
810 db_feedback_method, opcode, percent);
816 static int __dbj_h_compare(DB *db, const DBT *dbt1, const DBT *dbt2)
818 return __dbj_am_compare(db, dbt1, dbt2, h_compare_method);
821 static u_int32_t __dbj_h_hash(DB *db, const void *data, u_int32_t len)
824 JNIEnv *jenv = __dbj_get_jnienv(&detach);
825 jobject jdb = (jobject)DB_INTERNAL(db);
826 jbyteArray jarr = (*jenv)->NewByteArray(jenv, (jsize)len);
832 if ((jarr = (*jenv)->NewByteArray(jenv, (jsize)len)) == NULL)
833 return (ENOMEM); /* An exception is pending */
835 (*jenv)->SetByteArrayRegion(jenv, jarr, 0, (jsize)len, (jbyte *)data);
837 ret = (int)(*jenv)->CallNonvirtualIntMethod(jenv, jdb, db_class,
838 h_hash_method, jarr, len);
840 (*jenv)->DeleteLocalRef(jenv, jarr);
847 static u_int32_t __dbj_partition(DB *db, DBT *dbt1)
850 JNIEnv *jenv = __dbj_get_jnienv(&detach);
851 jobject jdb = (jobject)DB_INTERNAL(db);
858 ret = (int)(*jenv)->CallNonvirtualIntMethod(jenv, jdb, db_class,
859 partition_method, jdbt1);
860 if ((*jenv)->ExceptionOccurred(jenv)) {
861 /* The exception will be thrown, so this could be any error. */
867 err: DBT_COPIED_FREE(1)
875 JAVA_CALLBACK(void (*db_errcall_fcn)(const DB_ENV *,
876 const char *, const char *), com.sleepycat.db.ErrorHandler, error)
877 JAVA_CALLBACK(void (*env_feedback_fcn)(DB_ENV *, int, int),
878 com.sleepycat.db.FeedbackHandler, env_feedback)
879 JAVA_CALLBACK(void (*db_msgcall_fcn)(const DB_ENV *, const char *),
880 com.sleepycat.db.MessageHandler, message)
881 JAVA_CALLBACK(void (*db_panic_fcn)(DB_ENV *, int),
882 com.sleepycat.db.PanicHandler, panic)
883 JAVA_CALLBACK(void (*event_notify)(DB_ENV *, u_int32_t, void *),
884 com.sleepycat.db.EventHandler, event_notify)
885 JAVA_CALLBACK(int (*tx_recover)(DB_ENV *, DBT *, DB_LSN *, db_recops),
886 com.sleepycat.db.LogRecordHandler, app_dispatch)
887 JAVA_CALLBACK(int (*send)(DB_ENV *, const DBT *, const DBT *,
888 const DB_LSN *, int, u_int32_t),
889 com.sleepycat.db.ReplicationTransport, rep_transport)
892 * Db.associate is a special case, because the handler must be set in the
893 * secondary DB - that's what we have in the callback. In addition, there
894 * are two flavors of callback (single key and multi-key), so we need to
895 * check for both types when working out whether the C callback should
896 * be NULL. Note that this implies that the multi-key callback will be set
897 * on the secondary database *before* associate is called.
899 JAVA_CALLBACK(int (*callback)(DB *, const DBT *, const DBT *, DBT *),
900 com.sleepycat.db.SecondaryKeyCreator, seckey_create)
901 %typemap(javain) int (*callback)(DB *, const DBT *, const DBT *, DBT *)
902 %{ (secondary.seckey_create_handler = $javainput) != null ||
903 (secondary.secmultikey_create_handler != null) %}
904 JAVA_CALLBACK(int (*callback)(DB *, const DBT *, DBT *, const DBT *, int *),
905 com.sleepycat.db.ForeignKeyNullifier, foreignkey_nullify)
906 %typemap(javain) int (*callback)(DB *, const DBT *, DBT *, const DBT *, int *)
907 %{ (primary.foreignkey_nullify_handler = $javainput) != null ||
908 (primary.foreignmultikey_nullify_handler != null) %}
910 JAVA_CALLBACK(int (*db_append_recno_fcn)(DB *, DBT *, db_recno_t),
911 com.sleepycat.db.RecordNumberAppender, append_recno)
912 JAVA_CALLBACK(int (*bt_compare_fcn)(DB *, const DBT *, const DBT *),
913 java.util.Comparator, bt_compare)
914 JAVA_CALLBACK(int (*bt_compress_fcn)(DB *, const DBT *, const DBT *,
915 const DBT *, const DBT *, DBT *),
916 com.sleepycat.db.BtreeCompressor, bt_compress)
917 JAVA_CALLBACK(int (*bt_decompress_fcn)(DB *, const DBT *, const DBT *,
918 DBT *, DBT *, DBT *), com.sleepycat.db.BtreeCompressor, bt_decompress)
919 JAVA_CALLBACK(u_int32_t (*db_partition_fcn)(DB *, DBT *),
920 com.sleepycat.db.PartitionHandler, partition)
921 JAVA_CALLBACK(size_t (*bt_prefix_fcn)(DB *, const DBT *, const DBT *),
922 com.sleepycat.db.BtreePrefixCalculator, bt_prefix)
923 JAVA_CALLBACK(int (*dup_compare_fcn)(DB *, const DBT *, const DBT *),
924 java.util.Comparator, dup_compare)
925 JAVA_CALLBACK(void (*db_feedback_fcn)(DB *, int, int),
926 com.sleepycat.db.FeedbackHandler, db_feedback)
927 JAVA_CALLBACK(int (*h_compare_fcn)(DB *, const DBT *, const DBT *),
928 java.util.Comparator, h_compare)
929 JAVA_CALLBACK(u_int32_t (*h_hash_fcn)(DB *, const void *, u_int32_t),
930 com.sleepycat.db.Hasher, h_hash)