X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_query.c;h=4cac6c2ea2e137ff66aed2c98f9458c7935b3331;hb=b8224aab234012c2d127b84eceb160e99dd4a14d;hp=5cf84260a3c6ab18166627271b7e0851460b8c89;hpb=4ff2b2ba893d4035fa46a8e3d783f403f190610a;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_query.c b/bacula/src/dird/ua_query.c index 5cf84260a3..4cac6c2ea2 100644 --- a/bacula/src/dird/ua_query.c +++ b/bacula/src/dird/ua_query.c @@ -6,41 +6,48 @@ * * Version $Id$ */ - /* - Copyright (C) 2001-2004 Kern Sibbald and John Walker + Bacula® - The Network Backup Solution + + Copyright (C) 2001-2006 Free Software Foundation Europe e.V. - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation plus additions + that are listed in the file LICENSE. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public - License along with this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. - */ + Bacula® is a registered trademark of John Walker. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ #include "bacula.h" #include "dird.h" extern DIRRES *director; -static POOLMEM *substitute_prompts(UAContext *ua, - POOLMEM *query, char **prompt, int nprompt); +static POOLMEM *substitute_prompts(UAContext *ua, + POOLMEM *query, char **prompt, int nprompt); /* * Read a file containing SQL queries and prompt * the user to select which one. * * File format: - * # => comment + * # => comment * :prompt for query * *prompt for subst %1 * *prompt for subst %2 @@ -57,21 +64,21 @@ int querycmd(UAContext *ua, const char *cmd) char *prompt[9]; int nprompt = 0;; char *query_file = director->query_file; - - if (!open_db(ua)) { + + if (!open_client_db(ua)) { goto bail_out; } - if ((fd=fopen(query_file, "r")) == NULL) { - bsendmsg(ua, "Could not open %s: ERR=%s\n", query_file, - strerror(errno)); + if ((fd=fopen(query_file, "rb")) == NULL) { + bsendmsg(ua, _("Could not open %s: ERR=%s\n"), query_file, + strerror(errno)); goto bail_out; } start_prompt(ua, _("Available queries:\n")); while (fgets(line, sizeof(line), fd) != NULL) { if (line[0] == ':') { - strip_trailing_junk(line); - add_prompt(ua, line+1); + strip_trailing_junk(line); + add_prompt(ua, line+1); } } if ((item=do_prompt(ua, "", _("Choose a query"), NULL, 0)) < 0) { @@ -81,10 +88,10 @@ int querycmd(UAContext *ua, const char *cmd) i = -1; while (fgets(line, sizeof(line), fd) != NULL) { if (line[0] == ':') { - i++; + i++; } if (i == item) { - break; + break; } } if (i != item) { @@ -97,40 +104,40 @@ int querycmd(UAContext *ua, const char *cmd) } while (fgets(line, sizeof(line), fd) != NULL) { if (line[0] == '#') { - continue; + continue; } if (line[0] == ':') { - break; + break; } strip_trailing_junk(line); len = strlen(line); if (line[0] == '*') { /* prompt */ - if (nprompt >= 9) { + if (nprompt >= 9) { bsendmsg(ua, _("Too many prompts in query, max is 9.\n")); - } else { + } else { line[len++] = ' '; - line[len] = 0; - prompt[nprompt++] = bstrdup(line+1); - continue; - } - } + line[len] = 0; + prompt[nprompt++] = bstrdup(line+1); + continue; + } + } if (*query != 0) { pm_strcat(query, " "); } pm_strcat(query, line); if (line[len-1] != ';') { - continue; + continue; } - line[len-1] = 0; /* zap ; */ + line[len-1] = 0; /* zap ; */ if (query[0] != 0) { - query = substitute_prompts(ua, query, prompt, nprompt); + query = substitute_prompts(ua, query, prompt, nprompt); Dmsg1(100, "Query2=%s\n", query); if (query[0] == '!') { - db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, 0, VERT_LIST); - } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST)) { + db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, 0, VERT_LIST); + } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST)) { bsendmsg(ua, "%s\n", query); - } - query[0] = 0; + } + query[0] = 0; } } /* end while */ @@ -138,10 +145,10 @@ int querycmd(UAContext *ua, const char *cmd) query = substitute_prompts(ua, query, prompt, nprompt); Dmsg1(100, "Query2=%s\n", query); if (query[0] == '!') { - db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, 0, VERT_LIST); - } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST)) { + db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, 0, VERT_LIST); + } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST)) { bsendmsg(ua, "%s\n", query); - } + } } bail_out: @@ -155,8 +162,8 @@ bail_out: return 1; } -static POOLMEM *substitute_prompts(UAContext *ua, - POOLMEM *query, char **prompt, int nprompt) +static POOLMEM *substitute_prompts(UAContext *ua, + POOLMEM *query, char **prompt, int nprompt) { char *p, *q, *o; POOLMEM *new_query; @@ -173,14 +180,14 @@ static POOLMEM *substitute_prompts(UAContext *ua, o = new_query; for (q=query; (p=strchr(q, '%')); ) { if (p) { - olen = o - new_query; - new_query = check_pool_memory_size(new_query, olen + p - q + 10); - o = new_query + olen; - while (q < p) { /* copy up to % */ - *o++ = *q++; - } - p++; - switch (*p) { + olen = o - new_query; + new_query = check_pool_memory_size(new_query, olen + p - q + 10); + o = new_query + olen; + while (q < p) { /* copy up to % */ + *o++ = *q++; + } + p++; + switch (*p) { case '1': case '2': case '3': @@ -191,37 +198,37 @@ static POOLMEM *substitute_prompts(UAContext *ua, case '8': case '9': n = (int)(*p) - (int)'1'; - if (prompt[n]) { - if (!subst[n]) { - if (!get_cmd(ua, prompt[n])) { - q += 2; - break; - } - } - len = strlen(ua->cmd); - p = (char *)malloc(len * 2 + 1); - db_escape_string(p, ua->cmd, len); - subst[n] = p; - olen = o - new_query; - new_query = check_pool_memory_size(new_query, olen + strlen(p) + 10); - o = new_query + olen; - while (*p) { - *o++ = *p++; - } - } else { + if (prompt[n]) { + if (!subst[n]) { + if (!get_cmd(ua, prompt[n])) { + q += 2; + break; + } + } + len = strlen(ua->cmd); + p = (char *)malloc(len * 2 + 1); + db_escape_string(p, ua->cmd, len); + subst[n] = p; + olen = o - new_query; + new_query = check_pool_memory_size(new_query, olen + strlen(p) + 10); + o = new_query + olen; + while (*p) { + *o++ = *p++; + } + } else { bsendmsg(ua, _("Warning prompt %d missing.\n"), n+1); - } - q += 2; - break; + } + q += 2; + break; case '%': *o++ = '%'; - q += 2; - break; - default: + q += 2; + break; + default: *o++ = '%'; - q++; - break; - } + q++; + break; + } } } olen = o - new_query; @@ -233,7 +240,7 @@ static POOLMEM *substitute_prompts(UAContext *ua, *o = 0; for (i=0; i<9; i++) { if (subst[i]) { - free(subst[i]); + free(subst[i]); } } free_pool_memory(query); @@ -245,42 +252,39 @@ static POOLMEM *substitute_prompts(UAContext *ua, */ int sqlquerycmd(UAContext *ua, const char *cmd) { - POOLMEM *query = get_pool_memory(PM_MESSAGE); + POOL_MEM query(PM_MESSAGE); int len; const char *msg; - if (!open_db(ua)) { - free_pool_memory(query); + if (!open_client_db(ua)) { return 1; } - *query = 0; + *query.c_str() = 0; - bsendmsg(ua, _("Entering SQL query mode.\n\ -Terminate each query with a semicolon.\n\ -Terminate query mode with a blank line.\n")); - msg = "Enter SQL query: "; + bsendmsg(ua, _("Entering SQL query mode.\n" +"Terminate each query with a semicolon.\n" +"Terminate query mode with a blank line.\n")); + msg = _("Enter SQL query: "); while (get_cmd(ua, msg)) { len = strlen(ua->cmd); Dmsg2(400, "len=%d cmd=%s:\n", len, ua->cmd); if (len == 0) { - break; + break; } - query = check_pool_memory_size(query, len + 1); - if (*query != 0) { - strcat(query, " "); + if (*query.c_str() != 0) { + pm_strcat(query, " "); } - strcat(query, ua->cmd); + pm_strcat(query, ua->cmd); if (ua->cmd[len-1] == ';') { - ua->cmd[len-1] = 0; /* zap ; */ - /* Submit query */ - db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST); - *query = 0; /* start new query */ + ua->cmd[len-1] = 0; /* zap ; */ + /* Submit query */ + db_list_sql_query(ua->jcr, ua->db, query.c_str(), prtit, ua, 1, HORZ_LIST); + *query.c_str() = 0; /* start new query */ msg = _("Enter SQL query: "); } else { msg = _("Add to SQL query: "); } } - free_pool_memory(query); bsendmsg(ua, _("End query mode.\n")); - return 1; + return 1; }