~drizzle-trunk/drizzle/development

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
}