d_error.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*!
  2. \file lib/db/dbmi_driver/d_error.c
  3. \brief DBMI Library (driver) - error reporting
  4. Taken from DB drivers.
  5. (C) 1999-2008, 2012 by the GRASS Development Team
  6. This program is free software under the GNU General Public
  7. License (>=v2). Read the file COPYING that comes with GRASS
  8. for details.
  9. \author Joel Jones (CERL/UIUC)
  10. \author Radim Blazek
  11. \author Adopted for DBMI by Martin Landa <landa.martin@gmail.com>
  12. */
  13. #include <string.h>
  14. #include <grass/dbmi.h>
  15. #include <grass/glocale.h>
  16. /* initialize the global struct */
  17. struct error_state {
  18. char *driver_name;
  19. dbString *errMsg;
  20. };
  21. static struct error_state state;
  22. static struct error_state *st = &state;
  23. static void init()
  24. {
  25. db_set_string(st->errMsg, "");
  26. db_d_append_error(_("DBMI-%s driver error:"), st->driver_name);
  27. db_append_string(st->errMsg, "\n");
  28. }
  29. /*!
  30. \brief Init error message for DB driver
  31. Initialize prefix
  32. \param name driver name (eg. "SQLite"))
  33. */
  34. void db_d_init_error(const char *name)
  35. {
  36. if (!st->errMsg) {
  37. st->errMsg = (dbString *) G_malloc(sizeof(dbString));
  38. db_init_string(st->errMsg);
  39. }
  40. G_debug(1, "db_d_init_error(): %s", name);
  41. st->driver_name = G_malloc(strlen(name) + 1);
  42. strcpy(st->driver_name, name);
  43. init();
  44. }
  45. /*!
  46. \brief Append error message for DB driver
  47. \param fmt formatted message
  48. */
  49. void db_d_append_error(const char *fmt, ...)
  50. {
  51. FILE *fp = NULL;
  52. char *work = NULL;
  53. int count = 0;
  54. va_list ap;
  55. va_start(ap, fmt);
  56. if ((fp = tmpfile())) {
  57. count = vfprintf(fp, fmt, ap);
  58. if (count >= 0 && (work = G_calloc(count + 1, 1))) {
  59. rewind(fp);
  60. fread(work, 1, count, fp);
  61. db_append_string(st->errMsg, work);
  62. G_free(work);
  63. }
  64. fclose(fp);
  65. }
  66. va_end(ap);
  67. }
  68. /*!
  69. \brief Report error message for DB driver
  70. */
  71. void db_d_report_error(void)
  72. {
  73. db_append_string(st->errMsg, "\n");
  74. db_error(db_get_string(st->errMsg));
  75. init();
  76. }