X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_query.c;h=354b596b4910a42b6280f0419022c62443d364c9;hb=c2e85cfe39725395ed5a383ec5c3e31c1e88d1b1;hp=faa8c0614b1b1f7a68bb3f5bf587dc1e0eb98ec0;hpb=463df9e4ba74a64f5ae90000e9e6bcdaedbdf4fb;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_query.c b/bacula/src/dird/ua_query.c index faa8c0614b..354b596b49 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 three of the GNU Affero General Public + License as published by the Free Software Foundation and included + 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 Affero 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 Kern Sibbald. + 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,22 @@ 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) { + berrno be; + ua->error_msg(_("Could not open %s: ERR=%s\n"), query_file, + be.bstrerror()); 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,14 +89,14 @@ 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) { - bsendmsg(ua, _("Could not find query.\n")); + ua->error_msg(_("Could not find query.\n")); goto bail_out; } query[0] = 0; @@ -97,40 +105,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) { - bsendmsg(ua, _("Too many prompts in query, max is 9.\n")); - } else { + if (nprompt >= 9) { + ua->error_msg(_("Too many prompts in query, max is 9.\n")); + } 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, " "); } - pm_strcat(&query, line); + 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)) { - bsendmsg(ua, "%s\n", query); - } - query[0] = 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)) { + ua->send_msg("%s\n", query); + } + query[0] = 0; } } /* end while */ @@ -138,10 +146,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)) { - bsendmsg(ua, "%s\n", query); - } + 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)) { + ua->error_msg("%s\n", query); + } } bail_out: @@ -155,8 +163,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 +181,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 +199,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 { - bsendmsg(ua, _("Warning prompt %d missing.\n"), n+1); - } - q += 2; - break; + 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(ua->jcr, ua->db, 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 { + ua->error_msg(_("Warning prompt %d missing.\n"), n+1); + } + q += 2; + break; case '%': *o++ = '%'; - q += 2; - break; - default: + q += 2; + break; + default: *o++ = '%'; - q++; - break; - } + q++; + break; + } } } olen = o - new_query; @@ -233,7 +241,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 +253,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: "; + ua->send_msg(_("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; + ua->send_msg(_("End query mode.\n")); + return 1; }