1 /*!
2   \file lib/db/dbmi_base/error.c
3 
4   \brief DBMI Library (base) - error management
5 
6   (C) 1999-2011 by the GRASS Development Team
7 
8   This program is free software under the GNU General Public License
9   (>=v2). Read the file COPYING that comes with GRASS for details.
10 
11   \author Joel Jones (CERL/UIUC)
12   \author Upgraded to GRASS 5.7 by Radim Blazek
13   \author Doxygenized by Martin Landa <landa.martin gmail.com> (2011)
14 */
15 
16 #include <string.h>
17 #include <stdlib.h>
18 #include <errno.h>
19 #include <grass/dbmi.h>
20 #include <grass/glocale.h>
21 
22 static int err_flag = 0;
23 static int err_code = DB_OK;
24 static char *err_msg = 0;
25 static int auto_print_errors = 1;
26 static int auto_print_protocol_errors = 1;
27 static void (*user_print_function) (const char *);
28 
29 static char *who = NULL;
30 
31 /*!
32   \brief User defined error procedure
33 
34   \param f pointer to user-defined function
35 */
db_on_error(void (* f)(const char *))36 void db_on_error(void (*f) (const char *))
37 {
38     user_print_function = f;
39 }
40 
41 /*!
42   \brief Set 'who' for error messages
43 
44   \param me my name
45 */
db_set_error_who(const char * me)46 void db_set_error_who(const char *me)
47 {
48     if (who)
49 	db_free(who);
50     who = db_store(me);
51 }
52 
53 /*!
54   brief Get 'who' string
55 
56   \return pointer to string buffer
57   \return empty buffer if 'who' is not defined
58 */
db_get_error_who(void)59 const char *db_get_error_who(void)
60 {
61     return who ? who : "";
62 }
63 
64 /*!
65   \brief Report error message
66 
67   \param s error message (can be NULL)
68 */
db_error(const char * s)69 void db_error(const char *s)
70 {
71     if (s == NULL)
72 	s = _("<NULL error message>");
73     if (err_msg)
74 	db_free(err_msg);
75     err_msg = db_store(s);
76     err_flag = 1;
77     if (auto_print_errors)
78 	db_print_error();
79     err_code = DB_FAILED;
80 }
81 
82 /*!
83   \brief Report protocol error
84 */
db_protocol_error(void)85 void db_protocol_error(void)
86 {
87     int flag;
88 
89     flag = auto_print_errors;
90     auto_print_errors = auto_print_protocol_errors;
91     db_error(_("dbmi: Protocol error"));
92     auto_print_errors = flag;
93     err_code = DB_PROTOCOL_ERR;
94 }
95 
96 /*!
97   \brief Report system error
98 
99   \param s error message
100 */
db_syserror(const char * s)101 void db_syserror(const char *s)
102 {
103     char lead[1024];
104     char msg[1024];
105 
106 
107     err_flag = 0;
108     if (errno <= 0)
109 	return;
110 
111     *lead = 0;
112     if (who)
113 	sprintf(lead, "%s: ", who);
114 
115     if (errno > 0)
116 	sprintf(msg, "%s%s: %s", lead, strerror(errno), s);
117 
118     db_error(msg);
119 }
120 
121 /*!
122   \brief Get error code
123 
124   \return DB_OK if not defined
125  */
db_get_error_code(void)126 int db_get_error_code(void)
127 {
128     return err_flag ? err_code : DB_OK;
129 }
130 
131 /*!
132   \brief  Report memory error
133 */
db_memory_error(void)134 void db_memory_error(void)
135 {
136     db_error(_("dbmi: Out of Memory"));
137     err_code = DB_MEMORY_ERR;
138 }
139 
140 /*!
141   \brief Report 'not implemented' error
142 
143   \param name name of functionality
144 */
db_procedure_not_implemented(const char * name)145 void db_procedure_not_implemented(const char *name)
146 {
147     char msg[128];
148 
149     sprintf(msg, _("dbmi: %s() not implemented"), name);
150     db_error(msg);
151     err_code = DB_NOPROC;
152 }
153 
154 /*!
155   \brief Report no procedure error
156 
157   \param procnum procedure number
158 */
db_noproc_error(int procnum)159 void db_noproc_error(int procnum)
160 {
161     char msg[128];
162 
163     sprintf(msg, _("dbmi: Invalid procedure %d"), procnum);
164     db_error(msg);
165     err_code = DB_NOPROC;
166 }
167 
168 /*!
169   \brief Clear error status
170 */
db_clear_error(void)171 void db_clear_error(void)
172 {
173     err_flag = 0;
174     err_code = DB_OK;
175     errno = 0;			/* clearn system errno as well */
176 }
177 
178 /*!
179   \brief Print error
180 
181   If not defined, the error message is printed to stderr.
182 */
db_print_error(void)183 void db_print_error(void)
184 {
185     char lead[1024];
186 
187     if (!err_flag)
188 	return;
189 
190     *lead = 0;
191     if (who)
192 	sprintf(lead, "%s: ", who);
193 
194     if (user_print_function) {
195 	char buf[1024];
196 
197 	sprintf(buf, "%s%s\n", lead, err_msg);
198 	user_print_function(buf);
199     }
200     else
201 	fprintf(stderr, "%s%s\n", lead, err_msg);
202 }
203 
204 
205 static int debug_on = 0;
206 
207 /*!
208   \brief Turn on debugging
209 */
db_debug_on(void)210 void db_debug_on(void)
211 {
212     debug_on = 1;
213 }
214 
215 /*!
216   \brief Turn off debugging
217 */
db_debug_off(void)218 void db_debug_off(void)
219 {
220     debug_on = 0;
221 }
222 
223 /*!
224   \brief Print debug message
225 
226   \param s debug message
227 */
db_debug(const char * s)228 void db_debug(const char *s)
229 {
230     if (debug_on)
231 	fprintf(stderr, "debug(%s): %s\n", who ? who : "", s ? s : "<NULL>");
232 }
233 
234 /*!
235   \brief Get error message
236 
237   \return pointer to error message string
238 */
db_get_error_msg(void)239 const char *db_get_error_msg(void)
240 {
241     return err_flag ? err_msg : (const char *)NULL;
242 }
243 
244 /*!
245   \brief Toggles printing of DBMI error messages
246 
247   \param flag ?
248 */
db_auto_print_errors(int flag)249 void db_auto_print_errors(int flag)
250 {
251     auto_print_errors = flag;
252     auto_print_protocol_errors = flag;
253 }
254 
255 /*!
256   \brief Set auto print protocol error
257 
258   \param flag ?
259  */
db_auto_print_protocol_errors(int flag)260 void db_auto_print_protocol_errors(int flag)
261 {
262     auto_print_protocol_errors = flag;
263 }
264