我想在持久模式下记录键值,但是当我想使用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");
}
...
此错误在第15行使用kv_init()函数。
我的愿望是例如使用 data [0] - > kv 来阅读和记录“ 用户 ”商店中的值并使用数据[1] - > kv 来读取和记录 其他 商店中的值......
答案 0 :(得分:1)
约翰,
你的问题来自于使用指针指针的难度。我们可以修复此代码,但由于其复杂性,它可能会在您的脚本中稍后破解。
从长远来看,应该使用更简单的解决方案来避免错误。
附加到US_SERVER_DATA
的结构可以更简单:
typedef struct
{
char *name;
kv_t *kv_1;
kv_t *kv_2;
void *callback;
u32 current_time;
}
这是要走的路:用calloc(sizeof(my_struct));
分配内存,并将此结构附加到US_SERVER_DATA
指针。
然后,假设您在G-WAN处理程序init()
调用(或gwan/main.c
维护脚本中,甚至在最近添加的gwan/init.c
脚本中)执行所有操作,您将拥有独占访问权(一个线程正在进行初始化),您将能够根据需要攻击G-WAN KV存储(和其他对象)。
如果稍后,G-WAN servlet或处理程序正在修改这些结构指针,那么你将不得不使用锁,自旋锁等原子变量或指针本身。
希望这有帮助。
答案 1 :(得分:1)
我只是附加一个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是自定义宏)