Imported Upstream version 5.3.21
[platform/upstream/libdb.git] / lang / java / libdb_java / java_except.i
1 %{
2 /*
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".
5  */
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))
10 %}
11
12 /* Common case exception handling */
13 %typemap(check) SWIGTYPE *self %{
14         if ($input == 0) {
15                 __dbj_throw(jenv, EINVAL, "call on closed handle", NULL, NULL);
16                 return $null;
17         }%}
18
19 %define JAVA_EXCEPT_NONE
20 %exception %{ $action %}
21 %enddef
22
23 /* Most methods return an error code. */
24 %define JAVA_EXCEPT(_retcheck, _jdbenv)
25 %exception %{
26         $action
27         if (!_retcheck(result)) {
28                 __dbj_throw(jenv, result, NULL, NULL, _jdbenv);
29         }
30 %}
31 %enddef
32
33 /* For everything else, errno is set in db.i. */
34 %define JAVA_EXCEPT_ERRNO(_retcheck, _jdbenv)
35 %exception %{
36         errno = 0;
37         $action
38         if (!_retcheck(errno)) {
39                 __dbj_throw(jenv, errno, NULL, NULL, _jdbenv);
40         }
41 %}
42 %enddef
43
44 /* And then there are these (extra) special cases. */
45 %exception __db_env::lock_get %{
46         errno = 0;
47         $action
48         if (errno == DB_LOCK_NOTGRANTED) {
49                 (*jenv)->Throw(jenv,
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);
55         }
56 %}
57
58 %{
59 static jthrowable __dbj_get_except(JNIEnv *jenv,
60     int ret, const char *msg, jobject obj, jobject jdbenv) {
61         jobject jmsg;
62
63         if (msg == NULL)
64                 msg = db_strerror(ret);
65
66         jmsg = (*jenv)->NewStringUTF(jenv, msg);
67
68         /* Retrieve error message logged by DB */
69         if (jdbenv != NULL) {
70                 jmsg = (jstring) (*jenv)->CallNonvirtualObjectMethod(jenv,
71                     jdbenv, dbenv_class, get_err_msg_method, jmsg);
72         }
73
74         switch (ret) {
75         case EINVAL:
76                 return (jthrowable)(*jenv)->NewObject(jenv,
77                     illegalargex_class, illegalargex_construct, jmsg);
78
79         case ENOENT:
80                 return (jthrowable)(*jenv)->NewObject(jenv,
81                     filenotfoundex_class, filenotfoundex_construct, jmsg);
82
83         case ENOMEM:
84                 return (jthrowable)(*jenv)->NewObject(jenv,
85                     outofmemerr_class, outofmemerr_construct, jmsg);
86
87         case DB_BUFFER_SMALL:
88                 return (jthrowable)(*jenv)->NewObject(jenv, memex_class,
89                     memex_construct, jmsg, obj, ret, jdbenv);
90
91         case DB_HEAP_FULL:
92                 return (jthrowable)(*jenv)->NewObject(jenv, heapfullex_class,
93                     heapfullex_construct, jmsg, ret, jdbenv);
94
95         case DB_REP_DUPMASTER:
96                 return (jthrowable)(*jenv)->NewObject(jenv,
97                     repdupmasterex_class, repdupmasterex_construct,
98                     jmsg, ret, jdbenv);
99
100         case DB_REP_HANDLE_DEAD:
101                 return (jthrowable)(*jenv)->NewObject(jenv,
102                     rephandledeadex_class, rephandledeadex_construct,
103                     jmsg, ret, jdbenv);
104
105         case DB_REP_HOLDELECTION:
106                 return (jthrowable)(*jenv)->NewObject(jenv,
107                     repholdelectionex_class, repholdelectionex_construct,
108                     jmsg, ret, jdbenv);
109
110         case DB_REP_JOIN_FAILURE:
111                 return (jthrowable)(*jenv)->NewObject(jenv,
112                     repjoinfailex_class, repjoinfailex_construct,
113                     jmsg, ret, jdbenv);
114
115         case DB_REP_LEASE_EXPIRED:
116                 return (jthrowable)(*jenv)->NewObject(jenv,
117                     repleaseexpiredex_class, repleaseexpiredex_construct,
118                     jmsg, ret, jdbenv);
119
120         case DB_REP_LOCKOUT:
121                 return (jthrowable)(*jenv)->NewObject(jenv,
122                     replockoutex_class, replockoutex_construct,
123                     jmsg, ret, jdbenv);
124
125         case DB_REP_UNAVAIL:
126                 return (jthrowable)(*jenv)->NewObject(jenv,
127                     repunavailex_class, repunavailex_construct,
128                     jmsg, ret, jdbenv);
129
130         case DB_RUNRECOVERY:
131                 return (jthrowable)(*jenv)->NewObject(jenv, runrecex_class,
132                     runrecex_construct, jmsg, ret, jdbenv);
133
134         case DB_LOCK_DEADLOCK:
135                 return (jthrowable)(*jenv)->NewObject(jenv, deadex_class,
136                     deadex_construct, jmsg, ret, jdbenv);
137
138         case DB_LOCK_NOTGRANTED:
139                 return (jthrowable)(*jenv)->NewObject(jenv, lockex_class,
140                     lockex_construct, jmsg, ret, 0, NULL, NULL, 0, jdbenv);
141
142         case DB_VERSION_MISMATCH:
143                 return (jthrowable)(*jenv)->NewObject(jenv, versionex_class,
144                     versionex_construct, jmsg, ret, jdbenv);
145
146         default:
147                 return (jthrowable)(*jenv)->NewObject(jenv, dbex_class,
148                     dbex_construct, jmsg, ret, jdbenv);
149         }
150 }
151
152 static int __dbj_throw(JNIEnv *jenv,
153     int ret, const char *msg, jobject obj, jobject jdbenv)
154 {
155         jthrowable t;
156
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);
160                 if (t == NULL) {
161                         /*
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.
167                          */
168                         if (msg == NULL)
169                                 msg = db_strerror(ret);
170
171                          __db_errx(NULL, "Couldn't create exception for: '%s'",
172                              msg);
173                 } else
174                         (*jenv)->Throw(jenv, t);
175         }
176
177         return (ret);
178 }
179 %}