DBM数据库剖析系列
Dave888Zhou
大处着眼,小处着手;群居守口,独居守心。
展开
-
dbm数据库源代码分析(11):gdbmerrno.c、gdbmexists.c、gdbmfdesc.c和gdbmsync.c
(1)const char* gdbm_strerror(error)函数。将错误码转换成错误消息字符串。/* gdbmerrno.c - 把gdbm错误码转换成错误消息 *//* 首先包含系统配置相关的头文件 */#include "autoconf.h"#include "gdbmerrno.h"/* 错误消息数组是非静态的,以便应用程序可以随时访问它们。它必须与错误原创 2009-07-27 14:02:00 · 1305 阅读 · 0 评论 -
dbm数据库源代码分析(8):hash.c和findkey.c
现在解剖hash.c和findkey.c的源码。 (1)hash.c中的哈希函数int _gdm_hash(key)。返回一个31比特的值。这个值的前n比特用来对散列目录表进行索引。它也会用于在一个散列桶中查找桶元素的位置(通过与桶的散列表长度做模运算)。不要对函数中的计算过程有迷惑,它只是为了计算哈希值而设计的一个简单算法,主要用到了移位运算的模运算。/* hash.c - g原创 2009-07-26 19:03:00 · 1641 阅读 · 0 评论 -
dbm数据库源代码分析(5):gdbmopen.c和gdbmclose.c
现在解剖gdbmopen.c和gdbmclose.c的源码。 gdbmopen.c包含打开数据库的函数gdbm_oepen和初始化桶缓存的函数_gdbm_init_cache。注意其中的函数签名格式,函数参数列表中没给出类型,类型信息在圆括号和语句开始的左花括号之间。这种风格的函数签名是为了兼容老式的非标准的C编译器,gcc也支持这种风格的函数签名。 (1)gdbm_f原创 2009-07-25 21:25:00 · 1781 阅读 · 0 评论 -
dbm数据库源代码分析(13):ndbm部分
提供ndbm和dbm接口是为了与标准(如POSIX或X/Open规范)兼容。至于接口后面的实现,都是用gdbm部分来完成的,因此解剖了gdbm部分后,ndbm和dbm的实现就比较简单了,一般都是直接调用gdbm中的相应函数来完成的。注意用make编译时gdbm、ndbm、dbm部分都会被编译,但make install只会安装gdbm部分,若你需要使用ndbm和dbm的兼容实现,你还需要用m原创 2009-07-28 15:07:00 · 1878 阅读 · 1 评论 -
dbm数据库源代码分析(10):gdbmstore.c、gdbmfetch.c和gdbmdelete.c
(1)int gdbm_store(dbf,key,content,flags)函数。向数据库中存入新的关键字/数据。key为关键字,content为数据项。要注意的是gdbm实现时对存储数据大小没有限制。操作流程: 1)若数据库不可写或者要存的数据为空,则返回-1; 2)调用_gdbm_findkey在数据库中查找这个关键字,若找到,当flags为GDBM_REPL原创 2009-07-27 13:57:00 · 1432 阅读 · 0 评论 -
dbm数据库源代码分析(3):头文件部分
现在解剖gdbm的头文件部分的源码。 (1)autoconf.h:由configure脚本根据autoconf.h.in模板生成。autoconf.h为平台相关的的头文件、函数、库等定义常量标志(只有这些常量标志,没有其他任何头文件和代码),这样在你的源代码中就可以用预编译指令来引用这些常量标志(通过#include "autoconf.h"),以便能够构建出可移植的程序。/*原创 2009-07-25 20:27:00 · 2618 阅读 · 0 评论 -
dbm数据库源代码分析(6):bucket.c
现在解剖bucket.c的源代码。文件中包含了操作散列桶的_gdbm_new_bucket函数、_gdbm_get_bucket函数、_gdbm_split_bucket函数、_gdbm_write_bucket函数。 (1)void _gdbm_new_bucket(dbf, bucket, bits)函数。初始化一个新的hash_bucket,会设置其av_count和count原创 2009-07-26 18:53:00 · 1551 阅读 · 0 评论 -
dbm数据库源代码分析(4):头文件部分(续)
(7)proto.h:dbm例程的所有函数原型声明。包括内部接口和gdbm的用户接口。ndbm和dbm的兼容性实现也要用到这里的各个函数。这些函数的功能在具体的源代码解剖时会有详细说明。注意一些老式的非标准的C编译器中函数声明不能带参数列表,而标准的C编译器中函数声明必须带参数列表。为了兼容性,这里把函数的参数列表arg(包括函数名后面的括号)抽离出来定义成宏__P(arg),当编译器是标准原创 2009-07-25 20:58:00 · 1680 阅读 · 0 评论 -
dbm数据库源代码分析(2):构建性文件
现在解剖GNU dbm的构建性文件。由于项目的构建使用了Autotools工具集及make工具来完成。因此只解剖一些对理解项目至关重要的文件,主要有开发者编写的README、NEWS、ChangeLog、configure.in,由Autotools自动生成的COPYING、INSTALL、Makefile文件(由Makefile.in生成)。由于Makefile文件在项目构建时比较重要(我原创 2009-07-25 18:07:00 · 1824 阅读 · 0 评论 -
dbm数据库源代码分析(14):ndbm部分(续)
(5)int dbm_delete(dbf,key)函数。从数据库中删除给定的关键字及其关联的数据。直接调用gdbm_delete来完成工作。/* dbmdelete.c - 从数据库中删除给定的关键字及其关联的数据。 */#include "autoconf.h"#include "gdbmdefs.h"#include "extern.h"/* 从数据库dbf中删除原创 2009-07-28 15:12:00 · 1273 阅读 · 0 评论 -
dbm数据库源代码分析(7):falloc.c
现在解剖fallo.c的源代码。文件中包含了管理dbm文件空间的2个函数_gdbm_alloc、_gdbm_free。后面6个函数pop_avail_block、push_avail_block、get_elem、_gdbm_put_av_elem、get_block、adjust_bucket_avail都是前面这个函数需要使用的工具函数,是static函数(也叫内部函数),局部于文件的,原创 2009-07-26 18:59:00 · 1260 阅读 · 0 评论 -
dbm数据库源代码分析(17):Makefile文件和其他文件
(1)Makefile文件。make工具使用Makefile文件来对整个项目进行编译、安装、打包发布等。gdbm项目的Makefile文件内容如下: 1)收集系统的配置信息,并定义一些变量来保存它们,以便后面构建时能方便地使用它们。主要有: a)目录信息和构建工具:项目顶级目录top_builddir、源代码目录srcdir、编译器CC=gcc、库构建工具LIBT原创 2009-07-28 19:46:00 · 1782 阅读 · 0 评论 -
dbm数据库源代码分析(16):测试程序和转换程序
注意测试程序和转换程序默认不会被编译,默认的make命令只会编译gdbm、ndbm和dbm部分,你必须另外用make prog来编译测试和转换程序。 (1)gdbm测试程序testgdbm.c:用于测试gdbm各个功能的程序。为测试的方便,封装了4个函数用于打印相关信息,最后main函数实现各个功能的测试。 void print_bucket(bucket, mesg):打印原创 2009-07-28 15:23:00 · 1336 阅读 · 1 评论 -
dbm数据库源代码分析(15):dbm部分
dbm接口的实现基本上也都是直接调用gdbm中相应函数来完成的。 (1)int dbminit(file)函数。打开并初始化一个新的dbm数据库文件。本函数流程几乎与dbmopen.c中的dbm_open函数一样,只不过没有flags标志的判断,直接以可写方式打开一个新的文件,并把返回的文件信息结构保存在全局变量_gdbm_file中。/* dbminit.c - 为dbm操作打原创 2009-07-28 15:17:00 · 1676 阅读 · 0 评论 -
dbm数据库源代码分析(9):global.c、version.c和update.c
global.c中包含gdbm接口需要使用的一些外部变量定义,这些变量的声明放在extern.h头文件中,相应函数的源文件只要包含extern.h即可。/* global.c - 原始接口和错误消息需要的外部变量定义 */#include "autoconf.h"#include "gdbmdefs.h"#include "gdbmerrno.h"/* 用于原始接口的全局原创 2009-07-27 13:52:00 · 1345 阅读 · 0 评论 -
dbm数据库源代码分析(1):概述
符合X/Open技术规范的UNIX版本自备了一个数据库dbm。它使用使用hash来保存非结构化数据,不支持SQL。它只是一个存储检索数据的例程。数据以key/data对的形式存储在文件中。规范中允许把关键字/数据对的长度限制为1023个字节,但通常实现时不限制。关键字的取值被用作存储数据的索引。dbm被X/Open组织标准化为ndbm。GNU的dbm实现为gdbm(GNU dbm的缩写),它原创 2009-07-25 13:24:00 · 5194 阅读 · 1 评论 -
dbm数据库源代码分析(12):gdbmreorg.c、gdbmseq.c和gdbmsetopt.c
_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)函数。内部函数原创 2009-07-27 14:07:00 · 1187 阅读 · 0 评论