Fixes from bkw_. Formatting in app_db.c and handle start right in cdr_pgsql.c
[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/astdb.h>
24 #include <asterisk/lock.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <string.h>
28 #include <stdlib.h>
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 static int deltree_exec (struct ast_channel *chan, void *data)
64 {
65         int arglen;
66         char *argv, *family, *keytree;
67
68         arglen = strlen (data);
69         argv = alloca (arglen + 1);
70         if (!argv) {    /* Why would this fail? */
71                 ast_log (LOG_DEBUG, "Memory allocation failed\n");
72                 return 0;
73         }
74         memcpy (argv, data, arglen + 1);
75
76         if (strchr (argv, '/')) {
77                 family = strsep (&argv, "/");
78                 keytree = strsep (&argv, "\0");
79                         if (!family || !keytree) {
80                                 ast_log (LOG_DEBUG, "Ignoring; Syntax error in argument\n");
81                                 return 0;
82                         }
83                 if (!strlen (keytree))
84                         keytree = 0;
85         } else {
86                 family = argv;
87                 keytree = 0;
88         }
89
90         if (option_verbose > 2) {
91                 if (keytree)
92                         ast_verbose (VERBOSE_PREFIX_3 "DBdeltree: family=%s, keytree=%s\n", family, keytree);
93                 else
94                         ast_verbose (VERBOSE_PREFIX_3 "DBdeltree: family=%s\n", family);
95         }
96
97         if (ast_db_deltree (family, keytree)) {
98                 if (option_verbose > 2)
99                         ast_verbose (VERBOSE_PREFIX_3 "DBdeltree: Error deleting key from database.\n");
100         }
101
102         return 0;
103 }
104
105 static int del_exec (struct ast_channel *chan, void *data)
106 {
107         int arglen;
108         char *argv, *family, *key;
109
110         arglen = strlen (data);
111         argv = alloca (arglen + 1);
112         if (!argv) {    /* Why would this fail? */
113                 ast_log (LOG_DEBUG, "Memory allocation failed\n");
114                 return 0;
115         }
116         memcpy (argv, data, arglen + 1);
117
118         if (strchr (argv, '/')) {
119                 family = strsep (&argv, "/");
120                 key = strsep (&argv, "\0");
121                 if (!family || !key) {
122                         ast_log (LOG_DEBUG, "Ignoring; Syntax error in argument\n");
123                         return 0;
124                 }
125                 if (option_verbose > 2)
126                         ast_verbose (VERBOSE_PREFIX_3 "DBdel: family=%s, key=%s\n", family, key);
127                 if (ast_db_del (family, key)) {
128                         if (option_verbose > 2)
129                                 ast_verbose (VERBOSE_PREFIX_3 "DBdel: Error deleting key from database.\n");
130                 }
131         } else {
132                 ast_log (LOG_DEBUG, "Ignoring, no parameters\n");
133         }
134         return 0;
135 }
136
137 static int put_exec (struct ast_channel *chan, void *data)
138 {
139         int arglen;
140         char *argv, *value, *family, *key;
141
142         arglen = strlen (data);
143         argv = alloca (arglen + 1);
144         if (!argv) {    /* Why would this fail? */
145                 ast_log (LOG_DEBUG, "Memory allocation failed\n");
146                 return 0;
147         }
148         memcpy (argv, data, arglen + 1);
149
150         if (strchr (argv, '/') && strchr (argv, '=')) {
151                 family = strsep (&argv, "/");
152                 key = strsep (&argv, "=");
153                 value = strsep (&argv, "\0");
154                 if (!value || !family || !key) {
155                         ast_log (LOG_DEBUG, "Ignoring; Syntax error in argument\n");
156                         return 0;
157                 }
158                 if (option_verbose > 2)
159                         ast_verbose (VERBOSE_PREFIX_3 "DBput: family=%s, key=%s, value=%s\n", family, key, value);
160                 if (ast_db_put (family, key, value)) {
161                         if (option_verbose > 2)
162                                 ast_verbose (VERBOSE_PREFIX_3 "DBput: Error writing value to database.\n");
163                 }
164
165         } else  {
166                 ast_log (LOG_DEBUG, "Ignoring, no parameters\n");
167         }
168         return 0;
169 }
170
171 static int get_exec (struct ast_channel *chan, void *data)
172 {
173         int arglen;
174         char *argv, *varname, *family, *key;
175         char dbresult[256];
176
177         arglen = strlen (data);
178         argv = alloca (arglen + 1);
179         if (!argv) {    /* Why would this fail? */
180                 ast_log (LOG_DEBUG, "Memory allocation failed\n");
181                 return 0;
182         }
183         memcpy (argv, data, arglen + 1);
184
185         if (strchr (argv, '=') && strchr (argv, '/')) {
186                 varname = strsep (&argv, "=");
187                 family = strsep (&argv, "/");
188                 key = strsep (&argv, "\0");
189                 if (!varname || !family || !key) {
190                         ast_log (LOG_DEBUG, "Ignoring; Syntax error in argument\n");
191                         return 0;
192                 }
193                 if (option_verbose > 2)
194                         ast_verbose (VERBOSE_PREFIX_3 "DBget: varname=%s, family=%s, key=%s\n", varname, family, key);
195                 if (!ast_db_get (family, key, dbresult, sizeof (dbresult) - 1)) {
196                         pbx_builtin_setvar_helper (chan, varname, dbresult);
197                         if (option_verbose > 2)
198                                 ast_verbose (VERBOSE_PREFIX_3 "DBget: set variable %s to %s\n", varname, dbresult);
199                 } else {
200                         if (option_verbose > 2)
201                         ast_verbose (VERBOSE_PREFIX_3 "DBget: Value not found in database.\n");
202                         /* Send the call to n+101 priority, where n is the current priority */
203                         if (ast_exists_extension (chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
204                                 chan->priority += 100;
205                 }
206
207         } else {
208                 ast_log (LOG_DEBUG, "Ignoring, no parameters\n");
209         }
210         return 0;
211 }
212
213 int unload_module (void)
214 {
215         int retval;
216
217         STANDARD_HANGUP_LOCALUSERS;
218         retval = ast_unregister_application (dt_app);
219         retval |= ast_unregister_application (d_app);
220         retval |= ast_unregister_application (p_app);
221         retval |= ast_unregister_application (g_app);
222
223         return retval;
224 }
225
226 int load_module (void)
227 {
228         int retval;
229
230         retval = ast_register_application (g_app, get_exec, g_synopsis, g_descrip);
231         if (!retval)
232                 retval = ast_register_application (p_app, put_exec, p_synopsis, p_descrip);
233         if (!retval)
234                 retval = ast_register_application (d_app, del_exec, d_synopsis, d_descrip);
235         if (!retval)
236                 retval = ast_register_application (dt_app, deltree_exec, dt_synopsis, dt_descrip);
237         return retval;
238 }
239
240 char *description (void)
241 {
242         return tdesc;
243 }
244
245 int usecount (void)
246 {
247         int res;
248         STANDARD_USECOUNT (res);
249         return res;
250 }
251
252 char *key ()
253 {
254         return ASTERISK_GPL_KEY;
255 }