resetting manifest requested domain to floor
[platform/upstream/db4.git] / 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 err, const char *msg, jobject obj, jobject jdbenv) {
61         jobject jmsg;
62
63         if (msg == NULL)
64                 msg = db_strerror(err);
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 (err) {
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, err, jdbenv);
90
91         case DB_REP_DUPMASTER:
92                 return (jthrowable)(*jenv)->NewObject(jenv,
93                     repdupmasterex_class, repdupmasterex_construct,
94                     jmsg, err, jdbenv);
95
96         case DB_REP_HANDLE_DEAD:
97                 return (jthrowable)(*jenv)->NewObject(jenv,
98                     rephandledeadex_class, rephandledeadex_construct,
99                     jmsg, err, jdbenv);
100
101         case DB_REP_HOLDELECTION:
102                 return (jthrowable)(*jenv)->NewObject(jenv,
103                     repholdelectionex_class, repholdelectionex_construct,
104                     jmsg, err, jdbenv);
105
106         case DB_REP_JOIN_FAILURE:
107                 return (jthrowable)(*jenv)->NewObject(jenv,
108                     repjoinfailex_class, repjoinfailex_construct,
109                     jmsg, err, jdbenv);
110
111         case DB_REP_LEASE_EXPIRED:
112                 return (jthrowable)(*jenv)->NewObject(jenv,
113                     repleaseexpiredex_class, repleaseexpiredex_construct,
114                     jmsg, err, jdbenv);
115
116         case DB_REP_LEASE_TIMEOUT:
117                 return (jthrowable)(*jenv)->NewObject(jenv,
118                     repleasetimeoutex_class, repleasetimeoutex_construct,
119                     jmsg, err, jdbenv);
120
121         case DB_REP_LOCKOUT:
122                 return (jthrowable)(*jenv)->NewObject(jenv,
123                     replockoutex_class, replockoutex_construct,
124                     jmsg, err, jdbenv);
125
126         case DB_REP_UNAVAIL:
127                 return (jthrowable)(*jenv)->NewObject(jenv,
128                     repunavailex_class, repunavailex_construct,
129                     jmsg, err, jdbenv);
130
131         case DB_RUNRECOVERY:
132                 return (jthrowable)(*jenv)->NewObject(jenv, runrecex_class,
133                     runrecex_construct, jmsg, err, jdbenv);
134
135         case DB_LOCK_DEADLOCK:
136                 return (jthrowable)(*jenv)->NewObject(jenv, deadex_class,
137                     deadex_construct, jmsg, err, jdbenv);
138
139         case DB_LOCK_NOTGRANTED:
140                 return (jthrowable)(*jenv)->NewObject(jenv, lockex_class,
141                     lockex_construct, jmsg, err, 0, NULL, NULL, 0, jdbenv);
142
143         case DB_VERSION_MISMATCH:
144                 return (jthrowable)(*jenv)->NewObject(jenv, versionex_class,
145                     versionex_construct, jmsg, err, jdbenv);
146
147         default:
148                 return (jthrowable)(*jenv)->NewObject(jenv, dbex_class,
149                     dbex_construct, jmsg, err, jdbenv);
150         }
151 }
152
153 static int __dbj_throw(JNIEnv *jenv,
154     int err, const char *msg, jobject obj, jobject jdbenv)
155 {
156         jthrowable t;
157
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);
161                 if (t == NULL) {
162                         /*
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.
168                          */
169                         if (msg == NULL)
170                                 msg = db_strerror(err);
171
172                          __db_errx(NULL, "Couldn't create exception for: '%s'",
173                              msg);
174                 } else
175                         (*jenv)->Throw(jenv, t);
176         }
177
178         return (err);
179 }
180 %}