Exemple #1
0
AbstractMemCachedService NewMemCachedService(char * host, int port1, char* host2, int port2) {
	AbstractMemCachedService abstractMemCachedService;
	if ((abstractMemCachedService = malloc(sizeof(struct ConcreteMemCachedService)))) {
		abstractMemCachedService->memc = memcached_create(NULL);
		memcached_server_add(abstractMemCachedService->memc, host, port1);
		abstractMemCachedService->memc2 = memcached_create(NULL);
		memcached_server_add(abstractMemCachedService->memc2, host2, port2);
	}
	return abstractMemCachedService;
}
int main(int argc, char* argv[])
{
	if(argc < 4) { usage(); }

	char* host = argv[1];

	unsigned short port = atoi(argv[2]);
	if(port == 0) { usage(); }

	uint32_t num = atoi(argv[3]);
	if(num == 0) { usage(); }

	memcached_st* mc = memcached_create(NULL);
	if(mc == NULL) { pexit("memcached_create"); }

	memcached_server_add(mc, host, port);

//	memcached_behavior_set(mc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);

	char kbuf[strlen(KEY_PREFIX) + 11];
	char vbuf[strlen(VAL_PREFIX) + 11];

while(1) {
	uint32_t i;
	for(i=0; i < num; ++i) {
		int klen = sprintf(kbuf, KEY_PREFIX "%d", i);
		int vlen = sprintf(vbuf, VAL_PREFIX "%d", i);
		printf("set '%s' = '%s'\n", kbuf, vbuf);
		memcached_set(mc, kbuf, klen, vbuf, vlen, 0, 0);
	}

	for(i=0; i < num; ++i) {
		int klen = sprintf(kbuf, KEY_PREFIX "%d", i);
		int vlen = sprintf(vbuf, VAL_PREFIX "%d", i);
		size_t vallen;
		uint32_t flags;
		memcached_return rc;
		char* val = memcached_get(mc, kbuf, klen, &vallen, &flags, &rc);
		if(!val) {
			fprintf(stderr, "** key '%s' not found **\n", kbuf);
		} else if(vallen != vlen || memcmp(val, vbuf, vlen) != 0) {
			fprintf(stderr, "** key '%s' not match ** '", kbuf);
			fwrite(val, vallen, 1, stderr);
			fprintf(stderr, "'\n");
		} else {
			printf("get '%s' = '", kbuf);
			fwrite(val, vallen, 1, stdout);
			printf("'\n");
		}
	}

	for(i=0; i < num; ++i) {
		int klen = sprintf(kbuf, KEY_PREFIX "%d", i);
		printf("delete '%s'\n", kbuf);
		memcached_delete(mc, kbuf, klen, 0);
	}
}

	return 0;
}
Exemple #3
0
bool libkv_libmemcached_add(libkv_t* x,
		const char* hostname, unsigned int port)
{
	kv_data* c = x->data;
	return (c->err = memcached_server_add(c->st, hostname, port))
		== MEMCACHED_SUCCESS;
}
Exemple #4
0
static void parse_memcached_server(const json_t *obj)
{
	const json_t *tmp;
	const char *host;
	int port = -1;

	if (!json_is_object(obj))
		return;

	host = json_string_value(json_object_get(obj, "host"));
	if (!host || !*host)
		host = "127.0.0.1";

	tmp = json_object_get(obj, "port");
	if (json_is_integer(tmp)) {
		port = json_integer_value(tmp);
		if (port < 1 || port > 65535) {
			applog(LOG_ERR, "invalid memcached port");
			exit(1);
		}
	} else
		port = 11211;

	memcached_server_add(srv.mc, host, port);
}
    memcached_protocol_t(const char *conn_str) {

        memcached_create(&memcached);

        // NOTE: we don't turn on noreply behavior because the stress
        // client is designed to emulate real-world behavior, which
        // commonly requires a reply. In order to do this properly we
        // should pipeline sets according to batch factor, and then
        // wait for store notifications for the batch.

        //memcached_behavior_set(&memcached, MEMCACHED_BEHAVIOR_NOREPLY, 1);

        // Parse the host string
        char _host[MAX_HOST];
        strncpy(_host, conn_str, MAX_HOST);

        char *_port = NULL;

        _port = strchr(_host, ':');
        if(_port) {
            *_port = '\0';
            _port++;
        } else {
            fprintf(stderr, "Please use host string of the form host:port.\n");
            exit(-1);
        }

        int port = atoi(_port);

        // Connect to server
        memcached_server_add(&memcached, _host, port);
    }
Exemple #6
0
    Memc(in_port_t arg)
    {
        _memc= memcached_create(NULL);

        if (_memc == NULL)
        {
            throw "memcached_create() failed";
        }
        memcached_server_add(_memc, "localhost", arg);
    }
Exemple #7
0
/* Make sure that I cant add a tcp server to a udp client */
static test_return_t add_tcp_server_udp_client_test(memcached_st *memc)
{
    (void)memc;
#if 0
    memcached_server_st server;
    memcached_server_instance_st instance=
        memcached_server_instance_by_position(memc, 0);
    memcached_server_clone(&server, &memc->hosts[0]);
    test_true(memcached_server_remove(&(memc->hosts[0])) == MEMCACHED_SUCCESS);
    test_true(memcached_server_add(memc, server.hostname, server.port) == MEMCACHED_INVALID_HOST_PROTOCOL);
#endif
    return TEST_SUCCESS;
}
Exemple #8
0
bool c_Memcache::t_connect(CStrRef host, int port /*= 0*/,
                           int timeout /*= 0*/,
                           int timeoutms /*= 0*/) {
  memcached_return_t ret;

  if (!host.empty() && host[0] == '/') {
    ret = memcached_server_add_unix_socket(&m_memcache, host.c_str());
  } else {
    ret = memcached_server_add(&m_memcache, host.c_str(), port);
  }

  return (ret == MEMCACHED_SUCCESS);
}
Exemple #9
0
bool c_Memcache::t_connect(const String& host, int port /*= 0*/,
                           int timeout /*= 0*/,
                           int timeoutms /*= 0*/) {
  memcached_return_t ret;

  if (!host.empty() &&
      !strncmp(host.c_str(), "unix://", sizeof("unix://") - 1)) {
    const char *socket_path = host.substr(sizeof("unix://") - 1).c_str();
    ret = memcached_server_add_unix_socket(&m_memcache, socket_path);
  } else {
    ret = memcached_server_add(&m_memcache, host.c_str(), port);
  }

  return (ret == MEMCACHED_SUCCESS);
}
static mrb_value mrb_memcached_server_add(mrb_state *mrb, mrb_value self)
{
  mrb_memcached_data *data = DATA_PTR(self);
  char *host;
  mrb_int port;
  memcached_return mrt;

  mrb_get_args(mrb, "zi", &host, &port);
  mrt = memcached_server_add(data->mst, host, port);
  if (mrt != MEMCACHED_SUCCESS) {
    // can't add server to memcached server list
    mrb_raisef(mrb, E_RUNTIME_ERROR, "libmemcached error: %S"
      , mrb_str_new_cstr(mrb, memcached_strerror(data->mst, mrt)));
  }

  return mrb_fixnum_value(mrt);
}
Exemple #11
0
static bool HHVM_METHOD(Memcache, connect, const String& host, int port /*= 0*/,
                                           int timeout /*= 0*/,
                                           int timeoutms /*= 0*/) {
  auto data = Native::data<MemcacheData>(this_);
  memcached_return_t ret;

  if (!host.empty() &&
      !strncmp(host.c_str(), "unix://", sizeof("unix://") - 1)) {
    const char *socket_path = host.substr(sizeof("unix://") - 1).c_str();
    ret = memcached_server_add_unix_socket(&data->m_memcache, socket_path);
  } else {
    if (!isServerReachable(host, port)) {
      return false;
    }
    ret = memcached_server_add(&data->m_memcache, host.c_str(), port);
  }

  return (ret == MEMCACHED_SUCCESS);
}
	hashWrapper::hashWrapper(const std::string &config, const vecHostInfo &hosts)
	{
		this->pMemc = memcached(config.c_str(), config.length());
		
		if(!this->pMemc )
			throw MemcacheConstructionException();

		serverCount = 0;
		for(citerVecHostInfo host = hosts.begin(); host != hosts.end(); host++)
			if(memcached_server_add(this->pMemc, (*host).first.c_str(), (*host).second) == MEMCACHED_SUCCESS)
			   serverCount++;
		//
		//  Do not change ordering of options below; it is significant
		//
		memcached_behavior_set(this->pMemc, MEMCACHED_BEHAVIOR_KETAMA, 0);
		memcached_behavior_set(this->pMemc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, 0);
		memcached_behavior_set(this->pMemc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_DEFAULT);
		memcached_behavior_set(this->pMemc, MEMCACHED_BEHAVIOR_DISTRIBUTION, MEMCACHED_DISTRIBUTION_CONSISTENT);
		memcached_behavior_set(this->pMemc, MEMCACHED_BEHAVIOR_HASH, MEMCACHED_HASH_FNV1A_32);
	
		this->hashType = HASHKIT_HASH_DEFAULT;
	}
Exemple #13
0
/// Gets the set of replicas to use for a read or write operation for the
/// specified key.
const std::vector<memcached_st*>& MemcachedStore::get_replicas(const std::string& key,
                                                               Op operation)
{
  MemcachedStore::connection* conn = (connection*)pthread_getspecific(_thread_local);
  if (conn == NULL)
  {
    // Create a new connection structure for this thread.
    conn = new MemcachedStore::connection;
    pthread_setspecific(_thread_local, conn);
    conn->view_number = 0;
  }

  if (conn->view_number != _view_number)
  {
    // Either the view has changed or has not yet been set up, so set up the
    // connection and replica structures for this thread.
    for (size_t ii = 0; ii < conn->st.size(); ++ii)
    {
      memcached_free(conn->st[ii]);
      conn->st[ii] = NULL;
    }
    pthread_rwlock_rdlock(&_view_lock);

    LOG_DEBUG("Set up new view %d for thread", _view_number);

    // Create a set of memcached_st's one per server.
    conn->st.resize(_servers.size());

    for (size_t ii = 0; ii < _servers.size(); ++ii)
    {
      // Create a new memcached_st for this server.  Do not specify the server
      // at this point as memcached() does not support IPv6 addresses.
      LOG_DEBUG("Setting up server %d for connection %p (%s)", ii, conn, _options.c_str());
      conn->st[ii] = memcached(_options.c_str(), _options.length());
      LOG_DEBUG("Set up connection %p to server %s", conn->st[ii], _servers[ii].c_str());

      // Switch to a longer connect timeout from here on.
      memcached_behavior_set(conn->st[ii], MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, 50);

      // Connect to the server.  The address is specified as either <IPv4 address>:<port>
      // or [<IPv6 address>]:<port>.  Look for square brackets to determine whether
      // this is an IPv6 address.
      std::vector<std::string> contact_details;
      size_t close_bracket = _servers[ii].find(']');

      if (close_bracket == _servers[ii].npos)
      {
        // IPv4 connection.  Split the string on the colon.
        Utils::split_string(_servers[ii], ':', contact_details);
        if (contact_details.size() != 2)
        {
          LOG_ERROR("Malformed contact details %s", _servers[ii].c_str());
          break;
        }
      }
      else
      {
        // IPv6 connection.  Split the string on ']', which removes any white
        // space from the start and the end, then remove the '[' from the
        // start of the IP addreess string and the start of the ';' from the start
        // of the port string.
        Utils::split_string(_servers[ii], ']', contact_details);
        if ((contact_details.size() != 2) ||
            (contact_details[0][0] != '[') ||
            (contact_details[1][0] != ':'))
        {
          LOG_ERROR("Malformed contact details %s", _servers[ii].c_str());
          break;
        }

        contact_details[0].erase(contact_details[0].begin());
        contact_details[1].erase(contact_details[1].begin());
      }

      LOG_DEBUG("Setting server to IP address %s port %s",
                contact_details[0].c_str(),
                contact_details[1].c_str());
      int port = atoi(contact_details[1].c_str());
      memcached_server_add(conn->st[ii], contact_details[0].c_str(), port);
    }

    conn->read_replicas.resize(_vbuckets);
    conn->write_replicas.resize(_vbuckets);

    // Now set up the read and write replica sets.
    for (int ii = 0; ii < _vbuckets; ++ii)
    {
      conn->read_replicas[ii].resize(_read_replicas[ii].size());
      for (size_t jj = 0; jj < _read_replicas[ii].size(); ++jj)
      {
        conn->read_replicas[ii][jj] = conn->st[_read_replicas[ii][jj]];
      }
      conn->write_replicas[ii].resize(_write_replicas[ii].size());
      for (size_t jj = 0; jj < _write_replicas[ii].size(); ++jj)
      {
        conn->write_replicas[ii][jj] = conn->st[_write_replicas[ii][jj]];
      }
    }

    // Flag that we are in sync with the latest view.
    conn->view_number = _view_number;

    pthread_rwlock_unlock(&_view_lock);
  }

  // Hash the key and convert the hash to a vbucket.
  int hash = memcached_generate_hash_value(key.data(), key.length(), MEMCACHED_HASH_MD5);
  int vbucket = hash & (_vbuckets - 1);
  LOG_DEBUG("Key %s hashes to vbucket %d via hash 0x%x", key.c_str(), vbucket, hash);

  return (operation == Op::READ) ? conn->read_replicas[vbucket] : conn->write_replicas[vbucket];
}
/// Gets the set of replicas to use for a read or write operation for the
/// specified vbucket.
const std::vector<memcached_st*>& BaseMemcachedStore::get_replicas(int vbucket,
                                                                   Op operation)
{
  BaseMemcachedStore::connection* conn = (connection*)pthread_getspecific(_thread_local);
  if (conn == NULL)
  {
    // Create a new connection structure for this thread.
    conn = new BaseMemcachedStore::connection;
    pthread_setspecific(_thread_local, conn);
    conn->view_number = 0;
  }

  if (conn->view_number != _view_number)
  {
    // Either the view has changed or has not yet been set up, so set up the
    // connection and replica structures for this thread.
    for (std::map<std::string, memcached_st*>::iterator it = conn->st.begin();
         it != conn->st.end();
         it++)
    {
      memcached_free(it->second);
      it->second = NULL;
    }
    pthread_rwlock_rdlock(&_view_lock);

    TRC_DEBUG("Set up new view %d for thread", _view_number);

    // Create a set of memcached_st's one per server.
    for (size_t ii = 0; ii < _servers.size(); ++ii)
    {
      // Create a new memcached_st for this server.  Do not specify the server
      // at this point as memcached() does not support IPv6 addresses.
      TRC_DEBUG("Setting up server %d for connection %p (%s)", ii, conn, _options.c_str());
      conn->st[_servers[ii]] = memcached(_options.c_str(), _options.length());
      TRC_DEBUG("Set up connection %p to server %s", conn->st[_servers[ii]], _servers[ii].c_str());

      // Switch to a longer connect timeout from here on.
      memcached_behavior_set(conn->st[_servers[ii]], MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, _max_connect_latency_ms);

      std::string server;
      int port;
      if (Utils::split_host_port(_servers[ii], server, port))
      {
        TRC_DEBUG("Setting server to IP address %s port %d",
                  server.c_str(),
                  port);
        memcached_server_add(conn->st[_servers[ii]], server.c_str(), port);
      }
      else
      {
        TRC_ERROR("Malformed host/port %s, skipping server", _servers[ii].c_str());
      }
    }

    conn->read_replicas.resize(_vbuckets);
    conn->write_replicas.resize(_vbuckets);

    // Now set up the read and write replica sets.
    for (int ii = 0; ii < _vbuckets; ++ii)
    {
      conn->read_replicas[ii].resize(_read_replicas[ii].size());
      for (size_t jj = 0; jj < _read_replicas[ii].size(); ++jj)
      {
        conn->read_replicas[ii][jj] = conn->st[_read_replicas[ii][jj]];
      }
      conn->write_replicas[ii].resize(_write_replicas[ii].size());
      for (size_t jj = 0; jj < _write_replicas[ii].size(); ++jj)
      {
        conn->write_replicas[ii][jj] = conn->st[_write_replicas[ii][jj]];
      }
    }

    // Flag that we are in sync with the latest view.
    conn->view_number = _view_number;

    pthread_rwlock_unlock(&_view_lock);
  }

  return (operation == Op::READ) ? conn->read_replicas[vbucket] : conn->write_replicas[vbucket];
}
int main()
{

	memcached_st *local_memc;
	memcached_return rc;

	local_memc = memcached_create(NULL);

	unsigned int set= 1;
	//memcached_behavior_set(local_memc, MEMCACHED_DISTRIBUTION_CONSISTENT, set);
	memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, set);
	//memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_KETAMA, set);
	//memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, set);

	rc = memcached_server_add(local_memc, "127.0.0.1", 11211);
	if(rc != MEMCACHED_SUCCESS)
	{
		fprintf(stderr, "memcached_server_add error.");
	}

	rc = memcached_server_add(local_memc, "127.0.0.1", 11212);
	if(rc != MEMCACHED_SUCCESS)
	{
		fprintf(stderr, "memcached_server_add error.");
	}

	rc = memcached_server_add(local_memc, "127.0.0.1", 11213);
	if(rc != MEMCACHED_SUCCESS)
	{
		fprintf(stderr, "memcached_server_add error.");
	}

	rc = memcached_server_add(local_memc, "127.0.0.1", 11214);
	if(rc != MEMCACHED_SUCCESS)
	{
		fprintf(stderr, "memcached_server_add error.");
	}
	rc = memcached_server_add(local_memc, "127.0.0.1", 11215);
	if(rc != MEMCACHED_SUCCESS)
	{
		fprintf(stderr, "memcached_server_add error.");
	}
	uint32_t num =  memcached_server_count(local_memc);
	printf("num:%d\n", num);


	rc= memcached_flush(local_memc, 0);
	if (!(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED))
	{
		fprintf(stderr, "memcached_flush:%d rc:%d\n", MEMCACHED_SUCCESS, rc);
		char const *retVal = memcached_strerror(NULL, rc);
		fprintf(stderr, "error memcached_flush:%s rc:%d\n", retVal, rc);
		goto ERROR;
	}

	int i = 0;
	//for(i = 0; i < 1; i++)
	for(i = 0; i < 100000; i++)
	{
		char key[64];
		char value[64];
		snprintf(key, sizeof(key), "tkey_%05d", i);
		snprintf(value, sizeof(value), "tvalue_%05d", i);
		rc= memcached_set(local_memc, key, strlen(key), value, strlen(value), (time_t)0, (uint32_t)0);
		if (!(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED))
		{
			char const *retVal = memcached_strerror(NULL, rc);
			fprintf(stderr, "error memcached_set .%s\n", retVal);
			goto ERROR;
		}

	}
	memcached_free(local_memc);

	printf("success \n");
	return 0;
ERROR:
	printf("error \n");
	return 1;

}
int main(int argc, char ** argv)
{
  int           key_num     = 50000;
  int           bench_count = 1;
  int           binary_prot = 0;
  char          server[255] = "";
  char          port[8]     = "11211";
  int           i;
  memcached_st *mc;
  int           c;

  pid = getpid();

  if (argc == 1) usage();
  while ((c = getopt(argc, argv, "m:k:c:h1b")) >= 0) {

    switch (c) {
    case 'm':
      memcpy(server, optarg, strlen(optarg)+1);
      for (i=0; server[i]!='\0'; i++) {
        if (server[i] == ':') {
          server[i]='\0';
          break;
        }
      }
      i++;
      memcpy(port, optarg+i, strlen(optarg)-i+1);
      break;
    case 'k':
      key_num = atoi(optarg);
      break;
    case 'c':
      bench_count = atoi(optarg);
      break;
    case '1':
      do_one_connection = 1;
      break;
    case 'b':
      binary_prot = 1;
      break;
    case 'h':
    case '?':
      usage();
      break;
    default:
      usage();
    }
  }

  TRACE("server:port=%s:%d", server, atoi(port));
  if (strcmp(server, "") == 0) usage();
  printf("bench_count:%d key_num:%d\n", bench_count, key_num);
  if (key_num >= DATA_MAX) die("key_num is too big.");

  srand(time(NULL));
  for (i=0; i<key_num; i++) {
    sprintf(data[i], "%d",
            abs(10000*(rand()/(RAND_MAX+1.0)))
            );
    TRACE2("[%d]%s", i, data[i]);
  }

  mc = memcached_create(NULL);
  if (mc == NULL) die("memcached_create");
  memcached_server_add(mc, server, atoi(port));

  memcached_behavior_set(mc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, binary_prot);

  TRACE("%s","begin set");
  for (i=0; i<bench_count; i++) {
    do_set(mc, key_num);
  }
  TRACE("%s","end   set");

  TRACE("%s","begin get");
  for (i=0; i<bench_count; i++) {
    do_get(mc, key_num);
  }
  TRACE("%s","end   get");

  return 0;
}
Exemple #17
0
int
main(int argc, char * const argv[])
{
	memcached_st   *mcd;
	in_port_t		port;
	uint32_t		weight;
	int				num_conns = 0;
	int				retval;
	int				code;

	mcd = memcached_create(NULL);
	if (!mcd)
	{
		fprintf(stderr, "memcached_create(NULL) : %s\n", strerror(errno));
		return 1;
	}

	while ((code = getopt(argc, argv, "c:vh")) > 0)
	{
		memcached_return_t	rc;

		switch (code)
		{
			case 'c':
				if (strncmp(optarg, "tcp://", 6) == 0)
				{
					parse_connection(optarg+6, &port, &weight);
					rc = memcached_server_add_with_weight(mcd, optarg+6, port, weight);
					if (rc != MEMCACHED_SUCCESS)
					{
						fprintf(stderr, "failed to add tcp://%s:%d/%u\n",
								optarg+6, port, weight);
						return 1;
					}
				}
				else if (strncmp(optarg, "udp://", 6) == 0)
				{
					parse_connection(optarg+6, &port, &weight);
					rc = memcached_server_add_udp_with_weight(mcd, optarg+6, port, weight);
					if (rc != MEMCACHED_SUCCESS)
					{
						fprintf(stderr, "failed to add udp://%s:%d/%u\n",
								optarg+6, port, weight);
						return 1;
					}
				}
				else if (strncmp(optarg, "unix://", 7) == 0)
				{
					parse_connection(optarg+7, NULL, &weight);
					rc = memcached_server_add_unix_socket_with_weight(mcd, optarg+7, weight);
					if (rc != MEMCACHED_SUCCESS)
					{
						fprintf(stderr, "failed to add unix://%s/%u\n",
								optarg+7, weight);
						return 1;
					}
				}
				else
				{
					parse_connection(optarg, &port, &weight);
					rc = memcached_server_add_with_weight(mcd, optarg, port, weight);
					if (rc != MEMCACHED_SUCCESS)
					{
						fprintf(stderr, "failed to add tcp://%s:%d/%u\n",
                                optarg, port, weight);
                        return 1;
					}
				}
				num_conns++;
				break;
			case 'v':
				verbose = true;
				break;
			default:
				fprintf(stderr,
						"usage: %s [options] [<commands>]\n"
						"\n"
						"[options]\n"
						"  -c <server>  server to be connected\n"
						"         [tcp://]<host>[:<port>][/<weight>]\n"
						"         udp://<host>[:<port>][/<weight>]\n"
						"         unix://<path>[/<weight>]\n"
						"\n"
						"[<command>]\n"
						"  get <key>\n"
						"  add <key> <value> [<expire> [<flags>]]\n"
						"  set <key> <value> [<expire> [<flags>]]\n"
						"  replace <key> <value> [<expire> [<flags>]]\n"
						"  append <key> <value> [<expire> [<flags>]]\n"
						"  prepend <key> <value> [<expire> [<flags>]]\n"
						"  cas <key> <value> <cas> [<expire> [<flags>]]\n"
						"  delete <key> [<expire>]\n"
						"  incr <key>\n"
						"  decr <key>\n"
						"  flush [<when>]\n"
						"  ----\n"
						"  simple_bench [<scale>]\n",
						argv[0]);
				return 1;
		}
	}

	/*
	 * If no server specified, a default is implicitly used
	 */
	if (num_conns == 0)
	{
		if (memcached_server_add(mcd, "localhost", 11211) != MEMCACHED_SUCCESS)
		{
			fprintf(stderr, "failed to add tcp://localhost:11211\n");
			return 1;
		}
	}

	if (optind == argc)
	{
		char	buffer[10240];
		char  **cmds = NULL;
		int		n_cmds = 0;

		while(fgets(buffer, sizeof(buffer), stdin) != NULL)
		{
			char   *tok = strtok(buffer, " \t\n");
			int		index = 0;

			while (tok != NULL)
			{
				if (index == n_cmds)
				{
					n_cmds = (n_cmds ? 2 * n_cmds : 10);

					cmds = realloc(cmds, sizeof(char *) * n_cmds);
					if (!cmds)
					{
						fprintf(stderr, "realloc() failed: %d(%s)\n",
								errno, strerror(errno));
						return 1;
					}
				}
				cmds[index++] = tok;
				tok = strtok(NULL, " \t\n");
			}
			if (index == 0)
				continue;

			retval = exec_command(mcd, index, cmds);
			if (retval != 0)
				return retval;
		}
	}
	else
	{
		retval = exec_command(mcd, argc - optind, argv + optind);
	}
	return retval;
}
int main(int argc, char ** argv)
{
  struct memcached_st *mc;
  memcached_return_t  rc;
  char                key[32];
  u_int32_t           keylen;
  char               *val;
  size_t              value_len;
  uint32_t            flags;
  struct timeval      tv;
  long                microsec;
  double              elapsed_time;

  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);

  /* Parse extra opts if any */
  argv = np_extra_opts (&argc, argv, progname);

  if (process_arguments (argc, argv) == ERROR)
    usage4 (_("Could not parse arguments"));

  TRACE("%s",">>main");

  // initialize
  gettimeofday(&tv, NULL);
  mc = memcached_create(NULL);
  if (mc == NULL) {
    printf("MEMCACHED %s: failed to memcached_create\n", _("CRITICAL"));
    exit(EXIT_CRITICAL);
  }
  TRACE("[server]%s:%d", mc_host, (int)mc_port);
  rc = memcached_server_add(mc, mc_host, (in_port_t)mc_port);
  TRACE("[mc_server_add rv]%d", rc);
  if (rc != MEMCACHED_SUCCESS) {
    printf("MEMCACHED %s: failed to memcached_server_add (%d)\n", _("CRITICAL"), rc);
    exit(EXIT_CRITICAL);
  }

  memcached_behavior_set(mc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1);

  srand(time(NULL) & getpid());
  sprintf(key, "%d_%s", rand(), mc_host);
  keylen = strlen(key);
  TRACE("[key]%s[keylen]%d", key, keylen);

  val = (char *)calloc(1, strlen(TEST_VAL)+1);
  sprintf(val, "%s", TEST_VAL);
  TRACE("[val]%s", val);

  // set
  TRACE("[expire]%d", mc_expire);
  rc = memcached_set(mc, key, keylen, val, strlen(val), mc_expire, 0);
  TRACE("[set rv]%d", rc);
  if (rc != MEMCACHED_SUCCESS) {
    printf("MEMCACHED %s: failed to set (%d)\n", _("CRITICAL"), rc);
    exit(EXIT_CRITICAL);
  }
  free(val);

  // get
  val = (char *)memcached_get(mc, key, keylen, &value_len, &flags, &rc);
  TRACE("[val]%s", val);
  if (rc != MEMCACHED_SUCCESS) {
    printf("MEMCACHED %s: failed to get after set\n", _("CRITICAL"));
    exit(EXIT_CRITICAL);
  }
  free(val);

  // delete
  rc = memcached_delete(mc, key, keylen, 0);
  TRACE("[delete rv]%d", rc);
  if (rc != MEMCACHED_SUCCESS) {
    printf("MEMCACHED %s: failed to delete (%d)\n", _("CRITICAL"), rc);
    exit(EXIT_CRITICAL);
  }

  // get
  val = (char *)memcached_get(mc, key, keylen, &value_len, &flags, &rc);
  TRACE("[val]%s", val);
  if (rc != MEMCACHED_NOTFOUND) {
    printf("MEMCACHED %s: failed to get after delete\n", _("CRITICAL"));
    exit(EXIT_CRITICAL);
  }
  free(val);

  memcached_free(mc);

  microsec = deltime(tv);
  elapsed_time = (double)microsec / 1.0e6;
  printf("MEMCACHED %s: %.3f seconds\n", _("OK"), elapsed_time);

  return 0;
}
int main(int argc, char ** argv)
{
  struct memcached_st *mc;
  struct memcached_stat_st *stats;
  memcached_return_t rc;
  long             cur_conn = -1;
  int              status;
  char*            status_msg;
  struct timeval   tv;
  long             microsec;
  double           elapsed_time;

  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);

  /* Parse extra opts if any */
  argv = np_extra_opts (&argc, argv, progname);

  if (process_arguments (argc, argv) == ERROR)
    usage4 (_("Could not parse arguments"));

  TRACE("%s",">>main");

  // initialize
  gettimeofday(&tv, NULL);
  mc = memcached_create(NULL);
  if (mc == NULL) {
    printf("MEMCACHED %s: failed to memcached_create\n", _("CRITICAL"));
    exit(EXIT_CRITICAL);
  }
  TRACE("[server]%s:%s", mc_host, mc_port);
  rc = memcached_server_add(mc, mc_host, (in_port_t)mc_port);
  TRACE("[mc_server_add rv]%d", rc);
  if (rc != MEMCACHED_SUCCESS) {
    printf("MEMCACHED %s: failed to memcached_server_add (%d)\n", _("CRITICAL"), rc);
    exit(EXIT_CRITICAL);
  }

  memcached_behavior_set(mc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1);

  stats = memcached_stat(mc, NULL, &rc);
  if (! stats) {
    printf("MEMCACHED %s: failed to memcached_stats\n", _("CRITICAL"));
    exit(EXIT_CRITICAL);
  }

  cur_conn = stats->curr_connections;

  memcached_stat_free(mc, stats);
  memcached_free(mc);

  status = get_status(cur_conn, my_thresholds);

  status_msg = _("CRITICAL");
  if (status == STATE_OK) {
      status_msg = _("OK");
  } else if (status == STATE_WARNING) {
      status_msg = _("WARNING");
  } else if (status == STATE_CRITICAL) {
      status_msg = _("CRITICAL");
  }

  microsec = deltime(tv);
  elapsed_time = (double)microsec / 1.0e6;
  printf("MEMCACHED %s: conn %ld, %.3f seconds\n", status_msg, cur_conn, elapsed_time);

  return status;
}