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 std::transform(behavior.begin(), behavior.end(),
00083 behavior.begin(), ::toupper);
00084 std::transform(setting.begin(), setting.end(),
00085 setting.begin(), ::toupper);
00086
00087 it_behav= behavior_map.find(behavior);
00088 if (it_behav == behavior_map.end())
00089 {
00090 setFailureString("UNKNOWN BEHAVIOR TYPE!");
00091 return &failure_buff;
00092 }
00093 mbehavior= behavior_map[behavior];
00094
00095 switch (mbehavior)
00096 {
00097 case MEMCACHED_BEHAVIOR_SUPPORT_CAS:
00098 case MEMCACHED_BEHAVIOR_NO_BLOCK:
00099 case MEMCACHED_BEHAVIOR_BUFFER_REQUESTS:
00100 case MEMCACHED_BEHAVIOR_USER_DATA:
00101 case MEMCACHED_BEHAVIOR_SORT_HOSTS:
00102 case MEMCACHED_BEHAVIOR_VERIFY_KEY:
00103 case MEMCACHED_BEHAVIOR_TCP_NODELAY:
00104 case MEMCACHED_BEHAVIOR_KETAMA:
00105 case MEMCACHED_BEHAVIOR_CACHE_LOOKUPS:
00106 if (setting.compare("1") == 0)
00107 {
00108 isetting= 1;
00109 }
00110 else if (setting.compare("0") == 0)
00111 {
00112 isetting= 0;
00113 }
00114 else
00115 {
00116 setFailureString("INVALID VALUE FOR BEHAVIOR - MUST be 1 OR 0!");
00117 return &failure_buff;
00118 }
00119 break;
00120 case MEMCACHED_BEHAVIOR_DISTRIBUTION:
00121 it_dist= dist_settings_map.find(setting);
00122 if (it_dist == dist_settings_map.end())
00123 {
00124 setFailureString("INVALID VALUE FOR DISTRIBUTION!");
00125 return &failure_buff;
00126 }
00127 isetting= dist_settings_map[setting];
00128 break;
00129 case MEMCACHED_BEHAVIOR_HASH:
00130 it_hash= hash_settings_map.find(setting);
00131 if (it_hash == hash_settings_map.end())
00132 {
00133 setFailureString("INVALID VALUE FOR MEMCACHED HASH ALGORITHM!");
00134 return &failure_buff;
00135 }
00136 isetting= hash_settings_map[setting];
00137 break;
00138 case MEMCACHED_BEHAVIOR_KETAMA_HASH:
00139 isetting= ketama_hash_settings_map[setting];
00140 if (! isetting)
00141 {
00142 setFailureString("INVALID VALUE FOR KETAMA HASH ALGORITHM!");
00143 return &failure_buff;
00144 }
00145 break;
00146 case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
00147 case MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE:
00148 case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
00149 case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT:
00150 case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
00151 case MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK:
00152 case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK:
00153
00154
00155
00156
00157 break;
00158 default:
00159 break;
00160 }
00161
00162 rc= memcached_behavior_set(memc, mbehavior, isetting);
00163
00164 if (rc != MEMCACHED_SUCCESS)
00165 {
00166 return &failure_buff;
00167 }
00168
00169 return &success_buff;
00170 }
00171