Drizzled Public API Documentation

memcached_functions.cc
00001 /* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
00002  *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
00003  *
00004  * Copyright (C) 2009, Patrick "CaptTofu" Galbraith, Padraig O'Sullivan
00005  * All rights reserved.
00006  *
00007  * Redistribution and use in source and binary forms, with or without
00008  * modification, are permitted provided that the following conditions are met:
00009  *
00010  *   * Redistributions of source code must retain the above copyright notice,
00011  *     this list of conditions and the following disclaimer.
00012  *   * Redistributions in binary form must reproduce the above copyright notice,
00013  *     this list of conditions and the following disclaimer in the documentation
00014  *     and/or other materials provided with the distribution.
00015  *   * Neither the name of Patrick Galbraith nor the names of its contributors
00016  *     may be used to endorse or promote products derived from this software
00017  *     without specific prior written permission.
00018  *
00019  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00020  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00021  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00022  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00023  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00024  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00025  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00026  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00027  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00028  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
00029  * THE POSSIBILITY OF SUCH DAMAGE.
00030  */
00031 
00032 #include <config.h>
00033 #include <drizzled/function/str/strfunc.h>
00034 #include <drizzled/plugin/function.h>
00035 
00036 #include "memcached_functions.h"
00037 #include "memc_servers_set.h"
00038 #include "memc_behavior_set.h"
00039 #include "memc_behavior_get.h"
00040 #include "memc_stats.h"
00041 #include "memc_get.h"
00042 #include "memc_get_by_key.h"
00043 #include "memc_set.h"
00044 #include "memc_set_by_key.h"
00045 #include "memc_add.h"
00046 #include "memc_add_by_key.h"
00047 #include "memc_replace.h"
00048 #include "memc_replace_by_key.h"
00049 #include "memc_delete.h"
00050 #include "memc_delete_by_key.h"
00051 #include "memc_append.h"
00052 #include "memc_append_by_key.h"
00053 #include "memc_prepend.h"
00054 #include "memc_prepend_by_key.h"
00055 #include "memc_cas.h"
00056 #include "memc_cas_by_key.h"
00057 #include "memc_increment.h"
00058 #include "memc_decrement.h"
00059 #include "memc_misc.h"
00060 
00061 #include <libmemcached/memcached.h>
00062 
00063 #include <string>
00064 
00065 using namespace std;
00066 using namespace drizzled;
00067 
00068 /*
00069  * A global memcached data structure needed by
00070  * the various libmemcached API functions.
00071  */
00072 memcached_st *memc= NULL;
00073 
00074 /*
00075  * The memcached UDF's.
00076  */
00077 plugin::Create_function<MemcachedServersSet> *memc_servers_set= NULL;
00078 plugin::Create_function<MemcachedBehaviorSet> *memc_behavior_set= NULL;
00079 plugin::Create_function<MemcachedBehaviorGet> *memc_behavior_get= NULL;
00080 plugin::Create_function<MemcachedStats> *memc_stats= NULL;
00081 plugin::Create_function<MemcachedGet> *memc_get= NULL;
00082 plugin::Create_function<MemcachedGetByKey> *memc_get_by_key= NULL;
00083 plugin::Create_function<MemcachedSet> *memc_set= NULL;
00084 plugin::Create_function<MemcachedSetByKey> *memc_set_by_key= NULL;
00085 plugin::Create_function<MemcachedAdd> *memc_add= NULL;
00086 plugin::Create_function<MemcachedAddByKey> *memc_add_by_key= NULL;
00087 plugin::Create_function<MemcachedReplace> *memc_replace= NULL;
00088 plugin::Create_function<MemcachedReplaceByKey> *memc_replace_by_key= NULL;
00089 plugin::Create_function<MemcachedIncrement> *memc_increment= NULL;
00090 plugin::Create_function<MemcachedDecrement> *memc_decrement= NULL;
00091 plugin::Create_function<MemcachedDelete> *memc_delete= NULL;
00092 plugin::Create_function<MemcachedDeleteByKey> *memc_delete_by_key= NULL;
00093 plugin::Create_function<MemcachedAppend> *memc_append= NULL;
00094 plugin::Create_function<MemcachedAppendByKey> *memc_append_by_key= NULL;
00095 plugin::Create_function<MemcachedPrepend> *memc_prepend= NULL;
00096 plugin::Create_function<MemcachedPrependByKey> *memc_prepend_by_key= NULL;
00097 plugin::Create_function<MemcachedCas> *memc_cas= NULL;
00098 plugin::Create_function<MemcachedCasByKey> *memc_cas_by_key= NULL;
00099 plugin::Create_function<MemcachedServerCount> *memc_serv_count= NULL;
00100 plugin::Create_function<MemcachedVersion> *memc_version= NULL;
00101 
00102 bool initMemcUDF()
00103 {
00104   memc_servers_set= new plugin::Create_function<MemcachedServersSet>("memc_servers_set");
00105   if (memc_servers_set == NULL)
00106   {
00107     return true;
00108   }
00109 
00110   memc_behavior_set= new plugin::Create_function<MemcachedBehaviorSet>("memc_behavior_set");
00111   if (memc_behavior_set == NULL)
00112   {
00113     return true;
00114   }
00115 
00116   memc_behavior_get= new plugin::Create_function<MemcachedBehaviorGet>("memc_behavior_get");
00117   if (memc_behavior_get == NULL)
00118   {
00119     return true;
00120   }
00121 
00122   memc_stats= new plugin::Create_function<MemcachedStats>("memc_stats");
00123   if (memc_stats == NULL)
00124   {
00125     return true;
00126   }
00127 
00128   memc_get= new plugin::Create_function<MemcachedGet>("memc_get");
00129   if (memc_get == NULL)
00130   {
00131     return true;
00132   }
00133 
00134   memc_get_by_key= new plugin::Create_function<MemcachedGetByKey>("memc_get_by_key");
00135   if (memc_get_by_key == NULL)
00136   {
00137     return true;
00138   }
00139 
00140   memc_set= new plugin::Create_function<MemcachedSet>("memc_set");
00141   if (memc_set == NULL)
00142   {
00143     return true;
00144   }
00145   memc_set_by_key= new plugin::Create_function<MemcachedSetByKey>("memc_set_by_key");
00146   if (memc_set_by_key == NULL)
00147   {
00148     return true;
00149   }
00150 
00151   memc_add= new plugin::Create_function<MemcachedAdd>("memc_add");
00152   if (memc_add== NULL)
00153   {
00154     return true;
00155   }
00156 
00157   memc_add_by_key= new plugin::Create_function<MemcachedAddByKey>("memc_add_by_key");
00158   if (memc_add_by_key == NULL)
00159   {
00160     return true;
00161   }
00162 
00163   memc_replace= new plugin::Create_function<MemcachedReplace>("memc_replace");
00164   if (memc_replace== NULL)
00165   {
00166     return true;
00167   }
00168 
00169   memc_replace_by_key= new plugin::Create_function<MemcachedReplaceByKey>("memc_replace_by_key");
00170   if (memc_replace_by_key == NULL)
00171   {
00172     return true;
00173   }
00174 
00175   memc_delete= new plugin::Create_function<MemcachedDelete>("memc_delete");
00176   if (memc_delete == NULL)
00177   {
00178     return true;
00179   }
00180 
00181   memc_delete_by_key= new plugin::Create_function<MemcachedDeleteByKey>("memc_delete_by_key");
00182   if (memc_delete_by_key == NULL)
00183   {
00184     return true;
00185   }
00186 
00187   memc_append= new plugin::Create_function<MemcachedAppend>("memc_append");
00188   if (memc_append == NULL)
00189   {
00190     return true;
00191   }
00192 
00193   memc_append_by_key= new plugin::Create_function<MemcachedAppendByKey>("memc_append_by_key");
00194   if (memc_append_by_key == NULL)
00195   {
00196     return true;
00197   }
00198 
00199   memc_prepend= new plugin::Create_function<MemcachedPrepend>("memc_prepend");
00200   if (memc_prepend == NULL)
00201   {
00202     return true;
00203   }
00204 
00205   memc_prepend_by_key= new plugin::Create_function<MemcachedPrependByKey>("memc_prepend_by_key");
00206   if (memc_prepend_by_key == NULL)
00207   {
00208     return true;
00209   }
00210 
00211   memc_cas= new plugin::Create_function<MemcachedCas>("memc_cas");
00212   if (memc_cas == NULL)
00213   {
00214     return true;
00215   }
00216 
00217   memc_cas_by_key= new plugin::Create_function<MemcachedCasByKey>("memc_cas_by_key");
00218   if (memc_cas_by_key == NULL)
00219   {
00220     return true;
00221   }
00222 
00223   memc_serv_count= new plugin::Create_function<MemcachedServerCount>("memc_server_count");
00224   if (memc_serv_count == NULL)
00225   {
00226     return true;
00227   }
00228 
00229   memc_version= new plugin::Create_function<MemcachedVersion>("memc_libmemcached_version");
00230   if (memc_version == NULL)
00231   {
00232     return true;
00233   }
00234 
00235   memc_increment= new plugin::Create_function<MemcachedIncrement>("memc_increment");
00236   if (memc_increment == NULL)
00237   {
00238     return true;
00239   }
00240 
00241   memc_decrement= new plugin::Create_function<MemcachedDecrement>("memc_decrement");
00242   if (memc_decrement == NULL)
00243   {
00244     return true;
00245   }
00246 
00247   return false;
00248 }
00249 
00250 void cleanupMemcUDF()
00251 {
00252   delete memc_servers_set;
00253   delete memc_behavior_set;
00254   delete memc_behavior_get;
00255   delete memc_stats;
00256   delete memc_get;
00257   delete memc_get_by_key;
00258   delete memc_set;
00259   delete memc_set_by_key;
00260   delete memc_add;
00261   delete memc_add_by_key;
00262   delete memc_replace;
00263   delete memc_replace_by_key;
00264   delete memc_delete;
00265   delete memc_delete_by_key;
00266   delete memc_append;
00267   delete memc_append_by_key;
00268   delete memc_prepend;
00269   delete memc_prepend_by_key;
00270   delete memc_cas;
00271   delete memc_cas_by_key;
00272   delete memc_serv_count;
00273   delete memc_version;
00274   delete memc_increment;
00275   delete memc_decrement;
00276 }
00277 
00278 static int memcachedInit(drizzled::module::Context &context)
00279 {
00280   if (initMemcUDF())
00281   {
00282     return 1;
00283   }
00284 
00285   memc= memcached_create(NULL);
00286 
00287   context.add(memc_servers_set);
00288   context.add(memc_behavior_set);
00289   context.add(memc_behavior_get);
00290   context.add(memc_stats);
00291   context.add(memc_get);
00292   context.add(memc_get_by_key);
00293   context.add(memc_set);
00294   context.add(memc_set_by_key);
00295   context.add(memc_add);
00296   context.add(memc_add_by_key);
00297   context.add(memc_replace);
00298   context.add(memc_replace_by_key);
00299   context.add(memc_delete);
00300   context.add(memc_delete_by_key);
00301   context.add(memc_append);
00302   context.add(memc_append_by_key);
00303   context.add(memc_prepend);
00304   context.add(memc_prepend_by_key);
00305   context.add(memc_cas);
00306   context.add(memc_cas_by_key);
00307   context.add(memc_serv_count);
00308   context.add(memc_version);
00309   context.add(memc_increment);
00310   context.add(memc_decrement);
00311 
00312   return 0;
00313 }
00314 
00315 static int memcachedDone(drizzled::module::Context &context)
00316 {
00317 
00318   memcached_free(memc);
00319 
00320   context.remove(memc_servers_set);
00321   context.remove(memc_behavior_set);
00322   context.remove(memc_behavior_get);
00323   context.remove(memc_stats);
00324   context.remove(memc_get);
00325   context.remove(memc_get_by_key);
00326   context.remove(memc_set);
00327   context.remove(memc_set_by_key);
00328   context.remove(memc_add);
00329   context.remove(memc_add_by_key);
00330   context.remove(memc_replace);
00331   context.remove(memc_replace_by_key);
00332   context.remove(memc_delete);
00333   context.remove(memc_delete_by_key);
00334   context.remove(memc_append);
00335   context.remove(memc_append_by_key);
00336   context.remove(memc_prepend);
00337   context.remove(memc_prepend_by_key);
00338   context.remove(memc_cas);
00339   context.remove(memc_cas_by_key);
00340   context.remove(memc_serv_count);
00341   context.remove(memc_version);
00342   context.remove(memc_increment);
00343   context.remove(memc_decrement);
00344 
00345   cleanupMemcUDF();
00346 
00347   return 0;
00348 }
00349 
00350 DRIZZLE_DECLARE_PLUGIN
00351 {
00352   DRIZZLE_VERSION_ID,
00353   "memcached_functions",
00354   "0.1",
00355   "Patrick Galbraith, Ronald Bradford, Padraig O'Sullivan",
00356   "Memcached UDF Plugin",
00357   PLUGIN_LICENSE_GPL,
00358   memcachedInit,
00359   memcachedDone,
00360   NULL,
00361   NULL
00362 }
00363 DRIZZLE_DECLARE_PLUGIN_END;