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