所有版本的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数据库的更多相关文章

  1. Linux实战教学笔记44:NoSQL数据库开篇之应用指南

    第1章 NoSQL数据库 1.1 NoSQL概述 自关系型数据库诞生40年以来,从理论产生发展到现实产品,例如:大家最常见的MySQL和Oracle,逐渐在数据库领域里上升到了霸主地位,形成每年高达数 ...

  2. Python程序设计9——数据库编程

    1 数据持久化 持久化是将内存中的对象存储在关系数据库中,当然也可以存储在磁盘文件.XML数据文件中.实现数据持久化至少需要实现以下3个接口 void Save(object o):把一个对象保存到外 ...

  3. httpd安装.md

    httpd 简介 httpd是由apache软件基金会开发的一款著名的web服务器软件.由于其开放源代码,并且拥有跨平台.功能强大.安全稳定等特性,而被广泛使用.早期httpd是在修修补补的基础上成长 ...

  4. 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 ...

  5. PHP探针

    来自LNMP.org 探针p.php 代码: <?php error_reporting(0); //抑制所有错误信息 @header("content-Type: text/html ...

  6. 《Python标准库》 目录

    目录 译者序序前言第1章 文本1.1 string—文本常量和模板1.1.1 函数1.1.2 模板1.1.3 高级模板1.2 textwrap—格式化文本段落1.2.1 示例数据1.2.2 填充段落1 ...

  7. 管理我的数据之GDBM

    管理我的数据之GDBM 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Publi ...

  8. Apache使用简介

    Apache使用简介 1.全局配置配置信 1) 配置持久连接 KeepAlive <On|Off>             #是否开启持久连接功能 MaxKeepAliveRequest ...

  9. php服务器探针

    <?php /* ---------------------------------------------------- */ /* 程序名称: PHP探针-Yahei /* 程序功能: 探测 ...

随机推荐

  1. Extjs4中tabPanel

    好文章引用:Extjs4 TabPanel例子 感谢原作者...

  2. 有关linux下redis overcommit_memory的问题(转)

    一.背景 公司的redis有时background save db不成功,通过log发现下面的告警,很可能由它引起的: [13223] 17 Mar 13:18:02.207 # WARNING ov ...

  3. MFC重绘函数:InvalidateRect(), Invalidate()和UpdateWindow()

    1. 重绘消息 当需要更新或者重绘窗口时,一般系统会发出两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化) WM_NCPAINT系统会自己搞定 WM_PAINT消 ...

  4. hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

    #1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...

  5. prim模板题

    题目链接:http://acm.hrbeu.edu.cn/index.php?act=problem&id=1223 #include <cstdio> #include < ...

  6. ARES

    ARES规划是恒生公用技术平台规划,以敏捷Agility.重用性Reused.扩展性Extend.简单性Simple为核心特性与价值取向,规划涉及ARES Server运行支撑平台.ARES Stud ...

  7. Java Web应用的开发模式

    一.概述 从互联网诞生的第一天起,web从一个简单的静态页面,发展到今天五花八门.令人眼花缭乱的复杂应用,大到企业级的web应用系统,小到简单的SPA管理系统.在硬件性能提升的同时,通过各种技术实现了 ...

  8. dos 命令

    DOS远程桌面连接命令 mstsc /v: 192.168.1.250 /console cmd 运行 command删除文件 rd 文件名/S创建文件 MD 文件名 1. net user admi ...

  9. win10在安装Oracle11g时出现了:[INS-13001]环境不满足最低要求,及未找到文件 E:\app\xxj\product\11.2.0\dbhome_1\owb\external\oc4j_applications\applications\WFMLRSVCApp.ear

    win10安装Oracle11g碰到的3个问题: 1.win10在安装Oracle11g时出现了:[INS-13001]环境不满足最低要求 2.未找到文件 E:\app\xxj\product\11. ...

  10. linux —— shell 编程(整体框架与基础笔记)

    导读 关于shell编程基础的学习,网上有很多资源,如果在校图书馆应该也有一些教程,所以这里对于零碎的基础不做详细记录,而只是对一些常用的概念.命令与操作做一个简要的记录,以备方便查找. (本文所有语 ...