Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C GWAN键值持久化多存储_C_Key Value_G Wan_Key Value Store - Fatal编程技术网

C GWAN键值持久化多存储

C GWAN键值持久化多存储,c,key-value,g-wan,key-value-store,C,Key Value,G Wan,Key Value Store,我想在持久模式下记录一个键值,但当我想使用2个或更多不同的存储时,它不起作用 这是我的剧本: ... typedef struct{ kv_t *kv; char *name; } kv_data; int main(int argc, char *argv[]) { kv_data **data = (kv_data**)get_env(argv, US_SERVER_DATA); if(!d

我想在持久模式下记录一个键值,但当我想使用2个或更多不同的存储时,它不起作用

这是我的剧本:

    ...
    typedef struct{
       kv_t  *kv;
       char  *name;
    } kv_data;

    int main(int argc, char *argv[])
    {
       kv_data **data = (kv_data**)get_env(argv, US_SERVER_DATA);
       if(!data[0]){
          data[0] = (kv_data*)calloc(1, sizeof(kv_data));
          if(!data[0]){
             return 500;
          }
          kv_t users;
          kv_init(&users, "users", 10, 0, 0, 0);
          data[0]->kv = &users;

          kv_item item;
          item.key = "pierre";
          item.klen = sizeof("pierre") - 1;
          item.val = "pierre@example.com";
          item.flags = 0;
          kv_add(data[0]->kv, &item);

          data[0]->name = strdup("users");
       }
    ...
此错误与kv_init()函数的第15行一致

例如,我希望使用数据[0]->kv读取并记录“用户”存储中的值,并使用数据[1]->kv读取并记录其他存储中的值…

John

你的问题来自于在指针上玩指针的困难。我们可以修复此代码,但由于其复杂性,它可能会在以后的脚本中中断

从长远来看,应该使用更简单的解决方案来避免bug

附加到
US\u服务器\u数据的结构可以简化:

typedef struct
{
   char *name;
   kv_t *kv_1;
   kv_t *kv_2;
   void *callback;
   u32   current_time;
}
这就是方法:使用
calloc(sizeof(my_struct))分配内存
,并将此结构附加到您的
US\u服务器\u数据
指针

然后,如果您在G-WAN处理程序
init()
调用中(或在
gwan/main.c
维护脚本中,甚至在最近添加的
gwan/init.c
脚本中)执行所有这些操作,您将拥有独占访问权限(一个线程正在进行初始化),并且您将能够攻击G-WAN KV存储(和其他对象)根据需要

如果以后G-WAN servlet或处理程序正在修改这些结构指针,则必须为指针本身使用锁、自旋锁等或原子变量


希望这能有所帮助。

我只是将一个包含我需要的所有kv存储的kv存储附加到持久性指针上。G-WAN kv速度快,加上记录数量少,应该不会影响性能

  xbuf_t *reply = get_reply(argv);
  kv_t **kv_db = (kv_t **)get_env(argv, US_VHOST_DATA);

  if (!kv_db[0])
  {
     kv_db[0] = (kv_t*) malloc(sizeof(kv_t));

     if (!kv_db[0])
     {
        puts("Could not allocate memory for the v-host kv store");
        return 500;
     }

     kv_init(kv_db[0], "kv_db", 10, 0, 0, 0);
  }

  kv_t *blog_db = (kv_t *) kv_get(kv_db[0], "blog_db", 7);

  if (blog_db)
  {
     xbuf_cat(reply, "Blog already installed. GTFO.");
     return 200;
  }

  blog_db = (kv_t *) malloc(sizeof(kv_t));
  kv_init(blog_db, "blog_db", 0, 0, 0, 0);

  if (!blog_db)
  {
     puts("Could not allocate memory for the blog kv store");
     return 500;
  }

  _KV_ADD(kv_db[0], item, blog_db->name, blog_db, 0);

(_KV_ADD是一个自定义宏)

您能澄清您遇到的错误吗?谢谢您的帮助,您的解决方案很有效。但是,您是否暗示它(从性能角度来看)不如下面Gil提出的解决方案优化?(顺便说一句,我没能做到这一点)因为我可能需要同时处理大量数据。关于。在我的解决方案中,每当我想访问我的博客时,我必须执行查找(
*blog_db=(kv_t*)kv_get(kv_db[0],“blog_db”,7);
);在吉尔的解决方案中,他可以直接访问它,因为它只是结构中的一个字段。当然,我的解决方案没有那么优化。顺便说一句,在这种情况下,数据集的大小(每个kv存储的大小)是不相关的,因为在我的解决方案中,重要的是kv存储的数量。无论如何,如果你有太多的kv商店,你可能想重新考虑你的设计。考虑使用键前缀来合并kv存储(例如:“user_db:”user kv前缀,“blog_db:”posts前缀等)