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