1. dbm数据库
dbm数据库适合于储存相对比较静态的索引化数据,是一个索引化得文件存储系统。它的优点是非常容易被编译进一个可发布的二进制可执行程序,因为它无需安装独立的服务器,而且即使它需要的底层文件还未安装,也不会有什么危险。
dbm数据库允许你通过使用索引来存储可变长数据结构,然后通过索引或简单的顺序扫描数据库来检索结构。Dbm数据库适用于处理那些被频繁访问但却很少被更新的数据,因为它创建数据项时非常慢,而检索时非常快。
2. dbm例程
dbm工具也是由头文件和库文件组成,而且库文件必须在程序编译时链接进来。库文件被称为dbm,因此链接它时需要加上选项-ldbm(-lgdbm)。其头文件是ndbm.h。
dbm数据库的基本元素是需要存储的数据块以及与它关联的在检索数据库时用作关键字的数据块。每个dbm数据库必须有一个针对每个要存储的数据块的唯一关键字。规范中允许把关键字/数据对的长度限制为1023个字节,但通常不限制。关键字的取值被用作存储数据的索引。
头文件ndbm.h定义了一个名为datum的新数据类型,该类型确切内容依赖于具体实现,但它至少包括以下成员:
void *dptr;
size_t dsize;
datum是一个用typedef语句定义的类型。在ndbm.h中还定义了一个DBM类型,这是一个用来访问数据库的结构,其作用和用来访问文件的FILE结构很相似。
当使用dbm库时,要想引用一个数据块,必须声明一个datum类型的变量,将成员dptr指向数据的起始点,并把成员dsize设为数据的长度。无论是待存储的数据还是用来访问它的索引都总是通过一个datum类型来引用的。
当打开一个dbm数据库时,将创建两个物理文件,它们的后缀分别是.gag和.dir,而仅仅返回一个dbm指针,它被用来访问这两个文件。这两个文件决不应该被直接读写,对它们的访问一定要通过dbm例程来进行。
dbm数据库工作在非结构化的二进制数据块基础上。
3. dbm访问函数
#include <ndbm.h>
DBM *dbm_open(const char *filename, int flags, mode_t file_mode);
int dbm_store(DBM *dbdes, datum key, datum data, int store_mode);
datum dbm_fetch(DBM *dbdes, datum key);
void dbm_close(DBM *dbdes);
int dbm_delete(DBM *dbdes, datum key);
int dbm_error(DBM *dbdes);
int dbm_clearerr(DBM *dbdes);
datum dbm_firstkey(DBM *dbdes);
datum dbm_nextkey(DBM *dbdes);
3.1. db_open函数
这个函数用来打开一个已经存在或创建一个新数据库,filename参数是一个基本文件名称,不包括.dir或.pag后缀。
第二个参数控制数据库的读、写或读/写权限。如果你是创建一个新的数据库,这些标志必须与O_CREAT进行二进制或来允许文件被创建。
第三个参数指定被创建文件的初始权限。
dbm_open返回一个DBM类型的指针。它被用于所有后续对数据库的访问。如果失败,返回(DBM*)0。
3.2. dbm_store函数
该函数是把数据存储到数据库中。为了定义我们希望存储的数据和用来引用它的索引,必须设置两个datum类型:一个用于索引,一个用于实际数据。最后一个store_mode用于控制当试图以一个已有的关键字来存储数据时发生地情况。如果它被设置为dbm_insert,存储操作将失败并且返回1。如果它被设置为dem_replace,新数据将覆盖已有数据并且返回0。
当发生其他错误时,dbm_store返回一个负值。
3.3. dbm_fetch函数
该函数用于从数据库中获取数据。它使用一个前面dbm_open调用返回的指针和一个指向关键字的datum类型的结构。它将返回一个datum类型的结构。如果在数据库中找到关联这个关键字的数据,返回的datum结构的dptr和dsize成员的值将被设为相应的数据的值。如果没有找到关键字,dptr将被设置为null。
3.4. dbm_close函数
该函数关闭用dbm_open打开的数据库。
3.5. dbm_delete函数
该函数用于从数据库中删除数据项。成功返回0。
3.6. Dbm_error函数
该函数用于简单的测试数据库中是否有错误发生,如果没有就返回0。
3.7. Dbm_clearerr函数
该函数用于清除数据库中所有已经被置位的错误条件标志。
3.8. dbm_firstkey函数和dbm_nextkey函数
这两个函数成对使用,用于对数据库中的所有关键字进行扫描。
4. 实例