/* 
 *  call-seq:
 *     lmc.random_pair()   ->  [key, value] or nil
 *
 *  Retrieves random pair from hashtable.
 */
static VALUE LocalMemCache__random_pair(VALUE obj) {
  char *k, *v;
  size_t n_k, n_v;
  VALUE r = Qnil;
  if (__local_memcache_random_pair(get_LocalMemCache(obj), &k, &n_k, &v, 
      &n_v)) {
    r = rb_ary_new();
    rb_ary_push(r, lmc_ruby_string2(k, n_k));
    rb_ary_push(r, lmc_ruby_string2(v, n_v));
  }
  lmc_unlock_shm_region("local_memcache_random_pair", 
      get_LocalMemCache(obj));
  return r;
}
/* 
 *  call-seq:
 *     lmc.get(key)   ->   string value or nil
 *     lmc[key]       ->   string value or nil
 *
 *  Retrieve string value from hashtable.
 */
static VALUE LocalMemCache__get(VALUE obj, VALUE key) {
  size_t l;
  lmc_rb_str_d_t k;
  rstring_acquire(key, &k);
  const char* r = __local_memcache_get(get_LocalMemCache(obj), 
      k.cstr, k.len, &l);
  VALUE rr = lmc_ruby_string2(r, l);
  lmc_unlock_shm_region("local_memcache_get", get_LocalMemCache(obj));
  return rr;
}
/*
 *  call-seq:
 *     lmc.get_by_no_lock(key)   ->   string value or nil
 *
 *  Retrieve string value from hashtable without obtain a semaphore.
 */
static mrb_value Cache__get_by_no_lock(mrb_state *mrb, mrb_value self)
{
  local_memcache_t *lmc = get_Cache(mrb, self);
  size_t l;
  char *key;
  mrb_int n_key;

  mrb_get_args(mrb, "s", &key, &n_key);
  const char *r = __local_memcache_get_by_no_lock(lmc, key, n_key, &l);
  mrb_value rr = lmc_ruby_string2(mrb, r, l);
  return rr;
}
/*
 *  call-seq:
 *     lmc.get(key)   ->   string value or nil
 *     lmc[key]       ->   string value or nil
 *
 *  Retrieve string value from hashtable.
 */
static mrb_value Cache__get(mrb_state *mrb, mrb_value self)
{
  local_memcache_t *lmc = get_Cache(mrb, self);
  size_t l;
  mrb_cache_iovec_t k;
  char *key;
  mrb_int n_key;

  mrb_get_args(mrb, "s", &key, &n_key);
  const char *r = __local_memcache_get(lmc, key, n_key, &l);
  mrb_value rr = lmc_ruby_string2(mrb, r, l);
  lmc_unlock_shm_region("local_memcache_get", lmc);
  return rr;
}
/* :nodoc: */
static mrb_value lmc_ruby_string(mrb_state *mrb, const char *s)
{
  return lmc_ruby_string2(mrb, s + sizeof(size_t), *(size_t *)s);
}
/* :nodoc: */
static VALUE lmc_ruby_string(const char *s) { 
  return lmc_ruby_string2(s + sizeof(size_t), *(size_t *) s);
}