gdbm 是标准 Unix dbm 库的 GNU 实现,它开始是由伯克利大学开发的。如果你用过 sendmail ,那么你可能听说过 dbm,sendmail 使用 dbm 来进行搜索它的邮件
gdmb 有以下几种特性:
1. 快速
gdmb 实现了一种基于文件系统的哈希表。它和类似的数据库比较起来那是相当的快,因为它不存在 RDBMS 里的高消耗。
2.Simple
使用 C 语言就可以很简单的操作 gdbm 。
3. 开源
gdbm 虽然已经很完美,但鉴于它的开源特性,你如果发现有什么问题或者需要改进的,你可以获得它的源代码并修改它。
因此,gdbm 较之其他类似的数据库它是显得相当轻便。如果你只是想存放数据并且用 key 来快速查询它们,那么 gdbm 就是一种很好的解决方案。然而,还是有几点要事先说明一下:
一个写者,多个读者
在某个时间上,仅能有一个进程可以打开并写文件,这时候不允许有其它读者可以打开该问及爱你,这相当于一个互斥锁。如果打开文件的目的并不是要写,那么允许任意个读者去打开该文件。
多个标准
比如 ndbm 和 GNU gdbm,但它们使用不同的格式,所以你希望将 ndbm 里的文件迁移到 gdbm 里用,那么需要事先进行转换,当然这有相关工具可以帮忙。
gdbm 提供了一个 dbm 的兼容模式,但在该模式下,你仅能在同一时间打开一个文件。
数据是否需要 null 结尾?
dbm 文件并不要求数据要以 null 结尾。但我们通常会用 C 语言来访问这些数据。如果你用不同的程序来操作 dbm,那么 key 和 key0 也许并不一样。所以,需要注意转换。在阅读了有 gdbm 的 man 手册后,你可能会奇怪为什么使用的数据会这么古怪,关于这一点确实也没有什么说明。key 和 数据都通过数据元来操作,数据元是一个简单的结构体:
[C++] 纯文本查看 复制代码 typedef struct {
char *dptr;
int dsize;
} datum;
所以,如果使用的是以 null 结束的字符串,那么你接着可以简单的将 dptr 指针传递给那些字符串函数了。如果你将数据当作字符串来使用,那么最好是先 malloc 一块缓存空间,而且空间应该是 dsize + 1 ,如再使用 strncpy() 函数拷贝数据到缓存空间时它会在数据末位添加 '\0' 。
内存管理
当 gdbm 从一个文件里获取了数据元,gdbm 会为此开辟缓冲并返回数据元。那这也意味着,你需要自己 free 掉这缓冲空间。如果不这么做,那么可能因为内存泄露而导致程序崩溃。 |