1 /*
2    BAREOS® - Backup Archiving REcovery Open Sourced
3 
4    Copyright (C) 2016-2016 Planets Communications B.V.
5    Copyright (C) 2016-2019 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 query)36 const char* BareosDb::get_predefined_query_name(BareosDb::SQL_QUERY query)
37 {
38   return query_names[static_cast<int>(query)];
39 }
40 
get_predefined_query(BareosDb::SQL_QUERY query)41 const char* BareosDb::get_predefined_query(BareosDb::SQL_QUERY query)
42 {
43   if (!queries) {
44     Emsg0(M_ERROR, 0, "No SQL queries defined. This should not happen.");
45     return NULL;
46   }
47 
48   return queries[static_cast<int>(query)];
49 }
50 
FillQuery(BareosDb::SQL_QUERY predefined_query,...)51 void BareosDb::FillQuery(BareosDb::SQL_QUERY predefined_query, ...)
52 {
53   va_list arg_ptr;
54 
55   va_start(arg_ptr, predefined_query);
56   FillQueryVaList(cmd, predefined_query, arg_ptr);
57   va_end(arg_ptr);
58 }
59 
FillQuery(PoolMem & query,BareosDb::SQL_QUERY predefined_query,...)60 void BareosDb::FillQuery(PoolMem& query,
61                          BareosDb::SQL_QUERY predefined_query,
62                          ...)
63 {
64   va_list arg_ptr;
65 
66   va_start(arg_ptr, predefined_query);
67   FillQueryVaList(query, predefined_query, arg_ptr);
68   va_end(arg_ptr);
69 }
70 
FillQuery(POOLMEM * & query,BareosDb::SQL_QUERY predefined_query,...)71 void BareosDb::FillQuery(POOLMEM*& query,
72                          BareosDb::SQL_QUERY predefined_query,
73                          ...)
74 {
75   va_list arg_ptr;
76 
77   va_start(arg_ptr, predefined_query);
78   FillQueryVaList(query, predefined_query, arg_ptr);
79   va_end(arg_ptr);
80 }
81 
82 
FillQueryVaList(POOLMEM * & query,BareosDb::SQL_QUERY predefined_query,va_list arg_ptr)83 void BareosDb::FillQueryVaList(POOLMEM*& query,
84                                BareosDb::SQL_QUERY predefined_query,
85                                va_list arg_ptr)
86 {
87   PoolMem query_tmp(PM_MESSAGE);
88 
89   FillQueryVaList(query_tmp, predefined_query, arg_ptr);
90   PmMemcpy(query, query_tmp, query_tmp.strlen() + 1);
91 }
92 
93 
FillQueryVaList(PoolMem & query,BareosDb::SQL_QUERY predefined_query,va_list arg_ptr)94 void BareosDb::FillQueryVaList(PoolMem& query,
95                                BareosDb::SQL_QUERY predefined_query,
96                                va_list arg_ptr)
97 {
98   const char* query_name;
99   const char* query_template;
100 
101   query_name = get_predefined_query_name(predefined_query);
102   query_template = get_predefined_query(predefined_query);
103 
104   Dmsg3(debuglevel, "called: %s with query name %s (%d)\n", __PRETTY_FUNCTION__,
105         query_name, predefined_query);
106 
107   if (query_template) { query.Bvsprintf(query_template, arg_ptr); }
108 
109   Dmsg2(debuglevel, "called: %s query is now %s\n", __PRETTY_FUNCTION__,
110         query.c_str());
111 }
112 
113 
SqlQuery(BareosDb::SQL_QUERY predefined_query,...)114 bool BareosDb::SqlQuery(BareosDb::SQL_QUERY predefined_query, ...)
115 {
116   va_list arg_ptr;
117   PoolMem query(PM_MESSAGE);
118 
119   va_start(arg_ptr, predefined_query);
120   FillQueryVaList(query, predefined_query, arg_ptr);
121   va_end(arg_ptr);
122 
123   return SqlQuery(query.c_str());
124 }
125 
126 
SqlQuery(const char * query,int flags)127 bool BareosDb::SqlQuery(const char* query, int flags)
128 {
129   bool retval;
130 
131   Dmsg2(debuglevel, "called: %s with query %s\n", __PRETTY_FUNCTION__, query);
132 
133   DbLock(this);
134   retval = SqlQueryWithoutHandler(query, flags);
135   if (!retval) {
136     Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror());
137   }
138   DbUnlock(this);
139 
140   return retval;
141 }
142 
SqlQuery(const char * query,DB_RESULT_HANDLER * ResultHandler,void * ctx)143 bool BareosDb::SqlQuery(const char* query,
144                         DB_RESULT_HANDLER* ResultHandler,
145                         void* ctx)
146 {
147   bool retval;
148 
149   Dmsg2(debuglevel, "called: %s with query %s\n", __PRETTY_FUNCTION__, query);
150 
151   DbLock(this);
152   retval = SqlQueryWithHandler(query, ResultHandler, ctx);
153   if (!retval) {
154     Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror());
155   }
156   DbUnlock(this);
157 
158   return retval;
159 }
160 #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL || HAVE_INGRES || \
161           HAVE_DBI */
162