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