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 ret, const char *msg, jobject obj, jobject jdbenv) {
64 msg = db_strerror(ret);
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, ret, jdbenv);
92 return (jthrowable)(*jenv)->NewObject(jenv, heapfullex_class,
93 heapfullex_construct, jmsg, ret, jdbenv);
95 case DB_REP_DUPMASTER:
96 return (jthrowable)(*jenv)->NewObject(jenv,
97 repdupmasterex_class, repdupmasterex_construct,
100 case DB_REP_HANDLE_DEAD:
101 return (jthrowable)(*jenv)->NewObject(jenv,
102 rephandledeadex_class, rephandledeadex_construct,
105 case DB_REP_HOLDELECTION:
106 return (jthrowable)(*jenv)->NewObject(jenv,
107 repholdelectionex_class, repholdelectionex_construct,
110 case DB_REP_JOIN_FAILURE:
111 return (jthrowable)(*jenv)->NewObject(jenv,
112 repjoinfailex_class, repjoinfailex_construct,
115 case DB_REP_LEASE_EXPIRED:
116 return (jthrowable)(*jenv)->NewObject(jenv,
117 repleaseexpiredex_class, repleaseexpiredex_construct,
121 return (jthrowable)(*jenv)->NewObject(jenv,
122 replockoutex_class, replockoutex_construct,
126 return (jthrowable)(*jenv)->NewObject(jenv,
127 repunavailex_class, repunavailex_construct,
131 return (jthrowable)(*jenv)->NewObject(jenv, runrecex_class,
132 runrecex_construct, jmsg, ret, jdbenv);
134 case DB_LOCK_DEADLOCK:
135 return (jthrowable)(*jenv)->NewObject(jenv, deadex_class,
136 deadex_construct, jmsg, ret, jdbenv);
138 case DB_LOCK_NOTGRANTED:
139 return (jthrowable)(*jenv)->NewObject(jenv, lockex_class,
140 lockex_construct, jmsg, ret, 0, NULL, NULL, 0, jdbenv);
142 case DB_VERSION_MISMATCH:
143 return (jthrowable)(*jenv)->NewObject(jenv, versionex_class,
144 versionex_construct, jmsg, ret, jdbenv);
147 return (jthrowable)(*jenv)->NewObject(jenv, dbex_class,
148 dbex_construct, jmsg, ret, jdbenv);
152 static int __dbj_throw(JNIEnv *jenv,
153 int ret, const char *msg, jobject obj, jobject jdbenv)
157 /* If an exception is pending, ignore requests to throw a new one. */
158 if ((*jenv)->ExceptionOccurred(jenv) == NULL) {
159 t = __dbj_get_except(jenv, ret, msg, obj, jdbenv);
162 * This is a problem - something went wrong creating an
163 * exception. We have to assume there is an exception
164 * created by the JVM that is pending as a result
165 * (e.g., OutOfMemoryError), but we don't want to lose
166 * this error, so we just call __db_errx here.
169 msg = db_strerror(ret);
171 __db_errx(NULL, "Couldn't create exception for: '%s'",
174 (*jenv)->Throw(jenv, t);