00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <config.h>
00033 #include <drizzled/item/func.h>
00034 #include <drizzled/function/str/strfunc.h>
00035
00036 #include "memcached_functions.h"
00037 #include "memc_behavior_set.h"
00038
00039 #include <libmemcached/memcached.h>
00040
00041 #include <string>
00042 #include <algorithm>
00043
00044 using namespace std;
00045 using namespace drizzled;
00046
00047 void MemcachedBehaviorSet::setFailureString(const char *error)
00048 {
00049 size_t size= strlen(error);
00050 failure_buff.realloc(size);
00051 failure_buff.length(size);
00052 memcpy(failure_buff.ptr(), error, size);
00053 }
00054
00055 String *MemcachedBehaviorSet::val_str(String *str)
00056 {
00057 memcached_return rc;
00058 memcached_behavior mbehavior;
00059 uint64_t isetting= 0;
00060 map<const string, memcached_behavior>::iterator it_behav;
00061 map<const string, uint64_t>::iterator it_hash;
00062 map<const string, uint64_t>::iterator it_dist;
00063 String *tmp_behavior;
00064 String *tmp_setting;
00065
00066 if (arg_count != 2 ||
00067 ! (tmp_behavior= args[0]->val_str(str)) ||
00068 ! (tmp_setting= args[1]->val_str(str)) ||
00069 ! memc)
00070 {
00071 setFailureString("USAGE: memc_behavior_set('<behavior type>','<value>')");
00072 return &failure_buff;
00073 }
00074
00075 string behavior(tmp_behavior->c_ptr());
00076 string setting(tmp_setting->c_ptr());
00077
00078
00079
00080
00081
00082 boost::to_upper(behavior);
00083 boost::to_upper(setting);
00084
00085 it_behav= behavior_map.find(behavior);
00086 if (it_behav == behavior_map.end())
00087 {
00088 setFailureString("UNKNOWN BEHAVIOR TYPE!");
00089 return &failure_buff;
00090 }
00091 mbehavior= behavior_map[behavior];
00092
00093 switch (mbehavior)
00094 {
00095 case MEMCACHED_BEHAVIOR_SUPPORT_CAS:
00096 case MEMCACHED_BEHAVIOR_NO_BLOCK:
00097 case MEMCACHED_BEHAVIOR_BUFFER_REQUESTS:
00098 case MEMCACHED_BEHAVIOR_USER_DATA:
00099 case MEMCACHED_BEHAVIOR_SORT_HOSTS:
00100 case MEMCACHED_BEHAVIOR_VERIFY_KEY:
00101 case MEMCACHED_BEHAVIOR_TCP_NODELAY:
00102 case MEMCACHED_BEHAVIOR_KETAMA:
00103 case MEMCACHED_BEHAVIOR_CACHE_LOOKUPS:
00104 if (setting.compare("1") == 0)
00105 {
00106 isetting= 1;
00107 }
00108 else if (setting.compare("0") == 0)
00109 {
00110 isetting= 0;
00111 }
00112 else
00113 {
00114 setFailureString("INVALID VALUE FOR BEHAVIOR - MUST be 1 OR 0!");
00115 return &failure_buff;
00116 }
00117 break;
00118 case MEMCACHED_BEHAVIOR_DISTRIBUTION:
00119 it_dist= dist_settings_map.find(setting);
00120 if (it_dist == dist_settings_map.end())
00121 {
00122 setFailureString("INVALID VALUE FOR DISTRIBUTION!");
00123 return &failure_buff;
00124 }
00125 isetting= dist_settings_map[setting];
00126 break;
00127 case MEMCACHED_BEHAVIOR_HASH:
00128 it_hash= hash_settings_map.find(setting);
00129 if (it_hash == hash_settings_map.end())
00130 {
00131 setFailureString("INVALID VALUE FOR MEMCACHED HASH ALGORITHM!");
00132 return &failure_buff;
00133 }
00134 isetting= hash_settings_map[setting];
00135 break;
00136 case MEMCACHED_BEHAVIOR_KETAMA_HASH:
00137 isetting= ketama_hash_settings_map[setting];
00138 if (! isetting)
00139 {
00140 setFailureString("INVALID VALUE FOR KETAMA HASH ALGORITHM!");
00141 return &failure_buff;
00142 }
00143 break;
00144 case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
00145 case MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE:
00146 case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
00147 case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT:
00148 case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
00149 case MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK:
00150 case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK:
00151
00152
00153
00154
00155 break;
00156 default:
00157 break;
00158 }
00159
00160 rc= memcached_behavior_set(memc, mbehavior, isetting);
00161
00162 if (rc != MEMCACHED_SUCCESS)
00163 {
00164 return &failure_buff;
00165 }
00166
00167 return &success_buff;
00168 }
00169