~drizzle-trunk/drizzle/development

1166.5.1 by Patrick Galbraith
Starting over with a fresh tree, moved in memcached functions.
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 * Copyright (c) 2009, Patrick "CaptTofu" Galbraith, Padraig O'Sullivan
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions are met:
9
 *
10
 *   * Redistributions of source code must retain the above copyright notice,
11
 *     this list of conditions and the following disclaimer.
12
 *   * Redistributions in binary form must reproduce the above copyright notice,
13
 *     this list of conditions and the following disclaimer in the documentation
14
 *     and/or other materials provided with the distribution.
15
 *   * Neither the name of Patrick Galbraith nor the names of its contributors
16
 *     may be used to endorse or promote products derived from this software
17
 *     without specific prior written permission.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29
 * THE POSSIBILITY OF SUCH DAMAGE.
30
 */
31
1241.9.36 by Monty Taylor
ZOMG. I deleted drizzled/server_includes.h.
32
#include "config.h"
1166.5.1 by Patrick Galbraith
Starting over with a fresh tree, moved in memcached functions.
33
#include <drizzled/function/str/strfunc.h>
34
#include <drizzled/plugin/function.h>
35
36
#include "memcached_functions.h"
37
#include "memc_servers_set.h"
38
#include "memc_behavior_set.h"
39
#include "memc_behavior_get.h"
40
#include "memc_stats.h"
41
#include "memc_get.h"
42
#include "memc_get_by_key.h"
43
#include "memc_set.h"
44
#include "memc_set_by_key.h"
45
#include "memc_add.h"
46
#include "memc_add_by_key.h"
47
#include "memc_replace.h"
48
#include "memc_replace_by_key.h"
49
#include "memc_delete.h"
50
#include "memc_delete_by_key.h"
51
#include "memc_append.h"
52
#include "memc_append_by_key.h"
53
#include "memc_prepend.h"
54
#include "memc_prepend_by_key.h"
55
#include "memc_cas.h"
56
#include "memc_cas_by_key.h"
57
#include "memc_increment.h"
58
#include "memc_decrement.h"
59
#include "memc_misc.h"
60
61
#include <libmemcached/memcached.h>
62
63
#include <string>
64
65
using namespace std;
66
using namespace drizzled;
67
68
/*
69
 * A global memcached data structure needed by
70
 * the various libmemcached API functions.
71
 */
72
memcached_st *memc= NULL;
73
74
/*
75
 * The memcached UDF's.
76
 */
77
plugin::Create_function<MemcachedServersSet> *memc_servers_set= NULL;
78
plugin::Create_function<MemcachedBehaviorSet> *memc_behavior_set= NULL;
79
plugin::Create_function<MemcachedBehaviorGet> *memc_behavior_get= NULL;
80
plugin::Create_function<MemcachedStats> *memc_stats= NULL;
81
plugin::Create_function<MemcachedGet> *memc_get= NULL;
82
plugin::Create_function<MemcachedGetByKey> *memc_get_by_key= NULL;
83
plugin::Create_function<MemcachedSet> *memc_set= NULL;
84
plugin::Create_function<MemcachedSetByKey> *memc_set_by_key= NULL;
85
plugin::Create_function<MemcachedAdd> *memc_add= NULL;
86
plugin::Create_function<MemcachedAddByKey> *memc_add_by_key= NULL;
87
plugin::Create_function<MemcachedReplace> *memc_replace= NULL;
88
plugin::Create_function<MemcachedReplaceByKey> *memc_replace_by_key= NULL;
89
plugin::Create_function<MemcachedIncrement> *memc_increment= NULL;
90
plugin::Create_function<MemcachedDecrement> *memc_decrement= NULL;
91
plugin::Create_function<MemcachedDelete> *memc_delete= NULL;
92
plugin::Create_function<MemcachedDeleteByKey> *memc_delete_by_key= NULL;
93
plugin::Create_function<MemcachedAppend> *memc_append= NULL;
94
plugin::Create_function<MemcachedAppendByKey> *memc_append_by_key= NULL;
95
plugin::Create_function<MemcachedPrepend> *memc_prepend= NULL;
96
plugin::Create_function<MemcachedPrependByKey> *memc_prepend_by_key= NULL;
97
plugin::Create_function<MemcachedCas> *memc_cas= NULL;
98
plugin::Create_function<MemcachedCasByKey> *memc_cas_by_key= NULL;
99
plugin::Create_function<MemcachedServerCount> *memc_serv_count= NULL;
100
plugin::Create_function<MemcachedVersion> *memc_version= NULL;
101
102
bool initMemcUDF()
103
{
104
  memc_servers_set= new plugin::Create_function<MemcachedServersSet>("memc_servers_set");
105
  if (memc_servers_set == NULL)
106
  {
107
    return true;
108
  }
109
110
  memc_behavior_set= new plugin::Create_function<MemcachedBehaviorSet>("memc_behavior_set");
111
  if (memc_behavior_set == NULL)
112
  {
113
    return true;
114
  }
115
116
  memc_behavior_get= new plugin::Create_function<MemcachedBehaviorGet>("memc_behavior_get");
117
  if (memc_behavior_get == NULL)
118
  {
119
    return true;
120
  }
121
122
  memc_stats= new plugin::Create_function<MemcachedStats>("memc_stats");
123
  if (memc_stats == NULL)
124
  {
125
    return true;
126
  }
127
128
  memc_get= new plugin::Create_function<MemcachedGet>("memc_get");
129
  if (memc_get == NULL)
130
  {
131
    return true;
132
  }
133
134
  memc_get_by_key= new plugin::Create_function<MemcachedGetByKey>("memc_get_by_key");
135
  if (memc_get_by_key == NULL)
136
  {
137
    return true;
138
  }
139
140
  memc_set= new plugin::Create_function<MemcachedSet>("memc_set");
141
  if (memc_set == NULL)
142
  {
143
    return true;
144
  }
145
  memc_set_by_key= new plugin::Create_function<MemcachedSetByKey>("memc_set_by_key");
146
  if (memc_set_by_key == NULL)
147
  {
148
    return true;
149
  }
150
151
  memc_add= new plugin::Create_function<MemcachedAdd>("memc_add");
152
  if (memc_add== NULL)
153
  {
154
    return true;
155
  }
156
157
  memc_add_by_key= new plugin::Create_function<MemcachedAddByKey>("memc_add_by_key");
158
  if (memc_add_by_key == NULL)
159
  {
160
    return true;
161
  }
162
163
  memc_replace= new plugin::Create_function<MemcachedReplace>("memc_replace");
164
  if (memc_replace== NULL)
165
  {
166
    return true;
167
  }
168
169
  memc_replace_by_key= new plugin::Create_function<MemcachedReplaceByKey>("memc_replace_by_key");
170
  if (memc_replace_by_key == NULL)
171
  {
172
    return true;
173
  }
174
175
  memc_delete= new plugin::Create_function<MemcachedDelete>("memc_delete");
176
  if (memc_delete == NULL)
177
  {
178
    return true;
179
  }
180
181
  memc_delete_by_key= new plugin::Create_function<MemcachedDeleteByKey>("memc_delete_by_key");
182
  if (memc_delete_by_key == NULL)
183
  {
184
    return true;
185
  }
186
187
  memc_append= new plugin::Create_function<MemcachedAppend>("memc_append");
188
  if (memc_append == NULL)
189
  {
190
    return true;
191
  }
192
193
  memc_append_by_key= new plugin::Create_function<MemcachedAppendByKey>("memc_append_by_key");
194
  if (memc_append_by_key == NULL)
195
  {
196
    return true;
197
  }
198
199
  memc_prepend= new plugin::Create_function<MemcachedPrepend>("memc_prepend");
200
  if (memc_prepend == NULL)
201
  {
202
    return true;
203
  }
204
205
  memc_prepend_by_key= new plugin::Create_function<MemcachedPrependByKey>("memc_prepend_by_key");
206
  if (memc_prepend_by_key == NULL)
207
  {
208
    return true;
209
  }
210
211
  memc_cas= new plugin::Create_function<MemcachedCas>("memc_cas");
212
  if (memc_cas == NULL)
213
  {
214
    return true;
215
  }
216
217
  memc_cas_by_key= new plugin::Create_function<MemcachedCasByKey>("memc_cas_by_key");
218
  if (memc_cas_by_key == NULL)
219
  {
220
    return true;
221
  }
222
223
  memc_serv_count= new plugin::Create_function<MemcachedServerCount>("memc_server_count");
224
  if (memc_serv_count == NULL)
225
  {
226
    return true;
227
  }
228
229
  memc_version= new plugin::Create_function<MemcachedVersion>("memc_libmemcached_version");
230
  if (memc_version == NULL)
231
  {
232
    return true;
233
  }
234
235
  memc_increment= new plugin::Create_function<MemcachedIncrement>("memc_increment");
236
  if (memc_increment == NULL)
237
  {
238
    return true;
239
  }
240
241
  memc_decrement= new plugin::Create_function<MemcachedDecrement>("memc_decrement");
242
  if (memc_decrement == NULL)
243
  {
244
    return true;
245
  }
246
247
  return false;
248
}
249
250
void cleanupMemcUDF()
251
{
252
  delete memc_servers_set;
253
  delete memc_behavior_set;
254
  delete memc_behavior_get;
255
  delete memc_stats;
256
  delete memc_get;
257
  delete memc_get_by_key;
258
  delete memc_set;
259
  delete memc_set_by_key;
260
  delete memc_add;
261
  delete memc_add_by_key;
262
  delete memc_replace;
263
  delete memc_replace_by_key;
264
  delete memc_delete;
265
  delete memc_delete_by_key;
266
  delete memc_append;
267
  delete memc_append_by_key;
268
  delete memc_prepend;
269
  delete memc_prepend_by_key;
270
  delete memc_cas;
271
  delete memc_cas_by_key;
272
  delete memc_serv_count;
273
  delete memc_version;
274
  delete memc_increment;
275
  delete memc_decrement;
276
}
277
278
static int memcachedInit(drizzled::plugin::Registry &registry)
279
{
280
  if (initMemcUDF())
281
  {
282
    return 1;
283
  }
284
285
  memc= memcached_create(NULL);
286
287
  registry.add(memc_servers_set);
288
  registry.add(memc_behavior_set);
289
  registry.add(memc_behavior_get);
290
  registry.add(memc_stats);
291
  registry.add(memc_get);
292
  registry.add(memc_get_by_key);
293
  registry.add(memc_set);
294
  registry.add(memc_set_by_key);
295
  registry.add(memc_add);
296
  registry.add(memc_add_by_key);
297
  registry.add(memc_replace);
298
  registry.add(memc_replace_by_key);
299
  registry.add(memc_delete);
300
  registry.add(memc_delete_by_key);
301
  registry.add(memc_append);
302
  registry.add(memc_append_by_key);
303
  registry.add(memc_prepend);
304
  registry.add(memc_prepend_by_key);
305
  registry.add(memc_cas);
306
  registry.add(memc_cas_by_key);
307
  registry.add(memc_serv_count);
308
  registry.add(memc_version);
309
  registry.add(memc_increment);
310
  registry.add(memc_decrement);
311
312
  return 0;
313
}
314
315
static int memcachedDone(drizzled::plugin::Registry &registry)
316
{
317
318
  memcached_free(memc);
319
320
  registry.remove(memc_servers_set);
321
  registry.remove(memc_behavior_set);
322
  registry.remove(memc_behavior_get);
323
  registry.remove(memc_stats);
324
  registry.remove(memc_get);
325
  registry.remove(memc_get_by_key);
326
  registry.remove(memc_set);
327
  registry.remove(memc_set_by_key);
328
  registry.remove(memc_add);
329
  registry.remove(memc_add_by_key);
330
  registry.remove(memc_replace);
331
  registry.remove(memc_replace_by_key);
332
  registry.remove(memc_delete);
333
  registry.remove(memc_delete_by_key);
334
  registry.remove(memc_append);
335
  registry.remove(memc_append_by_key);
336
  registry.remove(memc_prepend);
337
  registry.remove(memc_prepend_by_key);
338
  registry.remove(memc_cas);
339
  registry.remove(memc_cas_by_key);
340
  registry.remove(memc_serv_count);
341
  registry.remove(memc_version);
342
  registry.remove(memc_increment);
343
  registry.remove(memc_decrement);
344
1166.6.4 by Padraig O'Sullivan
Fixes for various valgrind errors in the memcached functions.
345
  cleanupMemcUDF();
1166.5.1 by Patrick Galbraith
Starting over with a fresh tree, moved in memcached functions.
346
347
  return 0;
348
}
349
1228.1.5 by Monty Taylor
Merged in some naming things.
350
DRIZZLE_DECLARE_PLUGIN
1166.5.1 by Patrick Galbraith
Starting over with a fresh tree, moved in memcached functions.
351
{
1241.10.2 by Monty Taylor
Added support for embedding the drizzle version number in the plugin file.
352
  DRIZZLE_VERSION_ID,
1166.5.1 by Patrick Galbraith
Starting over with a fresh tree, moved in memcached functions.
353
  "memcached_functions",
354
  "0.1",
355
  "Patrick Galbraith, Ronald Bradford, Padraig O'Sullivan",
356
  "Memcached UDF Plugin",
357
  PLUGIN_LICENSE_GPL,
358
  memcachedInit,
359
  memcachedDone,
360
  NULL,
361
  NULL
362
}
1228.1.5 by Monty Taylor
Merged in some naming things.
363
DRIZZLE_DECLARE_PLUGIN_END;