]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/dird/ua_query.c
tidy up make clean and ensure we have all the create/drop etc files
[bacula/bacula] / bacula / src / dird / ua_query.c
1 /*
2  *
3  *   Bacula Director -- User Agent Database Query Commands
4  *
5  *     Kern Sibbald, December MMI
6  *
7  *   Version $Id$
8  */
9
10 /*
11    Copyright (C) 2000-2003 Kern Sibbald and John Walker
12
13    This program is free software; you can redistribute it and/or
14    modify it under the terms of the GNU General Public License as
15    published by the Free Software Foundation; either version 2 of
16    the License, or (at your option) any later version.
17
18    This program is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21    General Public License for more details.
22
23    You should have received a copy of the GNU General Public
24    License along with this program; if not, write to the Free
25    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
26    MA 02111-1307, USA.
27
28  */
29
30 #include "bacula.h"
31 #include "dird.h"
32
33 extern DIRRES *director;
34
35 static char *substitute_prompts(UAContext *ua, 
36                        char *query, char **prompt, int nprompt);
37
38 /*
39  * Read a file containing SQL queries and prompt
40  *  the user to select which one.
41  *
42  *   File format:
43  *   #  => comment
44  *   :prompt for query
45  *   *prompt for subst %1
46  *   *prompt for subst %2
47  *   ...
48  *   SQL statement possibly terminated by ;
49  *   :next query prompt
50  */
51 int querycmd(UAContext *ua, char *cmd)
52 {
53    FILE *fd;
54    POOLMEM *query = get_pool_memory(PM_MESSAGE);
55    char line[1000];
56    int i, item, len;
57    char *prompt[9];
58    int nprompt;
59    char *query_file = director->query_file;
60    
61    if (!open_db(ua)) {
62       free_pool_memory(query);
63       return 1;
64    }
65    if ((fd=fopen(query_file, "r")) == NULL) {
66       bsendmsg(ua, "Could not open %s: ERR=%s\n", query_file,
67          strerror(errno));
68       free_pool_memory(query);
69       return 1;
70    }
71
72    start_prompt(ua, _("Available queries:\n"));
73    while (fgets(line, sizeof(line), fd) != NULL) {
74       if (line[0] == ':') {
75          strip_trailing_junk(line);
76          add_prompt(ua, line+1);
77       }
78    }
79    if ((item=do_prompt(ua, "", _("Choose a query"), NULL, 0)) < 0) {
80       fclose(fd);
81       free_pool_memory(query);
82       return 1;
83    }
84    rewind(fd);
85    i = -1;
86    while (fgets(line, sizeof(line), fd) != NULL) {
87       if (line[0] == ':') {
88          i++;
89       }
90       if (i == item) {
91          break;
92       }
93    }
94    if (i != item) {
95       bsendmsg(ua, _("Could not find query.\n"));
96       fclose(fd);
97       free_pool_memory(query);
98       return 1;
99    }
100    query[0] = 0;
101    for (i=0; i<9; i++) {
102       prompt[i] = NULL;
103    }
104    nprompt = 0;
105    while (fgets(line, sizeof(line), fd) != NULL) {
106       if (line[0] == '#') {
107          continue;
108       }
109       if (line[0] == ':') {
110          break;
111       }
112       strip_trailing_junk(line);
113       len = strlen(line);
114       if (line[0] == '*') {            /* prompt */
115          if (nprompt >= 9) {
116             bsendmsg(ua, _("Too many prompts in query, max is 9.\n"));
117          } else {
118             line[len++] = ' ';
119             line[len] = 0;
120             prompt[nprompt++] = bstrdup(line+1);
121             continue;
122          }
123       }  
124       query = check_pool_memory_size(query, len + 1);
125       if (*query != 0) {
126          strcat(query, " ");
127       }
128       strcat(query, line);
129       if (line[len-1] != ';') {
130          continue;
131       }
132       line[len-1] = 0;             /* zap ; */
133       if (query[0] != 0) {
134          query = substitute_prompts(ua, query, prompt, nprompt);
135          Dmsg1(100, "Query2=%s\n", query);
136          if (query[0] == '!') {
137             db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, 0, VERT_LIST);
138          } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST)) {
139             bsendmsg(ua, "%s\n", query);
140          }
141          query[0] = 0;
142       }
143    } /* end while */
144
145    if (query[0] != 0) {
146       query = substitute_prompts(ua, query, prompt, nprompt);
147       Dmsg1(100, "Query2=%s\n", query);
148          if (query[0] == '!') {
149             db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, 0, VERT_LIST);
150          } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST)) {
151             bsendmsg(ua, "%s\n", query);
152          }
153    }
154    free_pool_memory(query);
155    for (i=0; i<nprompt; i++) {
156       free(prompt[i]);
157    }
158    return 1;
159 }
160
161 static char *substitute_prompts(UAContext *ua, 
162                        char *query, char **prompt, int nprompt)
163 {
164    char *new_query, *p, *q, *o;
165    int i, n, len, olen;
166    char *subst[9];
167
168    if (nprompt == 0) {
169       return query;
170    }
171    for (i=0; i<9; i++) {
172       subst[i] = NULL;
173    }
174    new_query = (char *)get_pool_memory(PM_MESSAGE);
175    new_query = (char *)check_pool_memory_size(new_query, strlen(query) +100);
176    o = new_query;
177    olen = 0;
178    for (q=query; (p=strchr(q, '%')); ) {
179       if (p) {
180          while (q < p) {              /* copy up to % */
181             *o++ = *q++;
182             olen++;
183          }
184          p++;
185          switch (*p) {
186          case '1':
187          case '2':
188          case '3':
189          case '4':
190          case '5':
191          case '6':
192          case '7':
193          case '8':
194          case '9':
195             n = (int)(*p) - (int)'1';
196             if (prompt[n]) {
197                if (!subst[n]) {
198                   if (!get_cmd(ua, prompt[n])) {
199                      q += 2;
200                      break;
201                   }
202                }
203                len = strlen(ua->cmd);
204                p = (char *)malloc(len * 2 + 1);
205                db_escape_string(p, ua->cmd, len);
206                subst[n] = p;
207                o = (char *)check_pool_memory_size(o, olen + strlen(p) + 1);
208                while (*p) {
209                   *o++ = *p++;
210                   olen++;
211                }
212             } else {
213                bsendmsg(ua, _("Warning prompt %d missing.\n"), n+1);
214             }
215             q += 2;
216             break;
217          case '%':
218             *o++ = '%';
219             olen++;
220             q += 2;
221             break;
222          default:
223             *o++ = '%';
224             olen++;
225             q++;
226             break;
227          }
228       }
229    }
230    o = (char *)check_pool_memory_size(o, olen + strlen(q) + 1);
231    while (*q) {
232       *o++ = *q++;
233    }
234    *o = 0;
235    for (i=0; i<9; i++) {
236       if (subst[i]) {
237          free(subst[i]);
238       }
239    }
240    free_pool_memory(query);
241    return new_query;
242 }
243
244 /*
245  * Get general SQL query for Catalog
246  */
247 int sqlquerycmd(UAContext *ua, char *cmd)
248 {
249    POOLMEM *query = get_pool_memory(PM_MESSAGE);
250    int len;
251    char *msg;
252
253    if (!open_db(ua)) {
254       free_pool_memory(query);
255       return 1;
256    }
257    *query = 0;
258
259    bsendmsg(ua, _("Entering SQL query mode.\n\
260 Terminate each query with a semicolon.\n\
261 Terminate query mode with a blank line.\n"));
262    msg = "Enter SQL query: ";
263    while (get_cmd(ua, msg)) {
264       len = strlen(ua->cmd);
265       Dmsg2(400, "len=%d cmd=%s:\n", len, ua->cmd);
266       if (len == 0) {
267          break;
268       }
269       query = check_pool_memory_size(query, len + 1);
270       if (*query != 0) {
271          strcat(query, " ");
272       }
273       strcat(query, ua->cmd);
274       if (ua->cmd[len-1] == ';') {
275          ua->cmd[len-1] = 0;          /* zap ; */
276          /* Submit query */
277          db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST);
278          *query = 0;                  /* start new query */
279          msg = _("Enter SQL query: ");
280       } else {
281          msg = _("Add to SQL query: ");
282       }
283    }
284    free_pool_memory(query);
285    bsendmsg(ua, _("End query mode.\n"));
286    return 1; 
287 }