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 /* 程序功能: 探测 ...
随机推荐
- wpa_supplicant使用笔记-wpa_cli iwconfig
还在搞8634,看不到头了..唉.wireless_tools的缺点是不支持WPA认证,所以有必要把wpa_supplicant也移植过来.无线 网卡是基于zydas芯片的,正好可以在网上搜到wpa_ ...
- 《ACM国际大学生程序设计竞赛题解I》——6.11
pku 1107: Description Weird Wally's Wireless Widgets, Inc. manufactures an eclectic assortment of sm ...
- windows下python安装paramiko
Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypto模块,因此要在Python中使用SSH,则需要先安装模块顺序是 ...
- 理解Java NIO
基础概念• 缓冲区操作缓冲区及操作是所有I/O的基础,进程执行I/O操作,归结起来就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么把缓冲区填满(读).如下图• 内核空间.用户空间 上图 ...
- [置顶] C++中RTTI机制剖析
C++中要想在运行时获取类型信息,可没有Java中那么方便,Java中任何一个类都可以通过反射机制来获取类的基本信息(接口.父类.方法.属性.Annotation等),而且Java中还提供了一个关键字 ...
- mysql忘记root密码 + 授权登录
一.拥有原来的myql的root的密码: 方法一:在mysql系统外,使用mysqladmin# mysqladmin -u root -p password "test123"E ...
- 6th day
时光荏苒,岁月如梭,2016年马上就要过去了,今天PHP的核心知识基本上已经讲完,后面就要开始学习数据库,做项目之类的,心情还真是有点小激动.总之,新年新气象,祝愿各位在新的一年里能够心想事成,好好学 ...
- CreateThread函数
当使用CreateProcess调用时,系统将创建一个进程和一个主线程. CreateThread将在主线程的基础上创建一个新线程,大致做例如以下步骤: 1在内核对象中分配一个线程标识/句柄,可供管理 ...
- MatLab计算图像圆度
本文所述方法可以检测同一图像中的多个圆形(准确的说,应该是闭合图像). 在Matlab2010a中可以实现. 附录效果图: %颗粒圆度 clear;close all; %% %读取源图像 I = i ...
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
本文属于原创,转载请著名出处:http://flysnow.iteye.com/blog/906770 写道 在我们开发一些如短消息.应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用 ...