大多数主流的Linux发行版都会默认安装gdbm,但在一些发行版中,你可能需要使用软件包管理器来安装相应的开发库。例如,在

ubuntu中,你可能需要使用Synaptic软件包管理器来安装libgdbm-dev软件包,因为它一般不会被默认安装。

dbm的数据块datum是一个用typedef语句定义的类型。它至少包含下面两个成员:

void *dptr;

size_t dsize;

dbm访问函数包括下面四个:

#include<ndbm.h>
DBM *dbm_open(const char *filename, int file_open_flags , mode_t mode);
int dbm_store(DBM *database_descriptor , datum key, datum content, int store_mode);
datum datum_fetch(DBM *database_descriptor , datum key);
void dbm_close(DBM *database_descriptor);

1.dbm_open函数

这个函数用来打开已有的数据库,也可以用来创建新数据库。filename参数是一个基本文件名,它不包含.dir或.pag后缀。

其余的参数与open函数的第二个和第三个参数一样。

dbm_open返回一个指向DBM类型的指针。它被用于所有后续对数据库的访问,如果失败,它将返回(DBM *)0。

2.dbm_store函数

你用这个函数把数据存储到数据库中,如前所述,所有数据在存储时都必须有一个唯一的索引。

为了定义你想要存储的数据和用来应用他的索引,你必须设置两个datum类型的参数:一个用于引用索引,一个用于实际

数据。最后一个参数store_mode用于控制当试图以一个已有的关键字来存储数据时发生的情况。如果它被设置为dbm_insert

,存储操作将失败并且dbm_store返回1.如果它被设置为dbm_replace,则新数据将覆盖已有数据并且dbm_store返回0.当发生

其他错误时,dbm_store将返回一个负值。

3.dbm_fetch函数

dbm_fetch函数用于从数据库中检索数据,它使用一个先前dbm_open调用返回的指针和一个指向关键字datum类型结构作为参数。

它返回一个datum类型的结构。如果在数据库中找到与这个与这个关键字关联的数据,但会的datum结构的dptr和dsize成员的

值将被设为相应数据的值。如果没有找到关键字,dptr将被设置为NULL;

4.dbm_close函数

这个函数用于关闭dbm_open函数打开的数据库。它的参数是先前dbm_open调用返回的dbm指针。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>#include <ndbm.h>
/* On some systems you need to replace the above with
#include <gdbm-ndbm.h>
*/#include <string.h>#define TEST_DB_FILE "/tmp/dbm1_test"
#define ITEMS_USED 3/* A struct to use to test dbm */
struct test_data {char misc_chars[15];int  any_integer;char more_chars[21];
};int main() {struct test_data items_to_store[ITEMS_USED];struct test_data item_retrieved;char key_to_use[20];int i, result;datum key_datum;datum data_datum;DBM *dbm_ptr;dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);if (!dbm_ptr) {fprintf(stderr, "Failed to open database\n");exit(EXIT_FAILURE);}/* put some data in the structures */memset(items_to_store, '\0', sizeof(items_to_store));strcpy(items_to_store[0].misc_chars, "First!");items_to_store[0].any_integer = 47;strcpy(items_to_store[0].more_chars, "foo");strcpy(items_to_store[1].misc_chars, "bar");items_to_store[1].any_integer = 13;strcpy(items_to_store[1].more_chars, "unlucky?");strcpy(items_to_store[2].misc_chars, "Third");items_to_store[2].any_integer = 3;strcpy(items_to_store[2].more_chars, "baz");for (i = 0; i < ITEMS_USED; i++) {/* build a key to use */sprintf(key_to_use, "%c%c%d",items_to_store[i].misc_chars[0],items_to_store[i].more_chars[0],items_to_store[i].any_integer);/* build the key datum strcture */key_datum.dptr = (void *)key_to_use;key_datum.dsize = strlen(key_to_use);data_datum.dptr = (void *)&items_to_store[i];data_datum.dsize = sizeof(struct test_data);result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE);if (result != 0) {fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);exit(2);}} /* for *//* now try and retrieve some data */sprintf(key_to_use, "bu%d", 13); /* this is the key for the second item */key_datum.dptr = key_to_use;    /*提供测试*/key_datum.dsize = strlen(key_to_use);data_datum = dbm_fetch(dbm_ptr, key_datum);if (data_datum.dptr) {printf("Data retrieved\n");memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);printf("Retrieved item - %s %d %s\n",item_retrieved.misc_chars,item_retrieved.any_integer,item_retrieved.more_chars);}else {printf("No data found for key %s\n", key_to_use);}dbm_close(dbm_ptr);exit(EXIT_SUCCESS);
}

其他dbm函数

int dbm_delete(DBM *database_descriptor , datum key);

这个函数用于从数据库中删除数据项,与dbm_fetch一样,它也使用一个指向关键字的datum类型结构作为其参数,但不同的是,它是用于

删除数据而不是用于检索数据。它在成功时返回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 *db_ptr;

datum key;

for(key=dbm_firstkey(db_ptr); key.dptr ; key = dbm_nextkey(db_ptr));

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>#include <ndbm.h>
/* On some systems you need to replace the above with
#include <gdbm-ndbm.h>
*/#include <string.h>#define TEST_DB_FILE "/tmp/dbm2_test"
#define ITEMS_USED 3/* A struct to use to test dbm */
struct test_data {char misc_chars[15];int  any_integer;char more_chars[21];
};int main() {struct test_data items_to_store[ITEMS_USED];struct test_data item_retrieved;char key_to_use[20];int i, result;datum key_datum;datum data_datum;DBM *dbm_ptr;dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);if (!dbm_ptr) {fprintf(stderr, "Failed to open database\n");exit(EXIT_FAILURE);        }/* put some data in the structures */memset(items_to_store, '\0', sizeof(items_to_store));strcpy(items_to_store[0].misc_chars, "First!");items_to_store[0].any_integer = 47;strcpy(items_to_store[0].more_chars, "foo");strcpy(items_to_store[1].misc_chars, "bar");items_to_store[1].any_integer = 13;strcpy(items_to_store[1].more_chars, "unlucky?");strcpy(items_to_store[2].misc_chars, "Third");items_to_store[2].any_integer = 3;strcpy(items_to_store[2].more_chars, "baz");for (i = 0; i < ITEMS_USED; i++) {/* build a key to use */sprintf(key_to_use, "%c%c%d",items_to_store[i].misc_chars[0],items_to_store[i].more_chars[0],items_to_store[i].any_integer);/* build the key datum strcture */key_datum.dptr = key_to_use;key_datum.dsize = strlen(key_to_use);data_datum.dptr = (void *)&items_to_store[i];data_datum.dsize = sizeof(struct test_data);result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE);if (result != 0) {fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);exit(2);}} /* for *//* now try and delete some data */sprintf(key_to_use, "bu%d", 13); /* this is the key for the second item */key_datum.dptr = key_to_use;key_datum.dsize = strlen(key_to_use);if (dbm_delete(dbm_ptr, key_datum) == 0) {printf("Data with key %s deleted\n", key_to_use);}else {printf("Nothing deleted for key %s\n", key_to_use);}for (key_datum = dbm_firstkey(dbm_ptr); key_datum.dptr; key_datum = dbm_nextkey(dbm_ptr)) {data_datum = dbm_fetch(dbm_ptr, key_datum);if (data_datum.dptr) {printf("Data retrieved\n");memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);printf("Retrieved item - %s %d %s\n",item_retrieved.misc_chars,item_retrieved.any_integer,item_retrieved.more_chars);}else {printf("Woops - no data found for key %s\n", key_to_use);}} /* for each key */dbm_close(dbm_ptr);exit(EXIT_SUCCESS);
}

linux dbm数据库相关推荐

  1. 如何在linux系统下修改mysql密码_如何在linux下修改mysql数据库密码?linux修改数据库密码的方法...

    本篇文章给大家带来的内容是介绍如何在linux下修改mysql数据库密码?linux修改数据库密码的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. Linux下修改Mysql的 ...

  2. 戏说Linux商用数据库

    戏说Linux商用数据库 上一篇文章(http://chenguang.blog.51cto.com/350944/277533)我介绍了Linux下几款开源数据库Mysql,MaxDB.Postgr ...

  3. Linux oracle数据库自动备份自动压缩脚本代码

    Linux oracle数据库自动备份自动压缩脚本代码 Linux oracle数据库备份完成后可以自动压缩脚本代码. 复制代码代码如下: #!/bin/bash #backup.sh #edit: ...

  4. Linux MYSQL 数据库

    Linux MYSQL  数据库 1.1.概述: DBMS datebase management system  数据库管理系统 DML:date manapulate lanaguage  数据操 ...

  5. linux数据库实例开机启动,linux下数据库实例开机自启动设置

    linux下数据库实例开机自启动设置 1.修改/oratab [root@org54 ~]# vi/etc/oratab --把N改为Y,如下提示 # This file is used by ORA ...

  6. mysql 磁盘限额_Linux运维知识之为Linux MySQL数据库设置磁盘限额

    本文主要向大家介绍了Linux运维知识之为Linux MySQL数据库设置磁盘限额,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 因为MySQL数据库本身没有磁盘限额的功能,我 ...

  7. 构建适用于Oracle 11.2.0.x的Linux单数据库实例的DataGuard

    构建适用于Oracle 11.2.0.x的Linux单数据库实例的DataGuard 使用脚本自动化构建Oracle DataGuard 下载脚本 git clone https://github.c ...

  8. linux mysql 磁盘_Linux运维知识之为Linux MySQL数据库设置磁盘限额

    本文主要向大家介绍了Linux运维知识之为Linux MySQL数据库设置磁盘限额,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 因为MySQL数据库本身没有磁盘限额的功能,我 ...

  9. Navicat连接虚拟机Linux的数据库时,出现错误代码“10038”

    问题描述: Navicat连接虚拟机Linux的数据库时,出现错误代码"10038" 解决办法: Navicat远程连接mysql之前需要先给用户授予远程登录权限,打开mysql分 ...

最新文章

  1. 一文就懂Kotlin作用域函数以及object关键字
  2. zookepper 安装
  3. 机器学习:防止模型过拟合的方法
  4. 介绍一个好用的静态图片合成为 gif 动画的在线网站
  5. 计算机专业的三行情书,各专业三行情书,看懂你就是全能学霸!
  6. 基于Spring Boot的Logback日志轮转配置
  7. 左移和右移运算符的重载问题(里面的绝对盲点)在做了一遍,还是出错了
  8. oracle 自增长这么使用,Eova Oracle 自增长的处理
  9. oracle 获取日期的毫秒_Oracle 毫秒时间戳
  10. php 怎么打出来的,word书名号怎么打出来
  11. 洛谷 P1049 装箱问题
  12. php 算生存曲线,生存分析之生存曲线绘制
  13. HAL库版STM32双轮自平衡车(一) ———代码思路和PID基础精讲
  14. JAVA衣依服装销售平台计算机毕业设计Mybatis+系统+数据库+调试部署
  15. 怎么搜索一下整个网络的计算机,如何快速查找自己电脑IP地址?
  16. html中spry的长度怎么更改,Dreamweaver中Spry区域功能说明
  17. 使用GSL库实现非线性最小二乘拟合—原理与C代码实现(VS2019)
  18. 实习日志03-技术02
  19. 联想LJ2000打印机Mac OS/Linux驱动程序
  20. 美版饿了么上市:美国外卖行业为何落后?有哪些挑战和机遇?

热门文章

  1. Unity iPhone 1.7已准备就绪,可用于iPad游戏
  2. 嵌入式开发--无刷电机学习1--FOC简介
  3. 硬核!用Mac Mini翻新了一台12年前的电脑
  4. 【Ubuntu删除多余的内核】
  5. 浦东外服朋友阿R的时间线
  6. 数据库查询速度优化 1 建立索引
  7. 关于2020520的表情包之数学思考
  8. 使用udig配置数据样式(二)——udig加载数据
  9. 研究森之克拉玛依篇(1)2019-06-26
  10. 友情链接交换标准注意事项