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