您的位置:首页 > 数据库

dbm数据库

2013-10-22 23:44 134 查看
  所有版本的linux以及大多数的UNIX版本都随系统带有一个基本的、但却非常搞笑的数据存储历程集,他被称为dbm数据库。适用于存储比较静态的索引化数据库,即使用索引来存储可变长的数据结构,然后通过索引或顺序扫描数据库来检索结构,适用于处理那些被频繁访问但却很少被更新的数据,因为创建数据项时非常慢,而检索时非常快。

  dbm数据库存在着各种不同的版本,他们的API接口和特性都有一些细微的差别。最初的dbm集,又有“新”的被称为ndbm的dbm集,还有GNU的dbm实现gdbm。GNU的实现版本虽然可以模拟旧版本的dbm和ndbm接口,但本身的接口和其他实现版本相比,还是有着显著的不同。大多数主流的Linux发行版都会默认安装gdbm,但一些发行版,就需要安装,如Ubuntu——需要安装libgdbm-dev。

  虽说你已经安装了gdbm和ndbm了,系统在默认情况下支持ndbm模式,你还要知道如何编译这些源文件。例如安装了gdbm,需如下操作:

  (1) 在C源文件中包含头文件ndbm.h;

  (2) 使用编译行选项-I/usr/include/gdbm包含头文件目录/usr/include/gdbm;

  (3) 使用编译行选项-lgdbm连接gdbm库

  然而,如果你安装的是libgdbm-dev,且需要ndbm兼容模式,必须明确指定他,并且在链接主函数库之前链接兼容库。操作如下:

  (1) 在C源文件中包含头文件gdbm.h,而不是ndbm.h;

  (2) 使用编译行选项-I/usr/include/gdbm包含头文件目录/usr/include/gdbm;

  (3) 使用编译行选项-lgdbm_compat连接其他的gdbm库

  注意:在gdbm兼容模式下C源文件的头文件要包含<ndbm.h>如果不是,则用gdbm-ndbm.h文件替换ndbm.h。

1.准备工作

  在开始解释每个dbm函数之前,你必须明白dbm数据库能够做什么,这会更好的帮助你理解该如何使用dbm函数。

  dbm数据库的基本袁术是需要存储的数据以及与他关联的在检索数据时用作关键字的数据块。每个dbm数据库必须针对对每个要存储的数据有一个唯一的关键字。关键字的取值被用作存储数据的索引。dbm对于关键字和数据没有限制,对使用超长关键字和数据的情况也为定义任何错误。规范允许具体实现把关键字/数据对的长度限制为1023个字节,但具体实现通常不会进行限制,这是因为具体实现往往要比技术规范所要求的更灵活。

  为了操作这些数据块,头文件ndbm.h定义了一个名为datum的新数据类型。该类型确切的内容依赖于集体实现,但它至少包含下面两个成员:

void *dptr;
size_t dsize;


  datum是一个用typedef语句定义的类型。在ndbm.h文件中还为dbm声明了一个类型定义,它是一个用来访问数据的结构,其作用和用来访问文件FILE结构很相似。还是那句话,dbm类型定义的内部结构依赖与具体实现。

  在使用dbm库是,如果要引用一个数据块,必须声明datum类型的变量,将成元dptr指向数据的起始点,并把成员dsize设为包含数据的长度。无论是待存储的数据或用来访问他的索引都总是通过这个datum类型来引用。当打开一个dbm数据库时,通常会创建两个物理文件,后缀分别是.pag和.dir并返回一个dbm指针,它被用来访问这两个文件,且这两个文件不应该被直接读写,只能通过dbm例程来进行。在一些视线中,这两个文件被合并到一起,打开数据库只会创建一个文件。

2 dbm访问函数

DBM *dbm_open(const char *filename,int file_open_flags,mode_t file_mode);  //filename基本文件名(不包含.dir .pag,返回一个指向DBM类型的指针。如果失败,返回(DBM *)0
int dbm_store(DBM *database_descriptor,datum key,datum content,int store_mode);
datum dbm_fetch(DBM *database_descriptor,datum key);
void dbm_close(DBM *database_descriptor);


  1.dbm_open函数——用来打开以后或创建数据库,第二个参数控制数据库的读、写或读/写权限。如果要创建一个新的数据库,这个标志必须与O_CREAT进行二进制或才允许被创建。第三个参数指定将被创建的文件的权限。

  2.dbm_store函数——将数据存储数据库中。为了定义你想要存储的数据和用来引用它的索引,必须设置两个datum类型的参数;一个用于引用索引,一个用于实际数据。store_mode用于控制当试图以一个已有的关键字存储数据时会发生的情况:设置为dbm_insert,存储操作将失败并且dbm_store返回1;设置为dbm_replace,则新数据将覆盖已有数据并且dbm_store返回0;当发生其他错误,dbm_store将返回一个负值。

  3.dbm_fetch函数——用于从数据库中检索数据。它使用一个先前dbm_open函数返回的指针和一个指向关键字的datum类型结构作为其参数。它返回一个datum结构类型(虽说返回的仅仅包含一个指向数据的指针。实际数据依然保存在dbm库的本地存储空间中,在继续调用dbm函数前,必须把数据复制到程序的变量中才行)。如果数据库中找到与这个关键字关联的数据,返回的datum结构的dptr和dsize成员的值将被设为相应数据的值。如果没有找到关键字,dptr将被设置为null。

  4.dbm_close函数——关闭dbm_open打开的数据库。

3 其他dbm函数

int dbm_delete(DBM *database_descriptor,datum key);//从数据库中删除数据,成功时返回0.
int dbm_error(DBM *database_descriptor);//只是用于测试数据库中是否有错误发生,如果没有就返回0.
int dbm_clearerr(DBM *database_descriptor);//用于清楚数据库中所有已被置位的错误条件标志
datum dbm_firstkey(DBM *database_descriptor);
datum dbm_nextkey(DBM *database_descriptor);//这两个函数一般称对使用来对数据库中的所有关键字进行扫描。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: