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