其他的dbm函数
现在我们已经看到基本的dbm函数,我们可以简要的介绍一下dbm所使用的其他的函数:
int dbm_delete(DBM *database_descriptor, datum key);
int dbm_error(DBM *database_descriptor);
int dbm_clearerr(DBM *database_descriptor);
datum dbm_firstkey(DBM *database_descriptor);
datum dbm_nextkey(DBM *database_descriptor);
dbm_delete
dbm_delete函数用于由数据库中删除记录。与dbm_fetch类似,他也需要一个datum参数,所不同的是他并不是读取数据,而是删除数据。如果成功,则会返回0。
dbm_error
dbm_error函数只是简单的测试在数据库中是否发生了错误,如果没有错误则会返回0。
dbm_clearerr
dbm_clearerr函数清除在数据库中所设置的错误条件标记。
dbm_firstkey与dbm_nextkey
这两个函数用作一个函数对用于在数据库中的所有项目的键值中进行搜索。所需要循环结构如下:
DBM *db_ptr;
datum key;
for(key = dbm_firstkey(db_ptr); key.dptr; key = dbm_nextkey(db_ptr));
试验--读取与删除数据
现在我们使用这些新函数来修改dbm1.c程序,得到dbm2.c程序:
1 复制dbm1.c文件,进行编辑。编辑#define TEST_DB_FILE行:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <ndbm.h>
#include <string.h>
#define TEST_DB_FILE “/tmp/dbm2_test”
#define ITEMS_USED 3
2 然后我们需要改变的只是读取部分:
/* now try to delete some data */
sprintf(key_to_use, “bu%d”, 13);
key_datum.dptr = key_to_use;
key_datum.dsize = strlen(key_to_use);
if (dbm_delete(dbm_ptr, key_datum) == 0) {
printf(“Data with key %s deleted/n”, key_to_use);
}
else {
printf(“Nothing deleted for key %s/n”, key_to_use);
}
for (key_datum = dbm_firstkey(dbm_ptr);
key_datum.dptr;
key_datum = dbm_nextkey(dbm_ptr)) {
data_datum = dbm_fetch(dbm_ptr, key_datum);
if (data_datum.dptr) {
printf(“Data retrieved/n”);
memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);
printf(“Retrieved item - %s %d %s/n”,
item_retrieved.misc_chars,
item_retrieved.any_integer,
item_retrieved.more_chars);
}
else {
printf(“No data found for key %s/n”, key_to_use);
}
}
其输出结果如下:
$ ./dbm2
Data with key bu13 deleted
Data retrieved
Retrieved item - Third 3 baz
Data retrieved
Retrieved item - First! 47 foo
工作原理
这个程序的前面部分与前面的例子相同,只是简单的在数据库中存储数据。然后我们构建一个键值来匹配第二个项目,并且将其由数据库中删除。
程序然后使用dbm_firstkey与dbm_nextkey按顺序访问数据库中的每一个键值,读取数据。注意,数据并不是按顺序读取的:不存在按键值顺序实现的检索顺序;他只是遍历所有记录的一个简单方法。