32 #include "stats_table.h"
34 #include <drizzled/error.h>
35 #include <libmemcached/server.h>
37 #if !defined(HAVE_MEMCACHED_SERVER_FN)
38 typedef memcached_server_function memcached_server_fn;
41 namespace drizzle_plugin
45 memcached_return server_function(
const memcached_st *ptr,
46 memcached_server_st *server,
53 : generator(generator_arg)
59 memcached_return server_function(
const memcached_st *memc,
60 memcached_server_st *server,
65 const char *server_name= memcached_server_name(*memc, *server);
66 in_port_t server_port= memcached_server_port(*memc, *server);
68 memcached_stat_st stats;
69 memcached_return ret= memcached_stat_servername(&stats, NULL,
70 server_name, server_port);
72 if (ret != MEMCACHED_SUCCESS)
74 my_printf_error(ER_UNKNOWN_ERROR, _(
"Unable get stats from memcached server %s. Got error from memcached_stat_servername()."), MYF(0), server_name);
78 char **list= memcached_stat_get_keys((memcached_st *)memc, &stats, &ret);
81 ctx->generator->push(server_name);
82 ctx->generator->push(static_cast<uint64_t>(server_port));
84 for (ptr= list; *ptr; ptr++)
86 char *value= memcached_stat_get_value((memcached_st *)memc, &stats, *ptr, &ret);
87 ctx->generator->push(value);
92 return MEMCACHED_SUCCESS;
96 StatsTableTool::StatsTableTool() :
97 plugin::TableFunction(
"DATA_DICTIONARY",
"MEMCACHED_STATS")
100 add_field(
"PORT_NUMBER", plugin::TableFunction::NUMBER);
101 add_field(
"PROCESS_ID", plugin::TableFunction::NUMBER);
102 add_field(
"UPTIME", plugin::TableFunction::NUMBER);
103 add_field(
"TIME", plugin::TableFunction::NUMBER);
104 add_field(
"VERSION");
105 add_field(
"POINTER_SIZE", plugin::TableFunction::NUMBER);
106 add_field(
"RUSAGE_USER", plugin::TableFunction::NUMBER);
107 add_field(
"RUSAGE_SYSTEM", plugin::TableFunction::NUMBER);
108 add_field(
"CURRENT_ITEMS", plugin::TableFunction::NUMBER);
109 add_field(
"TOTAL_ITEMS", plugin::TableFunction::NUMBER);
110 add_field(
"BYTES", plugin::TableFunction::NUMBER);
111 add_field(
"CURRENT_CONNECTIONS", plugin::TableFunction::NUMBER);
112 add_field(
"TOTAL_CONNECTIONS", plugin::TableFunction::NUMBER);
113 add_field(
"CONNECTION_STRUCTURES", plugin::TableFunction::NUMBER);
114 add_field(
"GETS", plugin::TableFunction::NUMBER);
115 add_field(
"SETS", plugin::TableFunction::NUMBER);
116 add_field(
"HITS", plugin::TableFunction::NUMBER);
117 add_field(
"MISSES", plugin::TableFunction::NUMBER);
118 add_field(
"EVICTIONS", plugin::TableFunction::NUMBER);
119 add_field(
"BYTES_READ", plugin::TableFunction::NUMBER);
120 add_field(
"BYTES_WRITTEN", plugin::TableFunction::NUMBER);
121 add_field(
"LIMIT_MAXBYTES", plugin::TableFunction::NUMBER);
122 add_field(
"THREADS", plugin::TableFunction::NUMBER);
127 plugin::TableFunction::Generator(arg)
138 assert(servers_var != NULL);
140 const string servers_string(static_cast<char *>(servers_var.value_ptr(NULL, 0)));
142 if (servers_string.empty())
144 my_printf_error(ER_UNKNOWN_ERROR, _(
"No value in MEMCACHED_STATS_SERVERS variable."), MYF(0));
148 memc= memcached_create(NULL);
151 my_printf_error(ER_UNKNOWN_ERROR, _(
"Unable to create memcached struct. Got error from memcached_create()."), MYF(0));
155 memcached_server_st *tmp_serv= memcached_servers_parse(servers_string.c_str());
156 if (tmp_serv == NULL)
158 my_printf_error(ER_UNKNOWN_ERROR, _(
"Unable to create memcached server list. Got error from memcached_servers_parse(%s)."), MYF(0), servers_string.c_str());
162 memcached_server_push(memc, tmp_serv);
163 memcached_server_list_free(tmp_serv);
165 number_of_hosts= memc->number_of_hosts;
169 StatsTableTool::Generator::~Generator()
173 memcached_free(memc);
178 bool StatsTableTool::Generator::populate()
180 if (host_number == number_of_hosts)
185 server_function_context context(
this);
187 memcached_server_function callbacks[1];
188 callbacks[0]= server_function;
190 unsigned int iferror;
191 iferror= (*callbacks[0])(memc, &memc->servers[host_number], (
void *)&context);