00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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 }
00048
00049 static void
00050 qof_error_free (QofError * error)
00051 {
00052 if (error->qt)
00053 qof_time_free (error->qt);
00054 g_free (error->message);
00055 g_free (error);
00056 }
00057
00058
00059 static void
00060 clear_table (gpointer key, gpointer value, gpointer user_data)
00061 {
00062 qof_error_free ((QofError*)value);
00063 }
00064
00065 void
00066 qof_error_close (void)
00067 {
00068 g_hash_table_foreach (error_table, clear_table, NULL);
00069 g_hash_table_destroy (error_table);
00070 }
00071
00072 QofErrorId
00073 qof_error_register (const gchar * err_message, gboolean use_file)
00074 {
00075 QofError * qerr;
00076
00077 ENTER (" ");
00078 qerr = g_new0 (QofError, 1);
00079 count++;
00080 qerr->id = count;
00081 if (use_file)
00082 {
00083 gchar * spec;
00084
00085 spec = g_strrstr (err_message, "%s");
00086 use_file = (spec) ? TRUE : FALSE;
00087 }
00088 qerr->use_file = use_file;
00089 qerr->message = g_strdup (err_message);
00090 g_hash_table_insert (error_table, GINT_TO_POINTER(qerr->id), qerr);
00091 LEAVE (" ");
00092 return qerr->id;
00093 }
00094
00095 void
00096 qof_error_unregister (QofErrorId id)
00097 {
00098 QofError * qerr;
00099 gboolean result;
00100
00101 ENTER (" ");
00102 qerr = g_hash_table_lookup (error_table, GINT_TO_POINTER(id));
00103 qof_error_free (qerr);
00104 result = g_hash_table_remove (error_table,
00105 GINT_TO_POINTER(id));
00106 if (!result)
00107 LEAVE ("unable to remove registered error.");
00108 LEAVE (" ok.");
00109 }
00110
00111 void
00112 qof_error_set (QofSession * session, QofErrorId error)
00113 {
00114 QofError * qerr, * set;
00115
00116 g_return_if_fail (session);
00117 if (error == QOF_SUCCESS)
00118 {
00119 DEBUG (" passed success, not error.");
00120 return;
00121 }
00122 qerr = g_hash_table_lookup (error_table, GINT_TO_POINTER(error));
00123 if (!qerr)
00124 {
00125 DEBUG (" failed hash table lookup");
00126 return;
00127 }
00128 session->last_err = error;
00129 if (session->error_message)
00130 g_free (session->error_message);
00131 if (qerr->use_file)
00132 session->error_message = g_strdup_printf (qerr->message,
00133 qof_session_get_url (session));
00134 else
00135 session->error_message = g_strdup (qerr->message);
00136 if (!session->backend)
00137 return;
00138
00139 set = g_new0 (QofError, 1);
00140 if (qerr->use_file)
00141 set->message = g_strdup_printf (qerr->message,
00142 qof_session_get_file_path (session));
00143 else
00144 set->message = g_strdup (qerr->message);
00145 set->id = error;
00146 set->qt = qof_time_get_current ();
00147 session->backend->error_stack =
00148 g_list_prepend (session->backend->error_stack, set);
00149 }
00150
00151 void
00152 qof_error_set_be (QofBackend * be, QofErrorId error)
00153 {
00154 QofError * qerr, * set;
00155
00156 g_return_if_fail (be);
00157 if (error == QOF_SUCCESS)
00158 return;
00159 qerr = g_hash_table_lookup (error_table, GINT_TO_POINTER(error));
00160 if (!qerr)
00161 return;
00162
00163 set = g_new0 (QofError, 1);
00164 if (qerr->use_file)
00165 set->message = g_strdup_printf (qerr->message, be->fullpath);
00166 else
00167 set->message = g_strdup (qerr->message);
00168 set->id = error;
00169 set->qt = qof_time_get_current ();
00170 be->error_stack = g_list_prepend (be->error_stack,
00171 set);
00172 }
00173
00174
00175 static void
00176 clear_list (gpointer value, gpointer user_data)
00177 {
00178 qof_error_free ((QofError*)value);
00179 }
00180
00181 void
00182 qof_error_clear (QofSession * session)
00183 {
00184 g_return_if_fail (session);
00185 if (!session->backend)
00186 return;
00187 g_list_foreach (session->backend->error_stack, clear_list, NULL);
00188 g_list_free (session->backend->error_stack);
00189 session->backend->error_stack = NULL;
00190 if (session->error_message)
00191 g_free (session->error_message);
00192 session->error_message = NULL;
00193 session->last_err = QOF_SUCCESS;
00194 }
00195
00196 QofErrorId
00197 qof_error_check (QofSession * session)
00198 {
00199 g_return_val_if_fail (session, QOF_FATAL);
00200 return qof_error_check_be (session->backend);
00201 }
00202
00203 QofErrorId
00204 qof_error_check_be (QofBackend * be)
00205 {
00206 QofError * qerr;
00207 GList * first;
00208
00209 if (!be)
00210 return QOF_FATAL;
00211 if (g_list_length (be->error_stack) == 0)
00212 return QOF_SUCCESS;
00213 first = g_list_first (be->error_stack);
00214 qerr = (QofError*)first->data;
00215 if (!qerr)
00216 return QOF_FATAL;
00217 return qerr->id;
00218 }
00219
00220 QofTime *
00221 qof_error_get_time_be (QofBackend * be)
00222 {
00223 QofError * qerr;
00224 GList * first;
00225
00226 if (g_list_length(be->error_stack) == 0)
00227 return NULL;
00228 first = g_list_first (be->error_stack);
00229 qerr = (QofError*)first->data;
00230 return qerr->qt;
00231 }
00232
00233 QofTime *
00234 qof_error_get_time (QofSession * session)
00235 {
00236 return qof_error_get_time_be (session->backend);
00237 }
00238
00239 QofErrorId
00240 qof_error_get_id (QofSession * session)
00241 {
00242 QofErrorId id;
00243
00244 g_return_val_if_fail (session, QOF_FATAL);
00245 id = QOF_SUCCESS;
00246 id = qof_error_get_id_be (session->backend);
00247 {
00248 QofError * qerr;
00249
00250 qerr = g_hash_table_lookup (error_table,
00251 GINT_TO_POINTER(id));
00252 if (!qerr)
00253 {
00254 DEBUG (" empty QofError value");
00255 return QOF_FATAL;
00256 }
00257 if (session->error_message)
00258 g_free (session->error_message);
00259 session->error_message = qerr->message;
00260 session->last_err = id;
00261 }
00262 return id;
00263 }
00264
00265 QofErrorId
00266 qof_error_get_id_be (QofBackend * be)
00267 {
00268 QofError * qerr;
00269 GList * first;
00270
00271 if (!be)
00272 return QOF_FATAL;
00273 if (g_list_length (be->error_stack) == 0)
00274 return QOF_SUCCESS;
00275 first = g_list_first (be->error_stack);
00276 qerr = (QofError*)first->data;
00277 if (!qerr)
00278 return QOF_FATAL;
00279 be->error_stack =
00280 g_list_remove (be->error_stack, qerr);
00281 return qerr->id;
00282 }
00283
00284 const gchar *
00285 qof_error_get_message (QofSession * session)
00286 {
00287 const gchar * msg;
00288
00289 g_return_val_if_fail (session, NULL);
00290 if (!session->backend)
00291 return session->error_message;
00292 msg = qof_error_get_message_be (session->backend);
00293 DEBUG (" msg_1=%s", msg);
00294 return msg;
00295 }
00296
00297 const gchar *
00298 qof_error_get_message_be (QofBackend * be)
00299 {
00300 QofError * qerr;
00301 GList * first;
00302
00303 g_return_val_if_fail (be, NULL);
00304 if (g_list_length (be->error_stack) == 0)
00305 {
00306 DEBUG (" empty error stack");
00307 return NULL;
00308 }
00309 first = g_list_first (be->error_stack);
00310 qerr = (QofError*)first->data;
00311 if (!qerr)
00312 {
00313 DEBUG (" empty QofError value");
00314 return NULL;
00315 }
00316 DEBUG (" qerr->message=%s", qerr->message);
00317 be->error_stack =
00318 g_list_remove (be->error_stack, qerr);
00319 return qerr->message;
00320 }