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_get.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 MemcachedBehaviorGet::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 *MemcachedBehaviorGet::val_str(String *str)
00056 {
00057 String *tmp_behavior;
00058
00059 if (arg_count != 1 ||
00060 ! (tmp_behavior= args[0]->val_str(str)) ||
00061 ! memc)
00062 {
00063 setFailureString("USAGE: memc_behavior_get('<behavior type>')");
00064 return &failure_buff;
00065 }
00066
00067
00068
00069
00070
00071
00072 memcached_behavior* it = find_ptr(behavior_map, boost::to_upper_copy(string(tmp_behavior->c_ptr())));
00073 if (not it)
00074 {
00075 setFailureString("UNKNOWN BEHAVIOR TYPE!");
00076 return &failure_buff;
00077 }
00078
00079 memcached_behavior mbehavior= *it;
00080
00081 uint64_t isetting= memcached_behavior_get(memc, mbehavior);
00082
00083 switch (mbehavior)
00084 {
00085 case MEMCACHED_BEHAVIOR_SUPPORT_CAS:
00086 case MEMCACHED_BEHAVIOR_NO_BLOCK:
00087 case MEMCACHED_BEHAVIOR_BUFFER_REQUESTS:
00088 case MEMCACHED_BEHAVIOR_USER_DATA:
00089 case MEMCACHED_BEHAVIOR_SORT_HOSTS:
00090 case MEMCACHED_BEHAVIOR_VERIFY_KEY:
00091 case MEMCACHED_BEHAVIOR_TCP_NODELAY:
00092 case MEMCACHED_BEHAVIOR_KETAMA:
00093 case MEMCACHED_BEHAVIOR_CACHE_LOOKUPS:
00094 if (isetting == 1)
00095 return_buff.append("1");
00096 else if (isetting == 0)
00097 return_buff.append("0");
00098 else
00099 {
00100 setFailureString("INVALID VALUE FOR BEHAVIOR - MUST be 1 OR 0!");
00101 return &failure_buff;
00102 }
00103 break;
00104 case MEMCACHED_BEHAVIOR_DISTRIBUTION:
00105 {
00106 string setting(dist_settings_reverse_map[isetting]);
00107 return_buff.append(setting.c_str());
00108 }
00109 break;
00110 case MEMCACHED_BEHAVIOR_HASH:
00111 {
00112 string setting(hash_settings_reverse_map[isetting]);
00113 return_buff.append(setting.c_str());
00114 }
00115 break;
00116 case MEMCACHED_BEHAVIOR_KETAMA_HASH:
00117 {
00118 string setting(ketama_hash_settings_reverse_map[isetting]);
00119 return_buff.append(setting.c_str());
00120 }
00121 break;
00122 case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
00123 case MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE:
00124 case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
00125 case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT:
00126 case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
00127 case MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK:
00128 case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK:
00129 {
00130 size_t setting_len= 0;
00131 char tmp_buff[16];
00132
00133 snprintf(tmp_buff, 16, "%"PRIu64, isetting);
00134 setting_len= strlen(tmp_buff);
00135 return_buff.realloc(setting_len);
00136 return_buff.length(setting_len);
00137 memcpy(return_buff.ptr(),tmp_buff, setting_len);
00138 }
00139 break;
00140 default:
00141 break;
00142 }
00143
00144 return &return_buff;
00145 }