error.c 3.7 KB

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