00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include <boost/unordered_map.hpp>
00025
00026 #include <drizzled/gettext.h>
00027 #include <drizzled/plugin/function.h>
00028 #include <drizzled/function_container.h>
00029 #include <drizzled/util/find_ptr.h>
00030 #include <drizzled/util/string.h>
00031
00032 namespace drizzled
00033 {
00034
00035 static plugin::Function::UdfMap udf_registry;
00036
00037 const plugin::Function::UdfMap &plugin::Function::getMap()
00038 {
00039 return udf_registry;
00040 }
00041
00042 bool plugin::Function::addPlugin(const plugin::Function *udf)
00043 {
00044 if (FunctionContainer::getMap().count(udf->getName()))
00045 {
00046 errmsg_printf(error::ERROR,
00047 _("A function named %s already exists!\n"),
00048 udf->getName().c_str());
00049 return true;
00050 }
00051
00052 if (udf_registry.count(udf->getName()))
00053 {
00054 errmsg_printf(error::ERROR,
00055 _("A function named %s already exists!\n"),
00056 udf->getName().c_str());
00057 return true;
00058 }
00059
00060 std::pair<UdfMap::iterator, bool> ret=
00061 udf_registry.insert(make_pair(udf->getName(), udf));
00062
00063 if (ret.second == false)
00064 {
00065 errmsg_printf(error::ERROR,
00066 _("Could not add Function!\n"));
00067 return true;
00068 }
00069
00070 return false;
00071 }
00072
00073
00074 void plugin::Function::removePlugin(const plugin::Function *udf)
00075 {
00076 udf_registry.erase(udf->getName());
00077 }
00078
00079 const plugin::Function *plugin::Function::get(const std::string &name)
00080 {
00081 UdfMap::mapped_type* ptr= find_ptr(udf_registry, name);
00082 return ptr ? *ptr : NULL;
00083 }
00084
00085 }