曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4453|回复: 0
打印 上一主题 下一主题

gdbm

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-7-25 10:40:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 掉这缓冲空间。如果不这么做,那么可能因为内存泄露而导致程序崩溃。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-18 13:39 , Processed in 0.063994 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表