17
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#include <drizzled/server_includes.h>
21
#include <drizzled/qcache.h>
22
#include <drizzled/gettext.h>
24
int qcache_initializer(st_plugin_int *plugin)
28
p= (qcache_t *) malloc(sizeof(qcache_t));
29
if (p == NULL) return 1;
30
memset(p, 0, sizeof(qcache_t));
32
plugin->data= (void *)p;
34
if (plugin->plugin->init)
36
if (plugin->plugin->init((void *)p))
38
/* TRANSLATORS: The leading word "qcache" is the name
39
of the plugin api, and so should not be translated. */
40
sql_print_error(_("qcache plugin '%s' init() failed"),
52
int qcache_finalizer(st_plugin_int *plugin)
54
qcache_t *p= (qcache_t *) plugin->data;
56
if (plugin->plugin->deinit)
58
if (plugin->plugin->deinit((void *)p))
60
/* TRANSLATORS: The leading word "qcache" is the name
61
of the plugin api, and so should not be translated. */
62
sql_print_error(_("qcache plugin '%s' deinit() failed"),
72
/* The plugin_foreach() iterator requires that we
73
convert all the parameters of a plugin api entry point
74
into just one single void ptr, plus the session.
75
So we will take all the additional paramters of qcache_do1,
76
and marshall them into a struct of this type, and
77
then just pass in a pointer to it.
79
typedef struct qcache_do1_parms_st
85
/* This gets called by plugin_foreach once for each loaded qcache plugin */
86
static bool qcache_do1_iterate (Session *session, plugin_ref plugin, void *p)
88
qcache_t *l= plugin_data(plugin, qcache_t *);
89
qcache_do1_parms_t *parms= (qcache_do1_parms_t *) p;
91
/* call this loaded qcache plugin's qcache_func1 function pointer */
92
if (l && l->qcache_func1)
94
if (l->qcache_func1(session, parms->parm1, parms->parm2))
96
/* TRANSLATORS: The leading word "qcache" is the name
97
of the plugin api, and so should not be translated. */
98
sql_print_error(_("qcache plugin '%s' do1() failed"),
99
(char *)plugin_name(plugin));
106
/* This is the qcache_do1 entry point.
107
This gets called by the rest of the Drizzle server code */
108
bool qcache_do1 (Session *session, void *parm1, void *parm2)
110
qcache_do1_parms_t parms;
113
/* marshall the parameters so they will fit into the foreach */
117
/* call qcache_do1_iterate
118
once for each loaded qcache plugin */
119
foreach_rv= plugin_foreach(session,
121
DRIZZLE_QCACHE_PLUGIN,
126
/* The plugin_foreach() iterator requires that we
127
convert all the parameters of a plugin api entry point
128
into just one single void ptr, plus the session.
129
So we will take all the additional paramters of qcache_do2,
130
and marshall them into a struct of this type, and
131
then just pass in a pointer to it.
133
typedef struct qcache_do2_parms_st
137
} qcache_do2_parms_t;
139
/* This gets called by plugin_foreach once for each loaded qcache plugin */
140
static bool qcache_do2_iterate (Session *session, plugin_ref plugin, void *p)
142
qcache_t *l= plugin_data(plugin, qcache_t *);
143
qcache_do2_parms_t *parms= (qcache_do2_parms_t *) p;
145
/* call this loaded qcache plugin's qcache_func1 function pointer */
146
if (l && l->qcache_func1)
148
if (l->qcache_func2(session, parms->parm3, parms->parm4))
150
/* TRANSLATORS: The leading word "qcache" is the name
151
of the plugin api, and so should not be translated. */
152
sql_print_error(_("qcache plugin '%s' qcache_func2() failed"),
153
(char *)plugin_name(plugin));
161
/* This is the qcache_do2 entry point.
162
This gets called by the rest of the Drizzle server code */
163
bool qcache_do2 (Session *session, void *parm3, void *parm4)
165
qcache_do2_parms_t parms;
168
/* marshall the parameters so they will fit into the foreach */
172
/* call qcache_do2_iterate
173
once for each loaded qcache plugin */
174
foreach_rv= plugin_foreach(session,
176
DRIZZLE_QCACHE_PLUGIN,
22
#include "drizzled/plugin/query_cache.h"
23
#include "drizzled/errmsg_print.h"
25
#include "drizzled/gettext.h"
36
typedef vector<plugin::QueryCache *> QueryCaches;
37
QueryCaches all_query_cache;
39
/* Namespaces are here to prevent global symbol clashes with these classes */
42
: public unary_function<plugin::QueryCache *, bool>
46
IsCachedIterate(Session* session_arg) :
47
unary_function<plugin::QueryCache *, bool>(),
48
session(session_arg) { }
50
inline result_type operator()(argument_type handler)
52
return handler->doIsCached(session);
56
bool plugin::QueryCache::isCached(Session *session)
58
/* Use find_if instead of foreach so that we can collect return codes */
59
QueryCaches::iterator iter=
60
find_if(all_query_cache.begin(), all_query_cache.end(),
61
IsCachedIterate(session));
62
/* If iter is == end() here, that means that all of the plugins returned
63
* false, which in this case means they all succeeded. Since we want to
64
* return false on success, we return the value of the two being !=
66
return iter != all_query_cache.end();
70
class SendCachedResultsetIterate
71
: public unary_function<plugin::QueryCache *, bool>
75
SendCachedResultsetIterate(Session *session_arg) :
76
unary_function<plugin::QueryCache *, bool>(),
77
session(session_arg) { }
79
inline result_type operator()(argument_type handler)
81
return handler->doSendCachedResultset(session);
84
bool plugin::QueryCache::sendCachedResultset(Session *session)
86
/* Use find_if instead of foreach so that we can collect return codes */
87
QueryCaches::iterator iter=
88
find_if(all_query_cache.begin(), all_query_cache.end(),
89
SendCachedResultsetIterate(session));
90
/* If iter is == end() here, that means that all of the plugins returned
91
* false, which in this case means they all succeeded. Since we want to
92
* return false on success, we return the value of the two being !=
94
return iter != all_query_cache.end();
97
class PrepareResultsetIterate
98
: public unary_function<plugin::QueryCache *, bool>
102
PrepareResultsetIterate(Session *session_arg) :
103
unary_function<plugin::QueryCache *, bool>(), session(session_arg) { }
105
inline result_type operator()(argument_type handler)
107
return handler->doPrepareResultset(session);
110
bool plugin::QueryCache::prepareResultset(Session *session)
112
/* Use find_if instead of foreach so that we can collect return codes */
113
QueryCaches::iterator iter=
114
find_if(all_query_cache.begin(), all_query_cache.end(),
115
PrepareResultsetIterate(session));
116
/* If iter is == end() here, that means that all of the plugins returned
117
* false, which in this case means they all succeeded. Since we want to
118
* return false on success, we return the value of the two being !=
120
return iter != all_query_cache.end();
123
class SetResultsetIterate
124
: public unary_function<plugin::QueryCache *, bool>
128
SetResultsetIterate(Session *session_arg) :
129
unary_function<plugin::QueryCache *, bool>(),
130
session(session_arg) { }
132
inline result_type operator()(argument_type handler)
134
return handler->doSetResultset(session);
138
bool plugin::QueryCache::setResultset(Session *session)
140
/* Use find_if instead of foreach so that we can collect return codes */
141
QueryCaches::iterator iter=
142
find_if(all_query_cache.begin(), all_query_cache.end(),
143
SetResultsetIterate(session));
144
/* If iter is == end() here, that means that all of the plugins returned
145
* false, which in this case means they all succeeded. Since we want to
146
* return false on success, we return the value of the two being !=
148
return iter != all_query_cache.end();
151
class InsertRecordIterate
152
: public unary_function<plugin::QueryCache *, bool>
157
InsertRecordIterate(Session *session_arg, List<Item> &item_arg) :
158
unary_function<plugin::QueryCache *, bool>(),
159
session(session_arg), item(item_arg) { }
161
inline result_type operator()(argument_type handler)
163
return handler->doInsertRecord(session, item);
166
bool plugin::QueryCache::insertRecord(Session *session, List<Item> &items)
168
/* Use find_if instead of foreach so that we can collect return codes */
169
QueryCaches::iterator iter=
170
find_if(all_query_cache.begin(), all_query_cache.end(),
171
InsertRecordIterate(session, items));
172
/* If iter is == end() here, that means that all of the plugins returned
173
* false, which in this case means they all succeeded. Since we want to
174
* return false on success, we return the value of the two being !=
176
return iter != all_query_cache.end();
181
bool plugin::QueryCache::addPlugin(plugin::QueryCache *handler)
183
all_query_cache.push_back(handler);
187
void plugin::QueryCache::removePlugin(plugin::QueryCache *handler)
189
all_query_cache.erase(find(all_query_cache.begin(), all_query_cache.end(),
193
} /* namespace drizzled */