dbm数据库
所有版本的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);//这两个函数一般称对使用来对数据库中的所有关键字进行扫描。
dbm数据库的更多相关文章
- Linux实战教学笔记44:NoSQL数据库开篇之应用指南
第1章 NoSQL数据库 1.1 NoSQL概述 自关系型数据库诞生40年以来,从理论产生发展到现实产品,例如:大家最常见的MySQL和Oracle,逐渐在数据库领域里上升到了霸主地位,形成每年高达数 ...
- Python程序设计9——数据库编程
1 数据持久化 持久化是将内存中的对象存储在关系数据库中,当然也可以存储在磁盘文件.XML数据文件中.实现数据持久化至少需要实现以下3个接口 void Save(object o):把一个对象保存到外 ...
- httpd安装.md
httpd 简介 httpd是由apache软件基金会开发的一款著名的web服务器软件.由于其开放源代码,并且拥有跨平台.功能强大.安全稳定等特性,而被广泛使用.早期httpd是在修修补补的基础上成长 ...
- CentOS6.3 编译安装LAMP(2):编译安装 Apache2.2.25
所需源码包: /usr/local/src/Apache-2.2.25/httpd-2.2.25.tar.gz 编译安装 Apache2.2.25 #切换到源码目录 cd /usr/local/src ...
- PHP探针
来自LNMP.org 探针p.php 代码: <?php error_reporting(0); //抑制所有错误信息 @header("content-Type: text/html ...
- 《Python标准库》 目录
目录 译者序序前言第1章 文本1.1 string—文本常量和模板1.1.1 函数1.1.2 模板1.1.3 高级模板1.2 textwrap—格式化文本段落1.2.1 示例数据1.2.2 填充段落1 ...
- 管理我的数据之GDBM
管理我的数据之GDBM 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Publi ...
- Apache使用简介
Apache使用简介 1.全局配置配置信 1) 配置持久连接 KeepAlive <On|Off> #是否开启持久连接功能 MaxKeepAliveRequest ...
- php服务器探针
<?php /* ---------------------------------------------------- */ /* 程序名称: PHP探针-Yahei /* 程序功能: 探测 ...
随机推荐
- 修改css
.content{ height: 100%; } .con{ border: 1px solid #eeeeee; display: inline-block; width:86.8%; ##修改这 ...
- 使用DateDiff方法获取日期时间的间隔数
一:用DateDiff方法获取日期时间的间隔数,截图 二:代码 using System; using System.Windows.Forms; using Microsoft.VisualBasi ...
- UNITY3D 破碎 shatter
convex mesh collider + shatter rigidbody ,
- Java nextInt()函数
nextInt( int num) 能接受一个整数作为它所产生的随机整数的上限,下限为零,比如:nextInt(4)将产生0,1,2,3这4个数字中的任何一个数字,注意这里不是0-4,而是0-3..但 ...
- 《ACM国际大学生程序设计竞赛题解I》——6.11
pku 1107: Description Weird Wally's Wireless Widgets, Inc. manufactures an eclectic assortment of sm ...
- php总结 --- 19. 其他小知识
1. PHP博物馆 php各个版本的代码库 2. PHP-GTK php桌面程序 3. Pecl 4. Pear 5. php调试器 目前还不清楚具体有什么大的优势,为什么要用, IDE不能满足吗 6 ...
- Dump 文件生成与分析
近期两天因为项目的须要,研究了一下Dump文件相关的知识,今天做一个小节(因为研究不久而且第一次写blog,希望网友们看到不要见笑). Dump文件是进程的内存镜像.能够把程序的运行状态通过调试器保存 ...
- 【转】四种常见的POST提交数据方式
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...
- NDN路由--OSPFN安装与配置
现在的IP网络的问题已经暴露的很多了,各种改进的网络架构与设想非常多,但其中以基于内容为中心的网络发展最为迅速,其中,NDN的架构最为完整,代码也比较成熟.OSPFN是基于CCNX的,所以之前要安装C ...
- 关于Yaffs2在u-boot中的支持
开发板是一块2G的MLC的NandFlash,页大小8k+512,为其移植u-boot到yaffs2这了.以前在Mini2440上移植过2k+64的slc的NandFlash的Yaffs2支持,当然也 ...