fix a few more XML documentation problems
[asterisk/asterisk.git] / res / res_realtime.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Anthony Minessale <anthmct@yahoo.com>
7  * Mark Spencer <markster@digium.com>
8  *
9  * See http://www.asterisk.org for more information about
10  * the Asterisk project. Please do not directly contact
11  * any of the maintainers of this project for assistance;
12  * the project provides a web site, mailing lists and IRC
13  * channels for your use.
14  *
15  * This program is free software, distributed under the terms of
16  * the GNU General Public License Version 2. See the LICENSE file
17  * at the top of the source tree.
18  */
19
20 /*! \file
21  *
22  * \brief RealTime CLI
23  *
24  * \author Anthony Minessale <anthmct@yahoo.com>
25  * \author Mark Spencer <markster@digium.com>
26  * 
27  * \ingroup applications
28  */
29
30 #include "asterisk.h"
31
32 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
33
34 #include "asterisk/file.h"
35 #include "asterisk/channel.h"
36 #include "asterisk/pbx.h"
37 #include "asterisk/config.h"
38 #include "asterisk/module.h"
39 #include "asterisk/lock.h"
40 #include "asterisk/cli.h"
41
42
43 static char *cli_realtime_load(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) 
44 {
45 #define CRL_HEADER_FORMAT "%30s  %-30s\n"
46         struct ast_variable *var = NULL, *orig_var = NULL;
47
48         switch (cmd) {
49         case CLI_INIT:
50                 e->command = "realtime load";
51                 e->usage =
52                         "Usage: realtime load <family> <colmatch> <value>\n"
53                         "       Prints out a list of variables using the RealTime driver.\n"
54                         "       You must supply a family name, a column to match on, and a value to match to.\n";
55                 return NULL;
56         case CLI_GENERATE:
57                 return NULL;
58         }
59
60
61         if (a->argc < 5) 
62                 return CLI_SHOWUSAGE;
63
64         var = ast_load_realtime_all(a->argv[2], a->argv[3], a->argv[4], SENTINEL);
65
66         if (var) {
67                 ast_cli(a->fd, CRL_HEADER_FORMAT, "Column Name", "Column Value");
68                 ast_cli(a->fd, CRL_HEADER_FORMAT, "--------------------", "--------------------");
69                 orig_var = var;
70                 while (var) {
71                         ast_cli(a->fd, CRL_HEADER_FORMAT, var->name, var->value);
72                         var = var->next;
73                 }
74         } else {
75                 ast_cli(a->fd, "No rows found matching search criteria.\n");
76         }
77         ast_variables_destroy(orig_var);
78         return CLI_SUCCESS;
79 }
80
81 static char *cli_realtime_update(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
82 {
83         int res = 0;
84
85         switch (cmd) {
86         case CLI_INIT:
87                 e->command = "realtime update";
88                 e->usage =
89                         "Usage: realtime update <family> <colmatch> <valuematch> <colupdate> <newvalue>\n"
90                         "       Update a single variable using the RealTime driver.\n"
91                         "       You must supply a family name, a column to update on, a new value, column to match, and value to match.\n"
92                         "       Ex: realtime update sipfriends name bobsphone port 4343\n"
93                         "       will execute SQL as UPDATE sipfriends SET port = 4343 WHERE name = bobsphone\n";
94                 return NULL;
95         case CLI_GENERATE:
96                 return NULL;
97         }
98
99         if (a->argc < 7) 
100                 return CLI_SHOWUSAGE;
101
102         res = ast_update_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL);
103
104         if (res < 0) {
105                 ast_cli(a->fd, "Failed to update. Check the debug log for possible SQL related entries.\n");
106                 return CLI_FAILURE;
107         }
108
109         ast_cli(a->fd, "Updated %d RealTime record%s.\n", res, ESS(res));
110
111         return CLI_SUCCESS;
112 }
113
114 static char *cli_realtime_update2(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
115 {
116         int res = -1;
117
118         switch (cmd) {
119         case CLI_INIT:
120                 e->command = "realtime update2";
121                 e->usage =
122                         "Usage: realtime update2 <family> <colmatch> <valuematch> [... <colmatch5> <valuematch5>] NULL <colupdate> <newvalue>\n"
123                         "       Update a single variable using the RealTime driver.\n"
124                         "       You must supply a family name, a column to update on, a new value, column to match, and value to match.\n"
125                         "       Ex: realtime update sipfriends name bobsphone port 4343\n"
126                         "       will execute SQL as UPDATE sipfriends SET port = 4343 WHERE name = bobsphone\n";
127                 return NULL;
128         case CLI_GENERATE:
129                 return NULL;
130         }
131
132         if (a->argc < 7) 
133                 return CLI_SHOWUSAGE;
134
135         if (a->argc == 7) {
136                 res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], SENTINEL, a->argv[5], a->argv[6], SENTINEL);
137         } else if (a->argc == 9) {
138                 res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL, a->argv[7], a->argv[8], SENTINEL);
139         } else if (a->argc == 11) {
140                 res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], SENTINEL, a->argv[9], a->argv[10], SENTINEL);
141         } else if (a->argc == 13) {
142                 res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], SENTINEL, a->argv[11], a->argv[12], SENTINEL);
143         } else if (a->argc == 15) {
144                 res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], a->argv[11], a->argv[12], SENTINEL, a->argv[13], a->argv[14], SENTINEL);
145         } else {
146                 return CLI_SHOWUSAGE;
147         }
148
149         if (res < 0) {
150                 ast_cli(a->fd, "Failed to update. Check the debug log for possible SQL related entries.\n");
151                 return CLI_FAILURE;
152         }
153
154         ast_cli(a->fd, "Updated %d RealTime record%s.\n", res, ESS(res));
155
156         return CLI_SUCCESS;
157 }
158
159 static char *cli_realtime_store(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
160 {
161         int res = -1;
162
163         switch (cmd) {
164         case CLI_INIT:
165                 e->command = "realtime store";
166                 e->usage =
167                         "Usage: realtime store <family> <colname1> <value1> [<colname2> <value2> [... <colname5> <value5>]]\n"
168                         "       Create a stored row using the RealTime driver.\n"
169                         "       You must supply a family name and name/value pairs (up to 5).  If\n"
170                         "       you need to store more than 5 key/value pairs, start with the first\n"
171                         "       five, then use 'realtime update' or 'realtime update2' to add\n"
172                         "       additional columns.\n";
173                 return NULL;
174         case CLI_GENERATE:
175                 return NULL;
176         }
177
178         if (a->argc < 5) {
179                 return CLI_SHOWUSAGE;
180         } else if (a->argc == 5) {
181                 res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], SENTINEL);
182         } else if (a->argc == 7) {
183                 res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL);
184         } else if (a->argc == 9) {
185                 res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], SENTINEL);
186         } else if (a->argc == 11) {
187                 res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], SENTINEL);
188         } else if (a->argc == 13) {
189                 res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], a->argv[11], a->argv[12], SENTINEL);
190         } else {
191                 return CLI_SHOWUSAGE;
192         }
193
194         if (res < 0) {
195                 ast_cli(a->fd, "Failed to store record. Check the debug log for possible SQL related entries.\n");
196                 return CLI_FAILURE;
197         }
198
199         ast_cli(a->fd, "Stored RealTime record.\n");
200
201         return CLI_SUCCESS;
202 }
203
204 static char *cli_realtime_destroy(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
205 {
206         int res = -1;
207
208         switch (cmd) {
209         case CLI_INIT:
210                 e->command = "realtime destroy";
211                 e->usage =
212                         "Usage: realtime destroy <family> <colmatch1> <valuematch1> [<colmatch2> <valuematch2> [... <colmatch5> <valuematch5>]]\n"
213                         "       Remove a stored row using the RealTime driver.\n"
214                         "       You must supply a family name and name/value pairs (up to 5).\n";
215                 return NULL;
216         case CLI_GENERATE:
217                 return NULL;
218         }
219
220         if (a->argc < 5) {
221                 return CLI_SHOWUSAGE;
222         } else if (a->argc == 5) {
223                 res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], SENTINEL);
224         } else if (a->argc == 7) {
225                 res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL);
226         } else if (a->argc == 9) {
227                 res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], SENTINEL);
228         } else if (a->argc == 11) {
229                 res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], SENTINEL);
230         } else if (a->argc == 13) {
231                 res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], a->argv[11], a->argv[12], SENTINEL);
232         } else {
233                 return CLI_SHOWUSAGE;
234         }
235
236         if (res < 0) {
237                 ast_cli(a->fd, "Failed to remove record. Check the debug log for possible SQL related entries.\n");
238                 return CLI_FAILURE;
239         }
240
241         ast_cli(a->fd, "Removed %d RealTime record%s.\n", res, ESS(res));
242
243         return CLI_SUCCESS;
244 }
245
246 static struct ast_cli_entry cli_realtime[] = {
247         AST_CLI_DEFINE(cli_realtime_load, "Used to print out RealTime variables."),
248         AST_CLI_DEFINE(cli_realtime_update, "Used to update RealTime variables."),
249         AST_CLI_DEFINE(cli_realtime_update2, "Used to test the RealTime update2 method"),
250         AST_CLI_DEFINE(cli_realtime_store, "Store a new row into a RealTime database"),
251         AST_CLI_DEFINE(cli_realtime_destroy, "Delete a row from a RealTime database"),
252 };
253
254 static int unload_module(void)
255 {
256         ast_cli_unregister_multiple(cli_realtime, ARRAY_LEN(cli_realtime));
257         return 0;
258 }
259
260 static int load_module(void)
261 {
262         ast_cli_register_multiple(cli_realtime, ARRAY_LEN(cli_realtime));
263         return AST_MODULE_LOAD_SUCCESS;
264 }
265
266 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Realtime Data Lookup/Rewrite");