东京机柜在*sp=rec->;上的tcbdb.h中出现分段故障;vsiz;

东京机柜在*sp=rec->;上的tcbdb.h中出现分段故障;vsiz;,c,tokyo-cabinet,C,Tokyo Cabinet,我正在使用Tokyo Cabinet创建持久存储数据库 我使用的是void*tcbdbget(TCBDB*bdb,const void*kbuf,int ksiz,int*sp) 它在*sp=rec->vsiz的tcbdb.h文件中给出segfault 东京内阁里有窃听器吗?还是我遗漏了什么 因为插入记录可以很好地工作,这意味着所有的空指针都可以完美地插入,所以仅仅查找就有问题了。 插入函数是thisbooltcbdbput(TCBDB*bdb,const void*kbuf,int ksiz,

我正在使用Tokyo Cabinet创建持久存储数据库

我使用的是
void*tcbdbget(TCBDB*bdb,const void*kbuf,int ksiz,int*sp)
它在
*sp=rec->vsiz的tcbdb.h文件中给出segfault

东京内阁里有窃听器吗?还是我遗漏了什么

因为插入记录可以很好地工作,这意味着所有的空指针都可以完美地插入,所以仅仅查找就有问题了。 插入函数是this
booltcbdbput(TCBDB*bdb,const void*kbuf,int ksiz,const void*vbuf,int vsiz)

它在
*sp=rec->vsiz的tcbdb.h文件中给出segfault

Tokyo Cabinet(又称TC)希望您在调用
tcbdbget
时传递一个有效的非空指针来存储值的大小,例如:

int size;
char *buf = tcbdbget(bdb, kbuf, ksiz, &size);
传递空指针可以解释这个精确代码段的segfault。请在下面找到一个示例代码,您可以使用
BUG=1
生成一个segfault-使用
BUG=0
一切都像一个符咒:)

#包括
#包括
#包括
#定义错误0
int
主(空)
{
TCBDB*bdb=tcbdbnew();
如果(!tcbdbopen(bdb,“store.db”,BDBOWRITER | BDBOCREAT)){
fprintf(标准字符,“错误:%s\n”,tcbdberrmsg(tcbdbecode(bdb));
}
char*key=“foo”;
char*val=“bar”;
如果(!tcbdbput(bdb,key,strlen(key),val,strlen(val))){
fprintf(标准字符,“错误:%s\n”,tcbdberrmsg(tcbdbecode(bdb));
}
整数大小;
#如果BUG
char*buf=tcbdbget(bdb,key,strlen(key),NULL);
#否则
char*buf=tcbdbget(bdb、key、strlen(key)和size);
#恩迪夫
如果(!buf&&tcbdbecode(bdb)!=TCENOREC){
fprintf(标准字符,“错误:%s\n”,tcbdberrmsg(tcbdbecode(bdb));
}
如果(buf)
printf(“%s->%s\n”,键,buf);
免费(buf);
tcbdbdel(bdb);
返回0;
}
注意:由于TC总是附加一个尾随终止符
\0
,而且我知道我已经存储了一个字符串,所以我可以使用
%s
安全地
printf
buf


很有魅力:)非常感谢。。。我将使用它来创建从lighttpd服务器访问媒体文件的查找。我希望我做了一个正确的选择……我需要更多地了解您的用例,以说明它是否是一个好的选择:)据说Tokyo Cabinet是一款功能强大、坚如磐石的软件(使用起来非常愉快!)。因此我使用TC创建服务器上所有媒体文件的查找。名称作为键,持续时间作为值。流式传输是通过HLS协议完成的。文件将由lighttpd提供。我已经为lightty编写了一个插件,它会将文件名发送给守护进程,守护进程会查看TC的持续时间并累积持续时间。此应用程序基本上计算用户观看特定媒体的时间。我的用例是500个用户流到一起。大约一百万条记录和每秒5次点击TC进行查找。我认为这是有意义的。请记住,您可能必须调整TC(有许多参数,包括bucket number和内部节点/叶缓存,它们都很重要)。问:为什么不使用-TC网络接口,用一个自定义接口来实现自定义逻辑而不是守护进程?是的,我已经根据我的用例对TC进行了调优。由于空间有限,还压缩了.tcb文件。在我的用例中,只有一个进程将访问数据库。另外,应该没有通过TCP/IP的通信,因为我不希望有任何网络开销。这是一个独立的系统。该模块只是更大系统的一部分。我正在使用UNIX域套接字进行进程之间的通信。
#include <stdio.h>
#include <string.h>
#include <tcbdb.h>

#define BUG 0

int
main(void)
{
  TCBDB *bdb = tcbdbnew();

  if (!tcbdbopen(bdb, "store.db", BDBOWRITER | BDBOCREAT)) {
    fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
  }

  char *key = "foo";
  char *val = "bar";

  if (!tcbdbput(bdb, key, strlen(key), val, strlen(val))) {
    fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
  }

  int size;
#if BUG
  char *buf = tcbdbget(bdb, key, strlen(key), NULL);
#else
  char *buf = tcbdbget(bdb, key, strlen(key), &size);
#endif

  if (!buf && tcbdbecode(bdb) != TCENOREC) {
    fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
  }

  if (buf)
    printf("%s -> %s\n", key, buf);

  free(buf);
  tcbdbdel(bdb);
  return 0;
}