主要的dbm函数的原型如下:
#include <ndbm.h>
DBM *dbm_open(const char *filename, int file_open_flags, mode_t file_mode);
int dbm_store(DBM *database_descriptor, datum key, datum content, int store_mode);
datum dbm_fetch(DBM *datebase_descriptor, datum key);
void dbm_close(DBM *database_descriptor);
1.dbm_open函数
这个函数用来打开已有的数据库,也可以用来创建新数据库,filename参数是一个基本文件名,它不包含.dir或者.pag后缀。第二个参数控制数据库的读、写和读/写权限。如果要创建一个新的数据库,这个标志必须与O_CREAT进行二进制或才允许文件被创建。第三个参数指定将被创建的文件的初始权限。
dbm_open返回一个指向DBM类型的指针,它将用于所有后续对数据库的访问,如果失败,它将返回(DBM*)0
2.dbm_store函数
dbm_store函数把数据存储到数据库,所有数据在存储时都必须有一个唯一的索引,为了定义要存储的数据和用来引用它的索引,必须设置两个datum类型的参数:一个用于引用索引,一个用于实际数据。最后一个参数store_mode用于控制当试图以一个已有的关键字来存储数据时发生的情况。如果它被设置为dbm_insert,存储操作将失败并且dbm_store返回1.如果它被设置为dbm_replace,则新数据将覆盖已有数据并且dbm_store返回0.当发生其他错误时,dbm_store将返回一个负值。
3.dbm_fetch函数
dbm_fetch函数用于从数据库中检索数据。它使用一个先前dbm_open调用返回的指针和一个指向关键字的datum类型结构作为其参数。它返回一个datum类型的结构。如果在数据库中找到与这个关键字关联的数据,返回的datum结构的dptr和dsize成员的值将被设置为相应数据的值。如果没有找到关键字,dptr将被设置为null。
4.dbm_close函数
这个函数关闭用dbm_open打开的数据库,它的参数是先前dbm_open调用返回的dbm指针。
编写dbm程序dbm1.c
首先,打开数据库,如果需要就创建它,接着,填充作为测试数据的items_to_store的3个成员。针对每个成员,分别创建一个索引关键字(使用两个字符串的头一个字符加上整数)。然后,设置两个datum结构,一个用于关键字,另一个用于存储的数据。再把3个数据项存储到数据库中之后,构建一个新的关键字并设置一个datum结构来指向它。然后,使用这个关键字从数据库中检索数据。通过检查返回的datum结构中的dptr成员是否为null,来判断检索是否成功。
7.3.4 其他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);
1.dbm_delete函数
用于从数据库中删除数据项,它使用一个指向关键字的datum类型结构作为其参数。
2.dbm_error函数
用于测试数据库中是否有错误发生。
3.dbm_clearerr函数
用于清除数据库中所有已被置位的错误条件标志
4.dbm_firstkey和dbm_nextkey函数
这两个函数一般成对使用对数据库中的所有关键字进行扫描。它们需要的循环结构如下所示:
DBM *db_ptr;
datum key;
for (key = dbm_firstkey(db_ptr); key.dptr; key = dbm_nextkey(db_ptr));
编写程序dbm2.c