Berkeley DB中Btree、Queue、Recno记录编号的说明及应用实例

在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); }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值