Fri Mar 7 07:00:00 CET 2003
[asterisk/asterisk.git] / apps / app_db.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Database access functions
5  *
6  * Copyright (C) 1999, Mark Spencer
7  * Copyright (C) 2003, Jefferson Noxon
8  *
9  * Mark Spencer <markster@linux-support.net>
10  * Jefferson Noxon <jeff@debian.org>
11  *
12  * This program is free software, distributed under the terms of
13  * the GNU General Public License
14  */
15
16 #include <asterisk/options.h>
17 #include <asterisk/file.h>
18 #include <asterisk/logger.h>
19 #include <asterisk/channel.h>
20 #include <asterisk/pbx.h>
21 #include <asterisk/module.h>
22 #include <asterisk/pbx.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <string.h>
26 #include <stdlib.h>
27 #include <pthread.h>
28
29
30 static char *tdesc = "Database access functions for Asterisk extension logic";
31
32 static char *g_descrip =
33   "  DBget(varname=family/key): Retrieves a value from the Asterisk\n"
34   "database and stores it in the given variable.  Always returns 0.  If the\n"
35   "requested key is not found, jumps to priority n+101 if available.\n";
36
37 static char *p_descrip =
38   "  DBput(family/key=value): Stores the given value in the Asterisk\n"
39   "database.  Always returns 0.\n";
40
41 static char *d_descrip =
42   "  DBdel(family/key): Deletes a key from the Asterisk database.  Always\n"
43   "returns 0.\n";
44
45 static char *dt_descrip =
46   "  DBdeltree(family[/keytree]): Deletes a family or keytree from the Asterisk\n"
47   "database.  Always returns 0.\n";
48
49 static char *g_app = "DBget";
50 static char *p_app = "DBput";
51 static char *d_app = "DBdel";
52 static char *dt_app = "DBdeltree";
53
54 static char *g_synopsis = "Retrieve a value from the database";
55 static char *p_synopsis = "Store a value in the database";
56 static char *d_synopsis = "Delete a key from the database";
57 static char *dt_synopsis = "Delete a family or keytree from the database";
58
59 STANDARD_LOCAL_USER;
60
61 LOCAL_USER_DECL;
62
63
64 static int
65 deltree_exec (struct ast_channel *chan, void *data)
66 {
67   int arglen;
68   char *argv, *family, *keytree;
69
70   arglen = strlen (data);
71   argv = alloca (arglen + 1);
72   if (!argv)                    /* Why would this fail? */
73     {
74       ast_log (LOG_DEBUG, "Memory allocation failed\n");
75       return 0;
76     }
77   memcpy (argv, data, arglen + 1);
78
79   if (strchr (argv, '/'))
80     {
81       family = strsep (&argv, "/");
82       keytree = strsep (&argv, "\0");
83       if (!family || !keytree)
84         {
85           ast_log (LOG_DEBUG, "Ignoring; Syntax error in argument\n");
86           return 0;
87         }
88       if (!strlen (keytree))
89         keytree = 0;
90     }
91   else
92     {
93       family = argv;
94       keytree = 0;
95     }
96
97   if (option_verbose > 2)
98     if (keytree)
99       ast_verbose (VERBOSE_PREFIX_3 "DBdeltree: family=%s, keytree=%s\n",
100                    family, keytree);
101     else
102       ast_verbose (VERBOSE_PREFIX_3 "DBdeltree: family=%s\n", family);
103
104   if (ast_db_deltree (family, keytree))
105     {
106       if (option_verbose > 2)
107         ast_verbose (VERBOSE_PREFIX_3
108                      "DBdeltree: Error deleting key from database.\n");
109     }
110
111   return 0;
112 }
113
114
115 static int
116 del_exec (struct ast_channel *chan, void *data)
117 {
118   int arglen;
119   char *argv, *family, *key;
120
121   arglen = strlen (data);
122   argv = alloca (arglen + 1);
123   if (!argv)                    /* Why would this fail? */
124     {
125       ast_log (LOG_DEBUG, "Memory allocation failed\n");
126       return 0;
127     }
128   memcpy (argv, data, arglen + 1);
129
130   if (strchr (argv, '/'))
131     {
132       family = strsep (&argv, "/");
133       key = strsep (&argv, "\0");
134       if (!family || !key)
135         {
136           ast_log (LOG_DEBUG, "Ignoring; Syntax error in argument\n");
137           return 0;
138         }
139       if (option_verbose > 2)
140         ast_verbose (VERBOSE_PREFIX_3
141                      "DBdel: family=%s, key=%s\n", family, key);
142       if (ast_db_del (family, key))
143         {
144           if (option_verbose > 2)
145             ast_verbose (VERBOSE_PREFIX_3
146                          "DBdel: Error deleting key from database.\n");
147         }
148     }
149   else
150     {
151       ast_log (LOG_DEBUG, "Ignoring, no parameters\n");
152     }
153
154   return 0;
155 }
156
157 static int
158 put_exec (struct ast_channel *chan, void *data)
159 {
160   int arglen;
161   char *argv, *value, *family, *key;
162
163   arglen = strlen (data);
164   argv = alloca (arglen + 1);
165   if (!argv)                    /* Why would this fail? */
166     {
167       ast_log (LOG_DEBUG, "Memory allocation failed\n");
168       return 0;
169     }
170   memcpy (argv, data, arglen + 1);
171
172   if (strchr (argv, '/') && strchr (argv, '='))
173     {
174       family = strsep (&argv, "/");
175       key = strsep (&argv, "=");
176       value = strsep (&argv, "\0");
177       if (!value || !family || !key)
178         {
179           ast_log (LOG_DEBUG, "Ignoring; Syntax error in argument\n");
180           return 0;
181         }
182       if (option_verbose > 2)
183         ast_verbose (VERBOSE_PREFIX_3
184                      "DBput: family=%s, key=%s, value=%s\n", family, key,
185                      value);
186       if (ast_db_put (family, key, value))
187         {
188           if (option_verbose > 2)
189             ast_verbose (VERBOSE_PREFIX_3
190                          "DBput: Error writing value to database.\n");
191         }
192
193     }
194   else
195     {
196       ast_log (LOG_DEBUG, "Ignoring, no parameters\n");
197     }
198
199   return 0;
200 }
201
202 static int
203 get_exec (struct ast_channel *chan, void *data)
204 {
205   int arglen;
206   char *argv, *varname, *family, *key;
207   char dbresult[256];
208
209   arglen = strlen (data);
210   argv = alloca (arglen + 1);
211   if (!argv)                    /* Why would this fail? */
212     {
213       ast_log (LOG_DEBUG, "Memory allocation failed\n");
214       return 0;
215     }
216   memcpy (argv, data, arglen + 1);
217
218   if (strchr (argv, '=') && strchr (argv, '/'))
219     {
220       varname = strsep (&argv, "=");
221       family = strsep (&argv, "/");
222       key = strsep (&argv, "\0");
223       if (!varname || !family || !key)
224         {
225           ast_log (LOG_DEBUG, "Ignoring; Syntax error in argument\n");
226           return 0;
227         }
228       if (option_verbose > 2)
229         ast_verbose (VERBOSE_PREFIX_3
230                      "DBget: varname=%s, family=%s, key=%s\n", varname,
231                      family, key);
232       if (!ast_db_get (family, key, dbresult, sizeof (dbresult) - 1))
233         {
234           pbx_builtin_setvar_helper (chan, varname, dbresult);
235           if (option_verbose > 2)
236             ast_verbose (VERBOSE_PREFIX_3
237                          "DBget: set variable %s to %s\n", varname, dbresult);
238         }
239       else
240         {
241           if (option_verbose > 2)
242             ast_verbose (VERBOSE_PREFIX_3
243                          "DBget: Value not found in database.\n");
244           /* Send the call to n+101 priority, where n is the current priority */
245           if (ast_exists_extension
246               (chan, chan->context, chan->exten, chan->priority + 101,
247                chan->callerid))
248             chan->priority += 100;
249         }
250
251     }
252   else
253     {
254       ast_log (LOG_DEBUG, "Ignoring, no parameters\n");
255     }
256
257   return 0;
258 }
259
260 int
261 unload_module (void)
262 {
263   int retval;
264
265   STANDARD_HANGUP_LOCALUSERS;
266   retval = ast_unregister_application (dt_app);
267   retval |= ast_unregister_application (d_app);
268   retval |= ast_unregister_application (p_app);
269   retval |= ast_unregister_application (g_app);
270
271   return retval;
272 }
273
274 int
275 load_module (void)
276 {
277   int retval;
278
279   retval = ast_register_application (g_app, get_exec, g_synopsis, g_descrip);
280   if (!retval)
281     retval =
282       ast_register_application (p_app, put_exec, p_synopsis, p_descrip);
283   if (!retval)
284     retval =
285       ast_register_application (d_app, del_exec, d_synopsis, d_descrip);
286   if (!retval)
287     retval =
288       ast_register_application (dt_app, deltree_exec, dt_synopsis,
289                                 dt_descrip);
290
291   return retval;
292 }
293
294 char *
295 description (void)
296 {
297   return tdesc;
298 }
299
300 int
301 usecount (void)
302 {
303   int res;
304   STANDARD_USECOUNT (res);
305   return res;
306 }
307
308 char *
309 key ()
310 {
311   return ASTERISK_GPL_KEY;
312 }