1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
%{
/*
* Macros to find the Java DbEnv object for methods in various classes.
* Note that "arg1" is from the code SWIG generates for the "this"/"self".
*/
#define JDBENV (arg1 ? (jobject)DB_ENV_INTERNAL(arg1) : NULL)
#define DB2JDBENV ((jobject)DB_ENV_INTERNAL(arg1->dbenv))
#define DBC2JDBENV ((jobject)DB_ENV_INTERNAL(arg1->dbp->dbenv))
#define TXN2JDBENV ((jobject)DB_ENV_INTERNAL(arg1->mgrp->dbenv))
%}
/* Common case exception handling */
%typemap(check) SWIGTYPE *self %{
if ($input == 0) {
__dbj_throw(jenv, EINVAL, "call on closed handle", NULL, NULL);
return $null;
}%}
%define JAVA_EXCEPT_NONE
%exception %{ $action %}
%enddef
/* Most methods return an error code. */
%define JAVA_EXCEPT(_retcheck, _jdbenv)
%exception %{
$action
if (!_retcheck(result)) {
__dbj_throw(jenv, result, NULL, NULL, _jdbenv);
}
%}
%enddef
/* For everything else, errno is set in db.i. */
%define JAVA_EXCEPT_ERRNO(_retcheck, _jdbenv)
%exception %{
errno = 0;
$action
if (!_retcheck(errno)) {
__dbj_throw(jenv, errno, NULL, NULL, _jdbenv);
}
%}
%enddef
/* And then there are these (extra) special cases. */
%exception __db_env::lock_get %{
errno = 0;
$action
if (errno == DB_LOCK_NOTGRANTED) {
(*jenv)->Throw(jenv,
(*jenv)->NewObject(jenv, lockex_class, lockex_construct,
(*jenv)->NewStringUTF(jenv, "DbEnv.lock_get not granted"),
DB_LOCK_GET, arg5, jarg4, NULL, -1, JDBENV));
} else if (!DB_RETOK_STD(errno)) {
__dbj_throw(jenv, errno, NULL, NULL, JDBENV);
}
%}
%{
static jthrowable __dbj_get_except(JNIEnv *jenv,
int err, const char *msg, jobject obj, jobject jdbenv) {
jobject jmsg;
if (msg == NULL)
msg = db_strerror(err);
jmsg = (*jenv)->NewStringUTF(jenv, msg);
switch (err) {
case EINVAL:
return (jthrowable)(*jenv)->NewObject(jenv,
illegalargex_class, illegalargex_construct, jmsg);
case ENOENT:
return (jthrowable)(*jenv)->NewObject(jenv,
filenotfoundex_class, filenotfoundex_construct, jmsg);
case ENOMEM:
return (jthrowable)(*jenv)->NewObject(jenv,
outofmemerr_class, outofmemerr_construct, jmsg);
case DB_BUFFER_SMALL:
return (jthrowable)(*jenv)->NewObject(jenv, memex_class,
memex_construct, jmsg, obj, err, jdbenv);
case DB_REP_HANDLE_DEAD:
return (jthrowable)(*jenv)->NewObject(jenv,
rephandledeadex_class, rephandledeadex_construct,
jmsg, err, jdbenv);
case DB_RUNRECOVERY:
return (jthrowable)(*jenv)->NewObject(jenv, runrecex_class,
runrecex_construct, jmsg, err, jdbenv);
case DB_LOCK_DEADLOCK:
return (jthrowable)(*jenv)->NewObject(jenv, deadex_class,
deadex_construct, jmsg, err, jdbenv);
case DB_LOCK_NOTGRANTED:
return (jthrowable)(*jenv)->NewObject(jenv, lockex_class,
lockex_construct, jmsg, 0, 0, NULL, NULL, 0, jdbenv);
default:
return (jthrowable)(*jenv)->NewObject(jenv, dbex_class,
dbex_construct, jmsg, err, jdbenv);
}
}
static int __dbj_throw(JNIEnv *jenv,
int err, const char *msg, jobject obj, jobject jdbenv)
{
jthrowable t;
/* If an exception is pending, ignore requests to throw a new one. */
if ((*jenv)->ExceptionOccurred(jenv) == NULL) {
t = __dbj_get_except(jenv, err, msg, obj, jdbenv);
if (t == NULL) {
/*
* This is a problem - something went wrong creating an
* exception. We have to assume there is an exception
* created by the JVM that is pending as a result
* (e.g., OutOfMemoryError), but we don't want to lose
* this error, so we just call __db_err here.
*/
if (msg == NULL)
msg = db_strerror(err);
__db_err(NULL, "Couldn't create exception for: '%s'",
msg);
} else
(*jenv)->Throw(jenv, t);
}
return (err);
}
%}
|