Berkeley DB中Btree、Queue、Recno记录主键编号的说明

Berkeley DB中Btree、Queue、Recno记录主键编号的说明
2008-06-02 16:41

在Berkeley DB中Btree、Queue、Recno算法可以记录编号。编号基于1,不基于0。也就是说,数据库里的第一个记录是从1开始。 可以通过调用DB->get和DBcursor->c_get函数,参数指定为DB_SET_RECNO,关键字DBT的数据区一定是一个db_recno_t类型的指针,这种类型在Berkeley DB包含的头文件中声明。

关键字DBT的大小就是类型大小(用C来表示就是sizeof(db_recno_t))。db_recno_t 类型是32位的无符号整型数,这表明了数据库对记录数的限制最大到4,294,967,295。 在Recno算法中记录号可以是可变或者不变:可变,指的是当记录被删除或者插入时,编号改变;不变,指的是不管数据库如何操作,编号都不改变。在Queue算法中编号总被不变的。

在Btree算法中编号总是可变的,并且当记录被删除或者插入时,数据库里的其他记录的编号也可能会改变。 更多的信息请参阅重新编号的记录。 当在Queue下增加新数据时,当达到最大编号时,新加的记录编号将被赋1。此时将返回系统错误EFBIG。Recno在达到最大编号时,就不能再加入新的数据了。 配置Btree类数据库支持记录编号会严重影响多个并发线程对数据库的写操作, 因为储存记录计数的位置被这些线程经常性的调用。Btree的复制数据项,记录编号指向一个关键字和它所有的数据项,数据项没有单独的编号。

下面的例子是一个Recno数据库的读写操作。 函数使用了游标遍历了整个数据库,显示每条记录。

int recno_build(dbp) DB *dbp;

{ DBC *dbcp; DBT key, data; db_recno_t recno; u_int32_t len; int ret; char buf[1024];

/* 向数据库插入一条记录 */

memset(&key, 0, sizeof(DBT));

memset(&data, 0, sizeof(DBT));

for (recno = 1;; ++recno)

{

printf("record #%lu> ", (u_long)recno);

fflush(stdout); if (fgets(buf, sizeof(buf), stdin) == NULL) break;

if ((len = strlen(buf)) <= 1) continue;

key.data = &recno; key.size = sizeof(recno);

data.data = buf; data.size = len - 1;

switch (ret = dbp->put(dbp, NULL, &key, &data, 0)) { case 0: break; default: dbp->err(dbp, ret, "DB->put"); break; } } printf("\n");

/* 取得游标 */

if ((ret = dbp->cursor(dbp, NULL, &dbcp, 0)) != 0) { dbp->err(dbp, ret, "DB->cursor"); return (1); }

/* 重新初始化 key/data */

memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data));

/* 遍历整个数据库并且打印出key/data */

while ((ret = dbcp->c_get(dbcp, &key, &data, DB_NEXT)) == 0)

printf("%lu : %.*s\n", *(u_long *)key.data, (int)data.size, (char *)data.data);

if (ret != DB_NOTFOUND) dbp->err(dbp, ret, "DBcursor->get");

/* 关闭游标 */

if ((ret = dbcp->c_close(dbcp)) != 0)

{ dbp->err(dbp, ret, "DBcursor->close");

return (1);

}

return (0);

}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/263089/viewspace-684059/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/263089/viewspace-684059/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值