QOF 0.7.5
|
00001 /***************************************************************** 00002 * qoferror.c 00003 * 00004 * Sun Sep 10 19:55:08 2006 00005 * Copyright 2006 Neil Williams 00006 * linux@codehelp.co.uk 00007 ****************************************************************/ 00008 /* 00009 * This program is free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with this program; if not, write to the Free Software 00021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00022 */ 00023 00024 #include "config.h" 00025 #include "qof.h" 00026 #include "qoferror-p.h" 00027 #include "qofsession-p.h" 00028 00029 struct QofError_s 00030 { 00031 QofErrorId id; 00032 gchar * message; 00033 const gchar * filename; 00034 gboolean use_file; 00035 QofTime * qt; 00036 }; 00037 00038 /* All registered errors - hashed only once per session. */ 00039 static GHashTable * error_table = NULL; 00040 static gint32 count = 0; 00041 static QofLogModule log_module = QOF_MOD_ERROR; 00042 00043 void 00044 qof_error_init (void) 00045 { 00046 error_table = g_hash_table_new (g_direct_hash, g_direct_equal); 00047 #ifndef QOF_DISABLE_DEPRECATED 00048 set_deprecated_errors (); 00049 #endif 00050 } 00051 00052 static void 00053 qof_error_free (QofError * error) 00054 { 00055 if (error->qt) 00056 qof_time_free (error->qt); 00057 g_free (error->message); 00058 g_free (error); 00059 } 00060 00061 /* clear the table of registered error values */ 00062 static void 00063 clear_table (gpointer key, gpointer value, gpointer user_data) 00064 { 00065 qof_error_free ((QofError*)value); 00066 } 00067 00068 void 00069 qof_error_close (void) 00070 { 00071 g_hash_table_foreach (error_table, clear_table, NULL); 00072 g_hash_table_destroy (error_table); 00073 } 00074 00075 #ifndef QOF_DISABLE_DEPRECATED 00076 void 00077 deprecated_support (QofErrorId id, const gchar * err_message) 00078 { 00079 QofError * qerr; 00080 00081 if (id >= ERR_LAST) 00082 return; 00083 qerr = g_new0 (QofError, 1); 00084 qerr->id = id; 00085 qerr->message = g_strdup (err_message); 00086 g_hash_table_insert (error_table, GINT_TO_POINTER(id), qerr); 00087 } 00088 #endif 00089 00090 QofErrorId 00091 qof_error_register (const gchar * err_message, gboolean use_file) 00092 { 00093 QofError * qerr; 00094 00095 ENTER (" "); 00096 qerr = g_new0 (QofError, 1); 00097 count++; 00098 #ifndef QOF_DISABLE_DEPRECATED 00099 count += ERR_LAST; 00100 #endif 00101 qerr->id = count; 00102 if (use_file) 00103 { 00104 gchar * spec; 00105 00106 spec = g_strrstr (err_message, "%s"); 00107 use_file = (spec) ? TRUE : FALSE; 00108 } 00109 qerr->use_file = use_file; 00110 qerr->message = g_strdup (err_message); 00111 g_hash_table_insert (error_table, GINT_TO_POINTER(qerr->id), qerr); 00112 LEAVE (" "); 00113 return qerr->id; 00114 } 00115 00116 void 00117 qof_error_unregister (QofErrorId id) 00118 { 00119 QofError * qerr; 00120 gboolean result; 00121 00122 ENTER (" "); 00123 qerr = g_hash_table_lookup (error_table, GINT_TO_POINTER(id)); 00124 qof_error_free (qerr); 00125 result = g_hash_table_remove (error_table, 00126 GINT_TO_POINTER(id)); 00127 if (!result) 00128 LEAVE ("unable to remove registered error."); 00129 LEAVE (" ok."); 00130 } 00131 00132 void 00133 qof_error_set (QofSession * session, QofErrorId error) 00134 { 00135 QofError * qerr, * set; 00136 00137 g_return_if_fail (session); 00138 if (error == QOF_SUCCESS) 00139 { 00140 DEBUG (" passed success, not error."); 00141 return; 00142 } 00143 qerr = g_hash_table_lookup (error_table, GINT_TO_POINTER(error)); 00144 if (!qerr) 00145 { 00146 DEBUG (" failed hash table lookup"); 00147 return; 00148 } 00149 session->last_err = error; 00150 if (session->error_message) 00151 g_free (session->error_message); 00152 if (qerr->use_file) 00153 session->error_message = g_strdup_printf (qerr->message, 00154 qof_session_get_url (session)); 00155 else 00156 session->error_message = g_strdup (qerr->message); 00157 if (!session->backend) 00158 return; 00159 /* create a new error for the list */ 00160 set = g_new0 (QofError, 1); 00161 if (qerr->use_file) 00162 set->message = g_strdup_printf (qerr->message, 00163 qof_session_get_file_path (session)); 00164 else 00165 set->message = g_strdup (qerr->message); 00166 set->id = error; 00167 set->qt = qof_time_get_current (); 00168 session->backend->error_stack = 00169 g_list_prepend (session->backend->error_stack, set); 00170 #ifndef QOF_DISABLE_DEPRECATED 00171 session->backend->last_err = error; 00172 #endif 00173 } 00174 00175 void 00176 qof_error_set_be (QofBackend * be, QofErrorId error) 00177 { 00178 QofError * qerr, * set; 00179 00180 g_return_if_fail (be); 00181 if (error == QOF_SUCCESS) 00182 return; 00183 qerr = g_hash_table_lookup (error_table, GINT_TO_POINTER(error)); 00184 if (!qerr) 00185 return; 00186 /* create a new error for the list */ 00187 set = g_new0 (QofError, 1); 00188 if (qerr->use_file) 00189 set->message = g_strdup_printf (qerr->message, be->fullpath); 00190 else 00191 set->message = g_strdup (qerr->message); 00192 set->id = error; 00193 set->qt = qof_time_get_current (); 00194 be->error_stack = g_list_prepend (be->error_stack, 00195 set); 00196 #ifndef QOF_DISABLE_DEPRECATED 00197 be->last_err = error; 00198 #endif 00199 } 00200 00201 /* clear the list of actual errors */ 00202 static void 00203 clear_list (gpointer value, gpointer user_data) 00204 { 00205 qof_error_free ((QofError*)value); 00206 } 00207 00208 void 00209 qof_error_clear (QofSession * session) 00210 { 00211 g_return_if_fail (session); 00212 if (!session->backend) 00213 return; 00214 g_list_foreach (session->backend->error_stack, clear_list, NULL); 00215 g_list_free (session->backend->error_stack); 00216 session->backend->error_stack = NULL; 00217 if (session->error_message) 00218 g_free (session->error_message); 00219 session->error_message = NULL; 00220 session->last_err = QOF_SUCCESS; 00221 #ifndef QOF_DISABLE_DEPRECATED 00222 session->backend->last_err = QOF_SUCCESS; 00223 #endif 00224 } 00225 00226 QofErrorId 00227 qof_error_check (QofSession * session) 00228 { 00229 g_return_val_if_fail (session, QOF_FATAL); 00230 return qof_error_check_be (session->backend); 00231 } 00232 00233 QofErrorId 00234 qof_error_check_be (QofBackend * be) 00235 { 00236 QofError * qerr; 00237 GList * first; 00238 00239 if (!be) 00240 return QOF_FATAL; 00241 if (g_list_length (be->error_stack) == 0) 00242 return QOF_SUCCESS; 00243 first = g_list_first (be->error_stack); 00244 qerr = (QofError*)first->data; 00245 if (!qerr) 00246 return QOF_FATAL; 00247 return qerr->id; 00248 } 00249 00250 QofTime * 00251 qof_error_get_time_be (QofBackend * be) 00252 { 00253 QofError * qerr; 00254 GList * first; 00255 00256 if (g_list_length(be->error_stack) == 0) 00257 return NULL; 00258 first = g_list_first (be->error_stack); 00259 qerr = (QofError*)first->data; 00260 return qerr->qt; 00261 } 00262 00263 QofTime * 00264 qof_error_get_time (QofSession * session) 00265 { 00266 return qof_error_get_time_be (session->backend); 00267 } 00268 00269 #ifndef QOF_DISABLE_DEPRECATED 00270 static void 00271 set_previous_error (QofBackend * be) 00272 { 00273 QofError * qerr; 00274 GList * pop; 00275 00276 if (!be) 00277 return; 00278 if (g_list_length(be->error_stack) == 0) 00279 return; 00280 pop = g_list_last (be->error_stack); 00281 qerr = (QofError*)pop->data; 00282 be->last_err = qerr->id; 00283 be->error_msg = qerr->message; 00284 } 00285 #endif 00286 00287 QofErrorId 00288 qof_error_get_id (QofSession * session) 00289 { 00290 QofErrorId id; 00291 00292 g_return_val_if_fail (session, QOF_FATAL); 00293 id = QOF_SUCCESS; 00294 id = qof_error_get_id_be (session->backend); 00295 { 00296 QofError * qerr; 00297 00298 qerr = g_hash_table_lookup (error_table, 00299 GINT_TO_POINTER(id)); 00300 if (!qerr) 00301 { 00302 DEBUG (" empty QofError value"); 00303 return QOF_FATAL; 00304 } 00305 if (session->error_message) 00306 g_free (session->error_message); 00307 session->error_message = qerr->message; 00308 session->last_err = id; 00309 } 00310 return id; 00311 } 00312 00313 QofErrorId 00314 qof_error_get_id_be (QofBackend * be) 00315 { 00316 QofError * qerr; 00317 GList * first; 00318 00319 if (!be) 00320 return QOF_FATAL; 00321 if (g_list_length (be->error_stack) == 0) 00322 return QOF_SUCCESS; 00323 first = g_list_first (be->error_stack); 00324 qerr = (QofError*)first->data; 00325 if (!qerr) 00326 return QOF_FATAL; 00327 be->error_stack = 00328 g_list_remove (be->error_stack, qerr); 00329 #ifndef QOF_DISABLE_DEPRECATED 00330 set_previous_error (be); 00331 #endif 00332 return qerr->id; 00333 } 00334 00335 const gchar * 00336 qof_error_get_message (QofSession * session) 00337 { 00338 const gchar * msg; 00339 00340 g_return_val_if_fail (session, NULL); 00341 if (!session->backend) 00342 return session->error_message; 00343 msg = qof_error_get_message_be (session->backend); 00344 DEBUG (" msg_1=%s", msg); 00345 #ifndef QOF_DISABLE_DEPRECATED 00346 { 00347 QofError * qerr; 00348 00349 qerr = g_hash_table_lookup (error_table, 00350 GINT_TO_POINTER(session->backend->last_err)); 00351 if (qerr) 00352 { 00353 if (session->error_message) 00354 g_free (session->error_message); 00355 session->error_message = g_strdup(msg); 00356 session->last_err = qerr->id; 00357 } 00358 } 00359 #endif 00360 return msg; 00361 } 00362 00363 const gchar * 00364 qof_error_get_message_be (QofBackend * be) 00365 { 00366 QofError * qerr; 00367 GList * first; 00368 00369 g_return_val_if_fail (be, NULL); 00370 if (g_list_length (be->error_stack) == 0) 00371 { 00372 DEBUG (" empty error stack"); 00373 return NULL; 00374 } 00375 first = g_list_first (be->error_stack); 00376 qerr = (QofError*)first->data; 00377 if (!qerr) 00378 { 00379 DEBUG (" empty QofError value"); 00380 return NULL; 00381 } 00382 DEBUG (" qerr->message=%s", qerr->message); 00383 be->error_stack = 00384 g_list_remove (be->error_stack, qerr); 00385 #ifndef QOF_DISABLE_DEPRECATED 00386 be->error_msg = qerr->message; 00387 set_previous_error (be); 00388 #endif 00389 return qerr->message; 00390 }