半夜来一发C语言gdbm数据库基本操作

2024-06-07 13:18

本文主要是介绍半夜来一发C语言gdbm数据库基本操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看到linux程序设计第317 of 819的数据库程序,手痒啊。赶紧锻炼下小脑,敲个效果看看。附带关键代码注释。

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>#include<gdbm-ndbm.h>#include<string.h>#define TEST_DB_FILE "/tmp/dbm1_test"
#define ITEMS_USED 3struct 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);}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++) {  //这个奇葩的部分就是以每个字段的第一个字节作为一条记录的识别,之后fetch就以这个记号作为一个标准来找到对应的记录。(特指下面的key_datum)sprintf(key_to_use, "%c%c%d", //想想觉得难怪C快呢,这个应该就是数据库的最底层思路items_to_store[i].misc_chars[0],items_to_store[i].more_chars[0],items_to_store[i].any_integer);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);  
//如果设置为DBM_REPLACE那么录入相同记录的时候,数据库会执行overwrite然后return 0。如果设置为DBM_INSERT,遇到相同记录,系统跳出return 1。
//然后这个data_datum帮助记录了这个结构体指针的初始位置和这个结构体的Size。if (result != 0) {fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);exit(2);}}sprintf(key_to_use, "bu%d",13);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);
}


这篇关于半夜来一发C语言gdbm数据库基本操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039280

相关文章

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme