dbm数据库源代码分析(12):gdbmreorg.c、gdbmseq.c和gdbmsetopt.c

来源:互联网 发布:算法复杂性o, 编辑:程序博客网 时间:2024/05/23 17:55

   _gdbm_rename和gdbm_reorganize函数在gdbmreorg.c中,其中_gdbm_rename是内部函数。get_next_key、gdbm_firstkey和gdbm_nextkey函数在gdbmseq.c中。gdbm_setopt函数在gdbmsetopt.c中。
   (1)int _gdbm_rename (old_name, new_name)函数。内部函数。对文件进行重命名。如果不能重命名,则返回一个非0值,并且保证文件的old_name没有变化。

   (2)int gdbm_reorganize(dbf)函数。重组数据库文件。这需要创建一个新文件,并把旧文件dbf的所有项插入到新文件中。新文件然后重命名为旧文件dbf的名字,而dbf结构也会更新成包含新文件的所有正确信息。如果一个错误发生,则返回负值。如果操作成功,则返回0值。操作流程:
     1)为临时文件构造一个新文件名;
     2)获取旧文件的打开模式,然后打开新的数据库文件;
     3)通过gdbm_firstkey和gdbm_nextkey,获取旧数据库的每个关键字及其关联的数据,并把它存入到新数据库中;
     4)用_gdbm_end_update完成数据库的所有更新,并等待更新完成;
     5)把新文件重命名为原来的文件名,释放dbf中的原来一些域;
     6)释放所有缓存项中的桶、关键字/数据、以及整个桶缓存数组;
     7)把dbf的相关域设为新文件的正确信息;
     8)等待新文件的数据写入完成,最后设置好当前缓存项指针,以及当前桶指针。

   (3)void get_next_key (dbf, elem_loc, return_val)函数。从elem_loc位置开始搜索散列桶中的下一个关键字/数据项(在桶元素中),用return_val返回获取的值。程序从当前桶的elem_loc位置开始,根据散列目录表中的目录项查找每一个桶,扫描其每个桶元素,一旦发现其中有关键字/数据(即桶元素的哈希值不为-1)。一旦有,就调用_gdbm_read_entry把它读取到return_val中,并返回它。

   (4)datum gdbm_firstkey(dbf)函数。返回文件上的第一个散列桶中的第一个关键字。程序先获取索引0处目录项指示的桶(第一个桶),然后寻找这个桶中的第一个关键字。

   (5)datum gdbm_nextkey(dbf)函数。返回文件dbf中跟在key后面的一个关键字。程序先查找当前关键字,返回其所有桶元素的位置。然后根据这个位置调用get_next_key查找其下一个关键字。

   (6)int gdbm_setopt(dbf,optflag,optval,optlen)函数。设置一个gdbm数据库的一些选项,这些选项标志参看gdbmconst.h。操作在这个打开的数据库文件描述符上进行。主要的选项有GDBM_CACHESIZE、GDBM_FASTMODE、GDBM_SYNCMODE、GDBM_CENTFREE、GDBM_COALESCEBLKS。除GDBM_CACHESIZE选项关联的值为一个正整数值外,其余选项关联的值均为布尔值。