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

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

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

void *dptr;

size_t dsize;

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

#include

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

#include

#include

#include

#include

/* On some systems you need to replace the above with

#include

*/

#include

#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

#include

#include

#include

#include

/* On some systems you need to replace the above with

#include

*/

#include

#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数据库,linux dbm数据库相关推荐

  1. linux 多域名访问数据库,Linux下虚拟域名的实现

    目前Linux操作系统十分火爆,所以很多朋友希望了解一下Linux下虚拟域名的实现过程.下面就基于目前比较流行的RedHat来讨论一下. 一.DNS服务器的设置 我们知道互联网网是基于TCP/IP协议 ...

  2. 导出Windows服务器下的Oracle数据库并导入到Linux服务器下的Oracle数据库中

    2019独角兽企业重金招聘Python工程师标准>>> 说明: 1.Windows Oracle数据库 操作系统:Windows Server 2008 R2 IP地址:192.16 ...

  3. Linux全攻略--MySQL数据库配置与管理

    MySQL是一种精巧的,多用户和多线程的中小型SQL数据库系统,由一个服务器守护进程mysqld和很多不同的客户程序和库组成.现在形成了一个"Linux+Apache+PHP+MySQL&q ...

  4. Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录(转)

    文章转自:http://www.osyunwei.com/archives/8998.html 说明: 操作系统:CentOS Mongodb安装目录:/usr/local/mongodb Mongo ...

  5. linux系统下的oracle数据库,在Linux系统下安装Oracle数据库

    在Linux系统下安装Oracle数据库:1.约定:linux系统为Linux.5.4-server-x86_64,数据库为linux.x64_11gR1_database_1013 linux 在L ...

  6. linux mysql cpu 高,Linux系统中关于Mysql数据库导致CPU很高的问题解决

    Linux系统中关于Mysql数据库导致CPU很高的问题解决 发布时间:2007-11-19 00:01:12来源:红联作者:spworks 服务器环境 Liunx AS4 + PHP5 + Mysq ...

  7. linux服务器mysql数据库新建数据库并配置数据库用户

    linux服务器mysql数据库新建数据库并配置数据库用户 第一步:进入数据库 mysql -uroot -p 提示输入密码,输入你的root用户密码(默认不显示) 如下图: 第二步:创建一个数据库 ...

  8. Linux下如何启用MySQL数据库远程访问

    远程连接MySQL出于安全考虑,一般都关闭了远程访问,但有时候需要提供远程访问数据库的服务,下面我们快速学习下: 第一步:修改my.cnf文件 使用文本编辑器去编辑MySQL服务器的配置文件my.cn ...

  9. 修改linux下全局数据库名,linux/unix下修改oracle数据库实例名的方法

    linux/unix下修改oracle数据库实例名的方法 2018年12月10日 | 萬仟网IT编程 | 我要评论 linux/unix下修改oracle实例名的方法 1.检查原来的数据库实例名 $ ...

  10. winserver下oracle好运维吗,在Windows 客户端下备份远程Linux服务器上的Oracle数据库...

    1.在Windows上安装Oracle客户端软件(比如:win32_11gR1_client版本最好跟服务器Oracle版本相同) 系统运维  www.osyunwei.com  温馨提醒:qihan ...

最新文章

  1. jQuery中的.bind()、.live()和.delegate()之间区别分析
  2. Linux下GBK文件编码批量转换UTF-8命令
  3. 高性能mysql 第10章 复制
  4. [linux]单网卡绑定多个IP
  5. 17.软件架构设计:大型网站技术架构与业务架构融合之道 --- 团队能力的提升
  6. HTML5学习笔记 二:article和section
  7. mysql 系统变量_MySQL系统变量(查看和修改)
  8. 自然语言处理(NLP)语义分析:“词汇级”语义分析【词义消歧、词义表示和学习】、“句子级”语义分析【浅层语义分析(语义角色标注)、深层语义分析】
  9. 数独程序求解世界最难数独——JAVA版
  10. cad2020打印样式放在哪个文件夹_CAD批量打印、DPF合成(建议收藏)
  11. SEM搜索引擎竞价全方位系统网课-优就业-专题视频课程
  12. 大数据、数据分析、数据挖掘的差别
  13. Kotlin for Android (let、with、run、apply、also函数)
  14. 光纤激光器输出激光参数的一些概念及运算
  15. OC和swift混合工程更新库时报:target has transitive dependencies that include statically linked binaries
  16. SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
  17. 基于php的网上书店系统,基于PHP的网上书店的设计
  18. 麒麟桌面系统配置samba共享
  19. ThinkPHP3.2 框架sql注入漏洞分析(2018-08-23)
  20. 塞班(Symbian)安装文件.SISX文件格式说明

热门文章

  1. srb (bug篇)
  2. Character Controller角色控制器组件
  3. 如何获取国际短信验证码---创蓝253国际短信接口调用demo
  4. 无线怎么计算机网络地址,如何查看无线路由器ip地址?
  5. 中国普通魔方行业市场供需与战略研究报告
  6. 启发式算法(heuristic algorithm)中的启发式(heuristic)到底是什么意思?
  7. 建立AI智能系统智商评测体系,开展世界人工智能智商评测
  8. 拍沪牌服务器响应,拍中了四张沪牌,再来聊聊拍牌经验
  9. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-堆和优先队列(二)
  10. 运动蓝牙耳机挑选要注意什么?蓝牙耳机知识科普