3 * Macros to find the Java DbEnv object for methods in various classes.
4 * Note that "arg1" is from the code SWIG generates for the "this"/"self".
6 #define JDBENV (arg1 ? (jobject)DB_ENV_INTERNAL(arg1) : NULL)
7 #define DB2JDBENV ((jobject)DB_ENV_INTERNAL(arg1->dbenv))
8 #define DBC2JDBENV ((jobject)DB_ENV_INTERNAL(arg1->dbp->dbenv))
9 #define TXN2JDBENV ((jobject)DB_ENV_INTERNAL(arg1->mgrp->env->dbenv))
12 /* Common case exception handling */
13 %typemap(check) SWIGTYPE *self %{
15 __dbj_throw(jenv, EINVAL, "call on closed handle", NULL, NULL);
19 %define JAVA_EXCEPT_NONE
20 %exception %{ $action %}
23 /* Most methods return an error code. */
24 %define JAVA_EXCEPT(_retcheck, _jdbenv)
27 if (!_retcheck(result)) {
28 __dbj_throw(jenv, result, NULL, NULL, _jdbenv);
33 /* For everything else, errno is set in db.i. */
34 %define JAVA_EXCEPT_ERRNO(_retcheck, _jdbenv)
38 if (!_retcheck(errno)) {
39 __dbj_throw(jenv, errno, NULL, NULL, _jdbenv);
44 /* And then there are these (extra) special cases. */
45 %exception __db_env::lock_get %{
48 if (errno == DB_LOCK_NOTGRANTED) {
50 (*jenv)->NewObject(jenv, lockex_class, lockex_construct,
51 (*jenv)->NewStringUTF(jenv, "DbEnv.lock_get not granted"),
52 DB_LOCK_GET, arg5, jarg4, NULL, -1, JDBENV));
53 } else if (!DB_RETOK_STD(errno)) {
54 __dbj_throw(jenv, errno, NULL, NULL, JDBENV);
59 static jthrowable __dbj_get_except(JNIEnv *jenv,
60 int err, const char *msg, jobject obj, jobject jdbenv) {
64 msg = db_strerror(err);
66 jmsg = (*jenv)->NewStringUTF(jenv, msg);
68 /* Retrieve error message logged by DB */
70 jmsg = (jstring) (*jenv)->CallNonvirtualObjectMethod(jenv,
71 jdbenv, dbenv_class, get_err_msg_method, jmsg);
76 return (jthrowable)(*jenv)->NewObject(jenv,
77 illegalargex_class, illegalargex_construct, jmsg);
80 return (jthrowable)(*jenv)->NewObject(jenv,
81 filenotfoundex_class, filenotfoundex_construct, jmsg);
84 return (jthrowable)(*jenv)->NewObject(jenv,
85 outofmemerr_class, outofmemerr_construct, jmsg);
88 return (jthrowable)(*jenv)->NewObject(jenv, memex_class,
89 memex_construct, jmsg, obj, err, jdbenv);
91 case DB_REP_DUPMASTER:
92 return (jthrowable)(*jenv)->NewObject(jenv,
93 repdupmasterex_class, repdupmasterex_construct,
96 case DB_REP_HANDLE_DEAD:
97 return (jthrowable)(*jenv)->NewObject(jenv,
98 rephandledeadex_class, rephandledeadex_construct,
101 case DB_REP_HOLDELECTION:
102 return (jthrowable)(*jenv)->NewObject(jenv,
103 repholdelectionex_class, repholdelectionex_construct,
106 case DB_REP_JOIN_FAILURE:
107 return (jthrowable)(*jenv)->NewObject(jenv,
108 repjoinfailex_class, repjoinfailex_construct,
111 case DB_REP_LEASE_EXPIRED:
112 return (jthrowable)(*jenv)->NewObject(jenv,
113 repleaseexpiredex_class, repleaseexpiredex_construct,
116 case DB_REP_LEASE_TIMEOUT:
117 return (jthrowable)(*jenv)->NewObject(jenv,
118 repleasetimeoutex_class, repleasetimeoutex_construct,
122 return (jthrowable)(*jenv)->NewObject(jenv,
123 replockoutex_class, replockoutex_construct,
127 return (jthrowable)(*jenv)->NewObject(jenv,
128 repunavailex_class, repunavailex_construct,
132 return (jthrowable)(*jenv)->NewObject(jenv, runrecex_class,
133 runrecex_construct, jmsg, err, jdbenv);
135 case DB_LOCK_DEADLOCK:
136 return (jthrowable)(*jenv)->NewObject(jenv, deadex_class,
137 deadex_construct, jmsg, err, jdbenv);
139 case DB_LOCK_NOTGRANTED:
140 return (jthrowable)(*jenv)->NewObject(jenv, lockex_class,
141 lockex_construct, jmsg, err, 0, NULL, NULL, 0, jdbenv);
143 case DB_VERSION_MISMATCH:
144 return (jthrowable)(*jenv)->NewObject(jenv, versionex_class,
145 versionex_construct, jmsg, err, jdbenv);
148 return (jthrowable)(*jenv)->NewObject(jenv, dbex_class,
149 dbex_construct, jmsg, err, jdbenv);
153 static int __dbj_throw(JNIEnv *jenv,
154 int err, const char *msg, jobject obj, jobject jdbenv)
158 /* If an exception is pending, ignore requests to throw a new one. */
159 if ((*jenv)->ExceptionOccurred(jenv) == NULL) {
160 t = __dbj_get_except(jenv, err, msg, obj, jdbenv);
163 * This is a problem - something went wrong creating an
164 * exception. We have to assume there is an exception
165 * created by the JVM that is pending as a result
166 * (e.g., OutOfMemoryError), but we don't want to lose
167 * this error, so we just call __db_errx here.
170 msg = db_strerror(err);
172 __db_errx(NULL, "Couldn't create exception for: '%s'",
175 (*jenv)->Throw(jenv, t);