499.2.14
by Mark Atwood
fixes as per MontyT's comments, prep for internationalization |
1 |
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
|
499.2.10
by Mark Atwood
add editor format hints, and other useful metadata comments |
2 |
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
499.2.14
by Mark Atwood
fixes as per MontyT's comments, prep for internationalization |
3 |
*
|
772.1.1
by Toru Maesaka
Defined the first version of the Query Cache interface. |
4 |
* Copyright (C) 2008 Mark Atwood, Toru Maesaka
|
499.2.10
by Mark Atwood
add editor format hints, and other useful metadata comments |
5 |
*
|
6 |
* This program is free software; you can redistribute it and/or modify
|
|
7 |
* it under the terms of the GNU General Public License as published by
|
|
8 |
* the Free Software Foundation; version 2 of the License.
|
|
9 |
*
|
|
10 |
* This program is distributed in the hope that it will be useful,
|
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13 |
* GNU General Public License for more details.
|
|
14 |
*
|
|
15 |
* You should have received a copy of the GNU General Public License
|
|
16 |
* along with this program; if not, write to the Free Software
|
|
17 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18 |
*/
|
|
19 |
||
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
20 |
#include <drizzled/server_includes.h> |
21 |
#include <drizzled/qcache.h> |
|
549
by Monty Taylor
Took gettext.h out of header files. |
22 |
#include <drizzled/gettext.h> |
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
23 |
|
24 |
int qcache_initializer(st_plugin_int *plugin) |
|
25 |
{
|
|
26 |
qcache_t *p; |
|
27 |
||
683.1.1
by Mark Atwood
use new/delete instead of malloc/free for plugin structs |
28 |
p= new qcache_t; |
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
29 |
if (p == NULL) return 1; |
30 |
memset(p, 0, sizeof(qcache_t)); |
|
31 |
||
32 |
plugin->data= (void *)p; |
|
33 |
||
34 |
if (plugin->plugin->init) |
|
35 |
{
|
|
36 |
if (plugin->plugin->init((void *)p)) |
|
37 |
{
|
|
755.2.1
by Mark Atwood
replace sql_print_error etc with errmsg_print |
38 |
errmsg_printf(ERRMSG_LVL_ERROR, _("qcache plugin '%s' init() failed"), |
772.1.1
by Toru Maesaka
Defined the first version of the Query Cache interface. |
39 |
plugin->name.str); |
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
40 |
goto err; |
41 |
}
|
|
42 |
}
|
|
810
by Brian Aker
Fix for making sure I_S has good information about which plugins are |
43 |
plugin->state= PLUGIN_IS_READY; |
44 |
||
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
45 |
return 0; |
46 |
||
47 |
err: |
|
683.1.1
by Mark Atwood
use new/delete instead of malloc/free for plugin structs |
48 |
delete p; |
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
49 |
return 1; |
50 |
}
|
|
51 |
||
52 |
int qcache_finalizer(st_plugin_int *plugin) |
|
660.1.3
by Eric Herman
removed trailing whitespace with simple script: |
53 |
{
|
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
54 |
qcache_t *p= (qcache_t *) plugin->data; |
55 |
||
56 |
if (plugin->plugin->deinit) |
|
57 |
{
|
|
58 |
if (plugin->plugin->deinit((void *)p)) |
|
59 |
{
|
|
755.2.1
by Mark Atwood
replace sql_print_error etc with errmsg_print |
60 |
errmsg_printf(ERRMSG_LVL_ERROR, _("qcache plugin '%s' deinit() failed"), |
772.1.1
by Toru Maesaka
Defined the first version of the Query Cache interface. |
61 |
plugin->name.str); |
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
62 |
}
|
63 |
}
|
|
64 |
||
683.1.1
by Mark Atwood
use new/delete instead of malloc/free for plugin structs |
65 |
if (p) delete p; |
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
66 |
return 0; |
67 |
}
|
|
68 |
||
772.1.1
by Toru Maesaka
Defined the first version of the Query Cache interface. |
69 |
/*
|
70 |
The plugin_foreach() iterator requires that we convert all the parameters
|
|
71 |
of a plugin API entry point into a single void pointer, plus the session.
|
|
72 |
So we need the following structure for qcache_invalidate_db() which requires
|
|
73 |
multiple arguments.
|
|
74 |
*/
|
|
75 |
typedef struct db_invalidation_parms |
|
76 |
{
|
|
77 |
const char *dbname; |
|
78 |
bool transactional; |
|
79 |
} db_invalidation_parms_t; |
|
80 |
||
81 |
||
82 |
/*
|
|
83 |
Following functions:
|
|
84 |
||
85 |
qcache_try_fetch_and_send_iterate();
|
|
86 |
qcache_set_iterate();
|
|
87 |
qcache_invalidate_table_iterate();
|
|
88 |
qcache_invalidate_db_iterate();
|
|
89 |
qcache_flush_iterate();
|
|
90 |
||
91 |
are called by plugin_foreach() _once_ for each Query Cache plugin.
|
|
92 |
*/
|
|
93 |
||
94 |
static bool qcache_try_fetch_and_send_iterate(Session *session, |
|
95 |
plugin_ref plugin, void *p) |
|
96 |
{
|
|
97 |
qcache_t *l= plugin_data(plugin, qcache_t *); |
|
98 |
bool is_transactional = (bool *)p; |
|
99 |
||
100 |
if (l && l->qcache_try_fetch_and_send) |
|
101 |
{
|
|
102 |
if (l->qcache_try_fetch_and_send(session, is_transactional)) |
|
103 |
{
|
|
104 |
errmsg_printf(ERRMSG_LVL_ERROR, |
|
105 |
_("qcache plugin '%s' try_fetch_and_send() failed"), |
|
106 |
(char *)plugin_name(plugin)); |
|
107 |
return true; |
|
108 |
}
|
|
109 |
}
|
|
110 |
return false; |
|
111 |
}
|
|
112 |
||
113 |
static bool qcache_set_iterate(Session *session, plugin_ref plugin, void *p) |
|
114 |
{
|
|
115 |
qcache_t *l = plugin_data(plugin, qcache_t *); |
|
116 |
bool transactional = (bool *)p; |
|
117 |
||
118 |
if (l && l->qcache_set) |
|
119 |
{
|
|
120 |
if (l->qcache_set(session, transactional)) |
|
121 |
{
|
|
122 |
errmsg_printf(ERRMSG_LVL_ERROR, _("qcache plugin '%s' set() failed"), |
|
123 |
(char *)plugin_name(plugin)); |
|
124 |
return true; |
|
125 |
}
|
|
126 |
}
|
|
127 |
return false; |
|
128 |
}
|
|
129 |
||
130 |
static bool qcache_invalidate_table_iterate(Session *session, |
|
131 |
plugin_ref plugin, void *p) |
|
132 |
{
|
|
133 |
qcache_t *l = plugin_data(plugin, qcache_t *); |
|
134 |
bool transactional = (bool *)p; |
|
135 |
||
136 |
if (l && l->qcache_invalidate_table) |
|
137 |
{
|
|
138 |
if (l->qcache_invalidate_table(session, transactional)) |
|
139 |
{
|
|
140 |
errmsg_printf(ERRMSG_LVL_ERROR, |
|
141 |
_("qcache plugin '%s' invalidate_table() failed"), |
|
142 |
(char *)plugin_name(plugin)); |
|
143 |
return true; |
|
144 |
}
|
|
145 |
}
|
|
146 |
return false; |
|
147 |
}
|
|
148 |
||
149 |
static bool qcache_invalidate_db_iterate(Session *session, |
|
150 |
plugin_ref plugin, void *p) |
|
151 |
{
|
|
152 |
qcache_t *l = plugin_data(plugin, qcache_t *); |
|
153 |
db_invalidation_parms_t *parms = (db_invalidation_parms_t *)p; |
|
154 |
||
155 |
if (l && l->qcache_invalidate_db) |
|
156 |
{
|
|
157 |
if (l->qcache_invalidate_db(session, parms->dbname, parms->transactional)) |
|
158 |
{
|
|
159 |
errmsg_printf(ERRMSG_LVL_ERROR, |
|
160 |
_("qcache plugin '%s' invalidate_db() failed"), |
|
161 |
(char *)plugin_name(plugin)); |
|
162 |
return true; |
|
163 |
}
|
|
164 |
}
|
|
165 |
return false; |
|
166 |
}
|
|
167 |
||
168 |
static bool qcache_flush_iterate(Session *session, plugin_ref plugin, void *p) |
|
169 |
{
|
|
170 |
qcache_t *l = plugin_data(plugin, qcache_t *); |
|
171 |
||
172 |
if (p) return true; /* flush has no parameters, return failure */ |
|
173 |
||
174 |
if (l && l->qcache_flush) |
|
175 |
{
|
|
176 |
if (l->qcache_flush(session)) |
|
177 |
{
|
|
178 |
errmsg_printf(ERRMSG_LVL_ERROR, _("qcache plugin '%s' flush() failed"), |
|
179 |
(char *)plugin_name(plugin)); |
|
180 |
return true; |
|
181 |
}
|
|
182 |
}
|
|
183 |
return false; |
|
184 |
}
|
|
185 |
||
186 |
||
187 |
/*
|
|
188 |
Following functions:
|
|
189 |
||
190 |
drizzle_qcache_try_fetch_and_send();
|
|
191 |
drizzle_qcache_set();
|
|
192 |
drizzle_qcache_invalidate_table();
|
|
193 |
drizzle_qcache_invalidate_db();
|
|
194 |
drizzle_qcache_flush();
|
|
195 |
||
196 |
are the entry points to the query cache plugin that is called by the
|
|
197 |
rest of the Drizzle server code.
|
|
198 |
*/
|
|
199 |
||
200 |
bool drizzle_qcache_try_fetch_and_send(Session *session, bool transactional) |
|
201 |
{
|
|
202 |
bool foreach_rv; |
|
203 |
foreach_rv= plugin_foreach(session, |
|
204 |
qcache_try_fetch_and_send_iterate, |
|
205 |
DRIZZLE_QCACHE_PLUGIN, |
|
206 |
(void *) &transactional); |
|
207 |
return foreach_rv; |
|
208 |
}
|
|
209 |
||
210 |
bool drizzle_qcache_set(Session *session, bool transactional) |
|
211 |
{
|
|
212 |
bool foreach_rv; |
|
213 |
foreach_rv= plugin_foreach(session, |
|
214 |
qcache_set_iterate, |
|
215 |
DRIZZLE_QCACHE_PLUGIN, |
|
216 |
(void *) &transactional); |
|
217 |
return foreach_rv; |
|
218 |
}
|
|
219 |
||
220 |
bool drizzle_qcache_invalidate_table(Session *session, bool transactional) |
|
221 |
{
|
|
222 |
bool foreach_rv; |
|
223 |
foreach_rv= plugin_foreach(session, |
|
224 |
qcache_invalidate_table_iterate, |
|
225 |
DRIZZLE_QCACHE_PLUGIN, |
|
226 |
(void *) &transactional); |
|
227 |
return foreach_rv; |
|
228 |
}
|
|
229 |
||
230 |
bool drizzle_qcache_invalidate_db(Session *session, const char *dbname, |
|
231 |
bool transactional) |
|
232 |
{
|
|
233 |
bool foreach_rv; |
|
234 |
db_invalidation_parms_t parms; |
|
235 |
||
236 |
/* marshall the parameters */
|
|
237 |
parms.dbname = dbname; |
|
238 |
parms.transactional = transactional; |
|
239 |
||
240 |
foreach_rv= plugin_foreach(session, |
|
241 |
qcache_invalidate_db_iterate, |
|
242 |
DRIZZLE_QCACHE_PLUGIN, |
|
243 |
(void *) &parms); |
|
244 |
return foreach_rv; |
|
245 |
}
|
|
246 |
||
247 |
bool drizzle_qcache_flush(Session *session) |
|
248 |
{
|
|
249 |
bool foreach_rv; |
|
250 |
foreach_rv= plugin_foreach(session, |
|
251 |
qcache_flush_iterate, |
|
252 |
DRIZZLE_QCACHE_PLUGIN, |
|
253 |
NULL); |
|
520.2.2
by Mark Atwood
new plugin types, configvar and qcache |
254 |
return foreach_rv; |
255 |
}
|