5a95ef7cb32ccee6b6051315e764e6f9bf87f959
[asterisk/asterisk.git] / funcs / func_db.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Functions for interaction with the Asterisk database
5  * 
6  * Copyright (C) 2005, Russell Bryant <russelb@clemson.edu> 
7  *
8  * func_db.c adapted from the old app_db.c, copyright by the following people 
9  * Copyright (C) 2005, Mark Spencer <markster@digium.com>
10  * Copyright (C) 2003, 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 <stdlib.h>
17 #include <string.h>
18 #include <sys/types.h>
19 #include <regex.h>
20
21 #include "asterisk/channel.h"
22 #include "asterisk/pbx.h"
23 #include "asterisk/logger.h"
24 #include "asterisk/options.h"
25 #include "asterisk/utils.h"
26 #include "asterisk/app.h"
27 #include "asterisk/astdb.h"
28
29 static char *function_db_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
30 {
31         int argc;       
32         char *args;
33         char *argv[2];
34         char *family;
35         char *key;
36
37         if (!data || ast_strlen_zero(data)) {
38                 ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)\n");
39                 return buf;
40         }
41
42         args = ast_strdupa(data);
43         argc = ast_separate_app_args(args, '/', argv, sizeof(argv) / sizeof(argv[0]));
44         
45         if (argc > 1) {
46                 family = argv[0];
47                 key = argv[1];
48         } else {
49                 ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)\n");
50                 return buf;
51         }
52
53         if (ast_db_get(family, key, buf, len-1)) {
54                 ast_log(LOG_DEBUG, "DB: %s/%s not found in database.\n", family, key);
55         } else
56                 pbx_builtin_setvar_helper(chan, "DB_RESULT", buf);
57
58         
59         return buf;
60 }
61
62 static void function_db_write(struct ast_channel *chan, char *cmd, char *data, const char *value) 
63 {
64         int argc;       
65         char *args;
66         char *argv[2];
67         char *family;
68         char *key;
69
70         if (!data || ast_strlen_zero(data)) {
71                 ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)=<value>\n");
72                 return;
73         }
74
75         args = ast_strdupa(data);
76         argc = ast_separate_app_args(args, '/', argv, sizeof(argv) / sizeof(argv[0]));
77         
78         if (argc > 1) {
79                 family = argv[0];
80                 key = argv[1];
81         } else {
82                 ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)=value\n");
83                 return;
84         }
85
86         if (ast_db_put(family, key, (char*)value)) {
87                 ast_log(LOG_WARNING, "DB: Error writing value to database.\n");
88         }
89 }
90
91 #ifndef BUILTIN_FUNC
92 static
93 #endif
94 struct ast_custom_function db_function = {
95         .name = "DB",
96         .synopsis = "Read or Write from/to the Asterisk database",
97         .syntax = "DB(<family>/<key>)",
98         .desc = "This function will read or write a value from/to the Asterisk database.\n"
99                 "DB(...) will read a value from the database, while DB(...)=value\n"
100                 "will write a value to the database.  On a read, this function\n"
101                 "returns the value from the datase, or NULL if it does not exist.\n"
102                 "On a write, this function will always return NULL.  Reading a database value\n"
103                 "will also set the global variable DB_RESULT.\n",
104         .read = function_db_read,
105         .write = function_db_write,
106 };
107
108 static char *function_db_exists(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
109 {
110         int argc;       
111         char *args;
112         char *argv[2];
113         char *family;
114         char *key;
115
116         if (!data || ast_strlen_zero(data)) {
117                 ast_log(LOG_WARNING, "DB_EXISTS requires an argument, DB(<family>/<key>)\n");
118                 return buf;
119         }
120
121         args = ast_strdupa(data);
122         argc = ast_separate_app_args(args, '/', argv, sizeof(argv) / sizeof(argv[0]));
123         
124         if (argc > 1) {
125                 family = argv[0];
126                 key = argv[1];
127         } else {
128                 ast_log(LOG_WARNING, "DB_EXISTS requires an argument, DB(<family>/<key>)\n");
129                 return buf;
130         }
131
132         if (ast_db_get(family, key, buf, len-1))
133                 ast_copy_string(buf, "0", len); 
134         else {
135                 pbx_builtin_setvar_helper(chan, "DB_RESULT", buf);
136                 ast_copy_string(buf, "1", len);
137         }
138         
139         return buf;
140 }
141
142 #ifndef BUILTIN_FUNC
143 static
144 #endif
145 struct ast_custom_function db_exists_function = {
146         .name = "DB_EXISTS",
147         .synopsis = "Check to see if a key exists in the Asterisk database",
148         .syntax = "DB_EXISTS(<family>/<key>)",
149         .desc = "This function will check to see if a key exists in the Asterisk\n"
150                 "database. If it exists, the function will return \"1\". If not,\n"
151                 "it will return \"0\".  Checking for existance of database value will\n"
152                 "also set the global variable DB_RESULT to that value if it exists.\n",
153         .read = function_db_exists,
154 };