efce117c883b41cdc49428cf550da17c98653935
[asterisk/asterisk.git] / funcs / func_db.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2005, Russell Bryant <russelb@clemson.edu> 
5  *
6  * func_db.c adapted from the old app_db.c, copyright by the following people 
7  * Copyright (C) 2005, Mark Spencer <markster@digium.com>
8  * Copyright (C) 2003, Jefferson Noxon <jeff@debian.org>
9  *
10  * See http://www.asterisk.org for more information about
11  * the Asterisk project. Please do not directly contact
12  * any of the maintainers of this project for assistance;
13  * the project provides a web site, mailing lists and IRC
14  * channels for your use.
15  *
16  * This program is free software, distributed under the terms of
17  * the GNU General Public License Version 2. See the LICENSE file
18  * at the top of the source tree.
19  */
20
21 /*! \file
22  *
23  * \brief Functions for interaction with the Asterisk database
24  *
25  * \author Russell Bryant <russelb@clemson.edu>
26  */
27
28 #include <stdlib.h>
29 #include <string.h>
30 #include <sys/types.h>
31 #include <regex.h>
32
33 #include "asterisk.h"
34
35 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
36
37 #include "asterisk/module.h"
38 #include "asterisk/channel.h"
39 #include "asterisk/pbx.h"
40 #include "asterisk/logger.h"
41 #include "asterisk/options.h"
42 #include "asterisk/utils.h"
43 #include "asterisk/app.h"
44 #include "asterisk/astdb.h"
45
46 static char *function_db_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
47 {
48         char *parse;    
49         AST_DECLARE_APP_ARGS(args,
50                 AST_APP_ARG(family);
51                 AST_APP_ARG(key);
52         );
53
54         if (ast_strlen_zero(data)) {
55                 ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)\n");
56                 buf[0] = '\0';
57                 return buf;
58         }
59
60         parse = ast_strdupa(data);
61         if (!parse) {
62                 ast_log(LOG_ERROR, "Out of memory!\n");
63                 buf[0] = '\0';
64                 return buf;
65         }
66                 
67         AST_NONSTANDARD_APP_ARGS(args, parse, '/');
68         
69         if (args.argc < 2) {
70                 ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)\n");
71                 buf[0] = '\0';
72                 return buf;
73         }
74
75         if (ast_db_get(args.family, args.key, buf, len-1)) {
76                 ast_log(LOG_DEBUG, "DB: %s/%s not found in database.\n", args.family, args.key);
77         } else
78                 pbx_builtin_setvar_helper(chan, "DB_RESULT", buf);
79
80         
81         return buf;
82 }
83
84 static void function_db_write(struct ast_channel *chan, char *cmd, char *data, const char *value) 
85 {
86         char *parse;    
87         AST_DECLARE_APP_ARGS(args,
88                 AST_APP_ARG(family);
89                 AST_APP_ARG(key);
90         );
91
92         if (ast_strlen_zero(data)) {
93                 ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)=<value>\n");
94                 return;
95         }
96
97         parse = ast_strdupa(data);
98         if (!parse) { 
99                 ast_log(LOG_ERROR, "Out of memory!\n"); 
100                 return;
101         }
102
103         AST_NONSTANDARD_APP_ARGS(args, parse, '/');
104
105         if (args.argc < 2) {
106                 ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)=value\n");
107                 return;
108         }
109
110         if (ast_db_put(args.family, args.key, (char*)value)) {
111                 ast_log(LOG_WARNING, "DB: Error writing value to database.\n");
112         }
113 }
114
115 static struct ast_custom_function db_function = {
116         .name = "DB",
117         .synopsis = "Read or Write from/to the Asterisk database",
118         .syntax = "DB(<family>/<key>)",
119         .desc = "This function will read or write a value from/to the Asterisk database.\n"
120                 "DB(...) will read a value from the database, while DB(...)=value\n"
121                 "will write a value to the database.  On a read, this function\n"
122                 "returns the value from the datase, or NULL if it does not exist.\n"
123                 "On a write, this function will always return NULL.  Reading a database value\n"
124                 "will also set the variable DB_RESULT.\n",
125         .read = function_db_read,
126         .write = function_db_write,
127 };
128
129 static char *function_db_exists(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
130 {
131         char *parse;    
132         AST_DECLARE_APP_ARGS(args,
133                 AST_APP_ARG(family);
134                 AST_APP_ARG(key);
135         );
136
137         if (ast_strlen_zero(data)) {
138                 ast_log(LOG_WARNING, "DB_EXISTS requires an argument, DB(<family>/<key>)\n");
139                 buf[0] = '\0';
140                 return buf;
141         }
142
143         parse = ast_strdupa(data);
144         if (!parse) {
145                 ast_log(LOG_ERROR, "Out of memory!\n");
146                 buf[0] = '\0';
147                 return buf;
148         }
149                 
150         AST_NONSTANDARD_APP_ARGS(args, parse, '/');
151         
152         if (args.argc < 2) {
153                 ast_log(LOG_WARNING, "DB_EXISTS requires an argument, DB(<family>/<key>)\n");
154                 buf[0] = '\0';
155                 return buf;
156         }
157
158         if (ast_db_get(args.family, args.key, buf, len-1))
159                 ast_copy_string(buf, "0", len); 
160         else {
161                 pbx_builtin_setvar_helper(chan, "DB_RESULT", buf);
162                 ast_copy_string(buf, "1", len);
163         }
164         
165         return buf;
166 }
167
168 static struct ast_custom_function db_exists_function = {
169         .name = "DB_EXISTS",
170         .synopsis = "Check to see if a key exists in the Asterisk database",
171         .syntax = "DB_EXISTS(<family>/<key>)",
172         .desc = "This function will check to see if a key exists in the Asterisk\n"
173                 "database. If it exists, the function will return \"1\". If not,\n"
174                 "it will return \"0\".  Checking for existence of a database key will\n"
175                 "also set the variable DB_RESULT to the key's value if it exists.\n",
176         .read = function_db_exists,
177 };
178
179 static char *tdesc = "Database (astdb) related dialplan functions";
180
181 int unload_module(void)
182 {
183         int res = 0;
184         
185         res |= ast_custom_function_unregister(&db_function);
186         res |= ast_custom_function_unregister(&db_exists_function);
187
188         return res;
189 }
190
191 int load_module(void)
192 {
193         int res = 0;
194         
195         res |= ast_custom_function_register(&db_function);
196         res |= ast_custom_function_register(&db_exists_function);
197
198         return res;
199 }
200
201 char *description(void)
202 {
203        return tdesc;
204 }
205
206 int usecount(void)
207 {
208         return 0;
209 }
210
211 char *key()
212 {
213        return ASTERISK_GPL_KEY;
214 }
215