所有版本的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源文件的头文件要包含如果不是,则用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 *)0int 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与mysql区别_dbm数据库相关推荐

  1. gbase数据库是什么?gbase数据库与MySQL区别

    gbase数据库和MySQL数据库都是比较常见的数据库管理系统,二者在功能上有点类似,但是具体使用范围有些差异.gbase数据库是什么?gbase数据库与MySQL区别有什么?下面小编就来给大家详细介 ...

  2. 开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表

    开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表

  3. plsql和mysql的区别6_Oracle数据库和MySQL数据库的区别(原创)

    1.Oracle数据库产品是闭源同时也是收费的,MySQL是开源的项目(免费): 2.Oracle是大型数据库,Mysql是中小型数据库: 3.Oracle可以设置用户权限.访问权限.读写权限等,My ...

  4. mysql r和n的区别_mysql数据库 r n

    mysql集群的备份与还原 应用场景 当使用mysql集群数据库的时候,有时候会误删一些数据,那么数据就缺失了完整性,现在需要将数据进行备份,将误删的数据还原出来,这样保证数据的完整性. 操作步骤 注 ...

  5. mysql与其他数据库的区别_mysql与其他数据库的区别

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. mysql的innodb数据库引擎详解

    http://www.jb51.net/softjc/158474.html 这篇文章主要介绍了mysql的innodb数据库引擎,需要的朋友可以参考下 一.mysql体系结构和存储引擎 1.1.数据 ...

  7. xshell安装mysql步骤_数据库Mysql与禅道安装

    一.Linux上搭建禅道 Mysql 是关系型数据库管理系统 1.下载安装包:将安装包直接解压到/opt目录下,不要 解压到别的目录在拷贝到/opt/,因为这样会导致文件的所有者和读写权限改变 2.解 ...

  8. mysql collation utf8_mysql数据库 表字段 的collation utf8_unicode_ci

    字符集和Collations的一般介绍 一个character set (字符集)是一组符号和编码,而一个 collation 是在一个字符集里 比较字符的一套规则,让我们通过一个虚构的字符集例子来说 ...

  9. mySQL(关系型数据库管理系统)编辑

    收藏 2906 1034 mySQL(关系型数据库管理系统)编辑 MySQL[1] 是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是最流行的关系型数据 ...

  10. mysql 5.0 数据库_mysql5.0常用命令

    MySQL常用操作基本操作,以下都是MySQL5.0下测试通过首先说明下,记住在每个命令结束时加上:(分号) 1.导出整个数据库 mysqldump -u 用户名 -p --default-chara ...

最新文章

  1. 自动化测试框架的隐藏小细节,你都知道么
  2. 伍冬睿教授:脑机接口中迁移学习的完整流程
  3. Prompt-Tuning这么好用?
  4. 多项式牛顿迭代(应用:求逆,开根,对数exp)
  5. MyBatis各个jar包的作用
  6. php面向对象之策略模式,php策略模式的学习--引自《深入php面向对象模式与实践》...
  7. iOS学习笔记3 - 命名空间
  8. bitcoin 源码解析 - 交易 Transaction(三) - Script
  9. 东方木分享:如何快速的安装网吧系统
  10. 从iRedMail 创建web服务学习Nginx
  11. 使用 Anaconda 安装 Pytorch
  12. WPS网盘怎么显示在我的电脑里?
  13. ONF执行主席Dan Pitt:下一个战争可能是控制器
  14. 重装系统后有线网上不了网,校园网无法自动获取
  15. Python代码画小猪佩奇--turtle绘图
  16. Java分离中文姓名姓氏和名字
  17. 猿创征文|2022年前端之路——我的前端开发好帮手
  18. 盘点VBA中字典的写入技巧!
  19. 【jenkins】jenkins旧版本下载
  20. 服务器攻击瘫痪,网站瘫痪,企业如何应对频发

热门文章

  1. 网络摄像机目前的主流解决方案
  2. c# Environment.GetCommandLineArgs
  3. 使用tornado如何实现请求异步非阻塞?
  4. 关于selenium配置Chrome驱动(Windows系统)
  5. OTA再升级, 汽车云诊断风口将至,艾拉比早已“量产上车”
  6. 计算机算法设计与分析
  7. [4G/5G/6G专题基础-157]: 无线数据承载DRB与无线信令承载SRB
  8. 基于STM32F103C6T6HAL库控制SG90舵机
  9. 动态切换 web 报表中的统计图类型
  10. NOIP / CSP-S/J初赛基础知识1