1 /*
2    BAREOS® - Backup Archiving REcovery Open Sourced
3 
4    Copyright (C) 2016-2016 Planets Communications B.V.
5    Copyright (C) 2016-2017 Bareos GmbH & Co. KG
6 
7    This program is Free Software; you can redistribute it and/or
8    modify it under the terms of version three of the GNU Affero General Public
9    License as published by the Free Software Foundation and included
10    in the file LICENSE.
11 
12    This program is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15    Affero General Public License for more details.
16 
17    You should have received a copy of the GNU Affero General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20    02110-1301, USA.
21 */
22 /*
23  * Bareos Catalog Database Query loading routines.
24  *
25  * Written by Marco van Wieringen, May 2016
26  */
27 
28 #include "include/bareos.h"
29 
30 #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI
31 
32 #include "cats.h"
33 
34 static const int debuglevel = 100;
35 
get_predefined_query_name(BareosDb::SQL_QUERY_ENUM query)36 const char *BareosDb::get_predefined_query_name(BareosDb::SQL_QUERY_ENUM query) {
37   return query_names[query];
38 }
39 
get_predefined_query(BareosDb::SQL_QUERY_ENUM query)40 const char *BareosDb::get_predefined_query(BareosDb::SQL_QUERY_ENUM query) {
41    if(!queries) {
42       Emsg0(M_ERROR, 0, "No SQL queries defined. This should not happen.");
43       return NULL;
44    }
45 
46    return queries[query];
47 }
48 
FillQuery(BareosDb::SQL_QUERY_ENUM predefined_query,...)49 void BareosDb::FillQuery(BareosDb::SQL_QUERY_ENUM predefined_query, ...)
50 {
51    va_list arg_ptr;
52 
53    va_start(arg_ptr, predefined_query);
54    FillQueryVaList(cmd, predefined_query, arg_ptr);
55    va_end(arg_ptr);
56 }
57 
FillQuery(PoolMem & query,BareosDb::SQL_QUERY_ENUM predefined_query,...)58 void BareosDb::FillQuery(PoolMem &query, BareosDb::SQL_QUERY_ENUM predefined_query, ...)
59 {
60    va_list arg_ptr;
61 
62    va_start(arg_ptr, predefined_query);
63    FillQueryVaList(query, predefined_query, arg_ptr);
64    va_end(arg_ptr);
65 }
66 
FillQuery(POOLMEM * & query,BareosDb::SQL_QUERY_ENUM predefined_query,...)67 void BareosDb::FillQuery(POOLMEM *&query, BareosDb::SQL_QUERY_ENUM predefined_query, ...)
68 {
69    va_list arg_ptr;
70 
71    va_start(arg_ptr, predefined_query);
72    FillQueryVaList(query, predefined_query, arg_ptr);
73    va_end(arg_ptr);
74 }
75 
76 
77 
FillQueryVaList(POOLMEM * & query,BareosDb::SQL_QUERY_ENUM predefined_query,va_list arg_ptr)78 void BareosDb::FillQueryVaList(POOLMEM *&query, BareosDb::SQL_QUERY_ENUM predefined_query, va_list arg_ptr)
79 {
80    PoolMem query_tmp(PM_MESSAGE);
81 
82    FillQueryVaList(query_tmp, predefined_query, arg_ptr);
83    PmMemcpy(query, query_tmp, query_tmp.strlen()+1);
84 }
85 
86 
87 
FillQueryVaList(PoolMem & query,BareosDb::SQL_QUERY_ENUM predefined_query,va_list arg_ptr)88 void BareosDb::FillQueryVaList(PoolMem &query, BareosDb::SQL_QUERY_ENUM predefined_query, va_list arg_ptr)
89 {
90    const char *query_name;
91    const char *query_template;
92 
93    query_name = get_predefined_query_name(predefined_query);
94    query_template = get_predefined_query(predefined_query);
95 
96    Dmsg3(debuglevel, "called: %s with query name %s (%d)\n", __PRETTY_FUNCTION__, query_name, predefined_query);
97 
98    if (query_template) {
99       query.Bvsprintf(query_template, arg_ptr);
100    }
101 
102    Dmsg2(debuglevel, "called: %s query is now %s\n", __PRETTY_FUNCTION__, query.c_str());
103 }
104 
105 
106 
SqlQuery(BareosDb::SQL_QUERY_ENUM predefined_query,...)107 bool BareosDb::SqlQuery(BareosDb::SQL_QUERY_ENUM predefined_query, ...)
108 {
109    va_list arg_ptr;
110    PoolMem query(PM_MESSAGE);
111 
112    va_start(arg_ptr, predefined_query);
113    FillQueryVaList(query, predefined_query, arg_ptr);
114    va_end(arg_ptr);
115 
116    return SqlQuery(query.c_str());
117 }
118 
119 
SqlQuery(const char * query,int flags)120 bool BareosDb::SqlQuery(const char *query, int flags)
121 {
122    bool retval;
123 
124    Dmsg2(debuglevel, "called: %s with query %s\n", __PRETTY_FUNCTION__, query);
125 
126    DbLock(this);
127    retval = SqlQueryWithoutHandler(query, flags);
128    if (!retval) {
129       Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror());
130    }
131    DbUnlock(this);
132 
133    return retval;
134 }
135 
SqlQuery(const char * query,DB_RESULT_HANDLER * ResultHandler,void * ctx)136 bool BareosDb::SqlQuery(const char *query, DB_RESULT_HANDLER *ResultHandler, void *ctx)
137 {
138    bool retval;
139 
140    Dmsg2(debuglevel, "called: %s with query %s\n", __PRETTY_FUNCTION__, query);
141 
142    DbLock(this);
143    retval = SqlQueryWithHandler(query, ResultHandler, ctx);
144    if (!retval) {
145       Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror());
146    }
147    DbUnlock(this);
148 
149    return retval;
150 }
151 #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI */
152