berkeley db的 set_dup_compare 的使用

wangweiuway 2010-01-14 09:38:52
以下程序是在visual stdio 2008上编译的,主要是一个主数据库与一个次数据库,其中次数据库支持重复(DB_DUPSORT),比较函数由自己设(不使用系统的)但在实际测试中不会调自己设的回调函数(secondary_compare)来进行次索引的比较,但是如果次索引的字段改成u_char(本程序中用的为u_long)则会调到,这是为什么呢?有没有人知道的?
#include "db.h"
#include <string.h>
typedef struct _testID
{
u_long PIndex;
u_long stime;
}TID;
u_long tmp;
//主索引比较函数
int primary_compare( DB* db, const DBT *key1, const DBT *key2)
{
u_long a = ((TID*)(key1 ->data))->PIndex;
u_long b = ((TID*)(key2 ->data))->PIndex;
return (a - b);
}
// secondary compare function
int secondary_compare( DB* db, const DBT *key1, const DBT *key2)
{
//在这个函数打上断点怎么老是执行不到?是不是前面我哪里设错了?
u_long a = *(u_long*)(key1->data);
u_long b = *(u_long*)(key2->data);
return (a - b);
}
// get
int ExtSKEYC(DB* dbp, const DBT* pkey, const DBT *pdata, DBT *skey)
{

skey->data = &((TID*)(pkey ->data))->stime;
skey->size = sizeof(u_long);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DB* db_primary = NULL;
DB* db_secondary = NULL;

// PRIMARY DB
int nRet = -1;
// CREATE
nRet = db_create(&db_primary, NULL, 0);
// COMPARE
nRet = db_primary->set_bt_compare(db_primary, primary_compare);
// open
nRet = db_primary->open(db_primary, NULL, "primary.db", NULL, DB_BTREE, DB_CREATE,0);

// SECONDARY DB
nRet = db_create(&db_secondary, NULL, 0);
// flag
nRet = db_secondary->set_flags(db_secondary, DB_DUPSORT );
// compare
nRet = db_secondary->set_dup_compare(db_secondary, secondary_compare);
// open
nRet = db_secondary->open(db_secondary, NULL, "secondary.db", NULL, DB_BTREE, DB_CREATE, 0);
// associate
nRet = db_primary->associate(db_primary, NULL, db_secondary, ExtSKEYC, 0);


// write
DBT key, data;
TID pindex = {0,0};
for( int i = 0; i < 10000; i++)
{
pindex.PIndex = i;
pindex.stime = i + 10;
tmp = i + 10;
memset(&key, 0, sizeof( DBT));
memset(&data, 0, sizeof( DBT));
key.data = &pindex;
key.size = sizeof(TID);
data.data = "DB->set_dup_compare";
data.size = strlen("DB->set_dup_compare") + 1;
nRet = db_primary->put( db_primary, NULL, &key, &data, 0);
}
getchar();
nRet = db_secondary->close(db_secondary, 0);
nRet = db_primary->close(db_primary, 0);
return 0;
}
...全文
59 1 打赏 收藏 举报
写回复
1 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
focusforce 2010-01-19
  • 打赏
  • 举报
回复
加州大学berkeley分校网上有公开教程,你可以找找看。
发帖
其他数据库

2202

社区成员

其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
帖子事件
创建了帖子
2010-01-14 09:38
社区公告
暂无公告