error.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <grass/dbmi.h>
  4. #include <errno.h>
  5. static int err_flag = 0;
  6. static int err_code = DB_OK;
  7. static char *err_msg = 0;
  8. static int auto_print_errors = 1;
  9. static int auto_print_protocol_errors = 1;
  10. static void (*user_print_function)(const char *);
  11. static char *who = NULL;
  12. /*!
  13. \fn
  14. \brief
  15. \return
  16. \param
  17. */
  18. void
  19. db_on_error (void (*f)(const char *))
  20. {
  21. user_print_function = f;
  22. }
  23. /*!
  24. \fn
  25. \brief
  26. \return
  27. \param
  28. */
  29. void
  30. db_set_error_who (const char *me)
  31. {
  32. if (who) free(who);
  33. who = db_store(me);
  34. }
  35. /*!
  36. \fn
  37. \brief
  38. \return
  39. \param
  40. */
  41. const char *
  42. db_get_error_who(void)
  43. {
  44. return who?who:"";
  45. }
  46. /*!
  47. \fn
  48. \brief
  49. \return
  50. \param
  51. */
  52. void
  53. db_error (const char *s)
  54. {
  55. if (s == NULL)
  56. s = "<NULL error message>";
  57. if(err_msg)
  58. free(err_msg);
  59. err_msg = db_store(s);
  60. err_flag = 1;
  61. if (auto_print_errors)
  62. db_print_error();
  63. err_code = DB_FAILED;
  64. }
  65. /*!
  66. \fn
  67. \brief
  68. \return
  69. \param
  70. */
  71. void
  72. db_protocol_error(void)
  73. {
  74. int flag;
  75. flag = auto_print_errors;
  76. auto_print_errors = auto_print_protocol_errors;
  77. db_error ("dbmi: Protocol error");
  78. auto_print_errors = flag;
  79. err_code = DB_PROTOCOL_ERR;
  80. }
  81. /*!
  82. \fn
  83. \brief
  84. \return
  85. \param
  86. */
  87. void
  88. db_syserror (const char *s)
  89. {
  90. char lead[1024];
  91. char msg[1024];
  92. err_flag = 0;
  93. if (errno <= 0) return;
  94. *lead = 0;
  95. if (who)
  96. sprintf (lead, "%s: ", who);
  97. if (errno > 0)
  98. sprintf (msg, "%s%s: %s", lead, strerror(errno), s);
  99. db_error (msg);
  100. }
  101. /*!
  102. \fn
  103. \brief
  104. \return
  105. \param
  106. */
  107. int
  108. db_get_error_code(void)
  109. {
  110. return err_flag ? err_code : DB_OK;
  111. }
  112. /*!
  113. \fn
  114. \brief
  115. \return
  116. \param
  117. */
  118. void
  119. db_memory_error(void)
  120. {
  121. db_error ("dbmi: Out of Memory");
  122. err_code = DB_MEMORY_ERR;
  123. }
  124. /*!
  125. \fn
  126. \brief
  127. \return
  128. \param
  129. */
  130. void
  131. db_procedure_not_implemented (const char *name)
  132. {
  133. char msg[128];
  134. sprintf (msg, "dbmi: %s() not implemented", name);
  135. db_error (msg);
  136. err_code = DB_NOPROC;
  137. }
  138. /*!
  139. \fn
  140. \brief
  141. \return
  142. \param
  143. */
  144. void
  145. db_noproc_error(procnum)
  146. {
  147. char msg[128];
  148. sprintf (msg, "dbmi: Invalid procedure %d", procnum);
  149. db_error (msg);
  150. err_code = DB_NOPROC;
  151. }
  152. /*!
  153. \fn
  154. \brief
  155. \return
  156. \param
  157. */
  158. void
  159. db_clear_error(void)
  160. {
  161. err_flag = 0;
  162. err_code = DB_OK;
  163. errno = 0; /* clearn system errno as well */
  164. }
  165. /*!
  166. \fn
  167. \brief
  168. \return
  169. \param
  170. */
  171. void
  172. db_print_error(void)
  173. {
  174. char lead[1024];
  175. if(!err_flag) return;
  176. *lead = 0;
  177. if (who)
  178. sprintf (lead, "%s: ", who);
  179. if (user_print_function) {
  180. char buf[1024];
  181. sprintf(buf, "%s%s\n", lead, err_msg);
  182. user_print_function(buf);
  183. }
  184. else
  185. fprintf (stderr, "%s%s\n", lead, err_msg);
  186. }
  187. static int debug_on = 0;
  188. /*!
  189. \fn
  190. \brief
  191. \return
  192. \param
  193. */
  194. void
  195. db_debug_on(void)
  196. {
  197. debug_on = 1;
  198. }
  199. /*!
  200. \fn
  201. \brief
  202. \return
  203. \param
  204. */
  205. void
  206. db_debug_off(void)
  207. {
  208. debug_on = 0;
  209. }
  210. /*!
  211. \fn
  212. \brief
  213. \return
  214. \param
  215. */
  216. void
  217. db_debug (const char *s)
  218. {
  219. if (debug_on)
  220. fprintf (stderr, "debug(%s): %s\n", who?who:"", s?s:"<NULL>");
  221. }
  222. /*!
  223. \fn
  224. \brief
  225. \return
  226. \param
  227. */
  228. const char *
  229. db_get_error_msg(void)
  230. {
  231. return err_flag ? err_msg : (const char *)NULL;
  232. }
  233. /*!
  234. \fn void db_auto_print_errors (flag)
  235. \brief toggles printing of DBMI error messages
  236. \return void
  237. \param flag
  238. */
  239. void
  240. db_auto_print_errors (int flag)
  241. {
  242. auto_print_errors = flag;
  243. auto_print_protocol_errors = flag;
  244. }
  245. /*!
  246. \fn
  247. \brief
  248. \return
  249. \param
  250. */
  251. void
  252. db_auto_print_protocol_errors (int flag)
  253. {
  254. auto_print_protocol_errors = flag;
  255. }