dbm数据库操作

本文详细介绍了如何进行DBM数据库的操作,包括基本的增删改查以及数据管理技巧,适用于初学者和进阶用户提升数据库管理技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//dbm数据库的使用
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<gdbm-ndbm.h>//包含dbm数据库操作函数
//#include<ndbm.h>
#include<string.h>
//宏定义
#define TEST_DB_FILE "/home/ndj/dbm/dbm_test"
#define ITEMS_USED 3
//定义一个结构体,存储在数据库中的数据
struct test_data
{
    char misc_chars[15] ;
    int any_integar;
    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);
    }
    for(key_datum=dbm_firstkey(dbm_ptr); key_datum.dptr; key_datum=dbm_nextkey(dbm_ptr))
    {
        dbm_delete(dbm_ptr, key_datum);
        printf("SUCCESS\n");
    }
    //添加数据到items_to_store中
    memset(items_to_store, '\0', sizeof(items_to_store));//对个类数组进行按字节进行初始化

    strcpy(items_to_store[0].misc_chars, "First!");
    items_to_store[0].any_integar = 4;
    strcpy(items_to_store[0].more_chars, "foo");

    strcpy(items_to_store[1].misc_chars, "bar");
    items_to_store[1].any_integar = 13;
    strcpy(items_to_store[1].more_chars, "unlucky");

    strcpy(items_to_store[2].misc_chars, "Third");
    items_to_store[2].any_integar = 3;
    strcpy(items_to_store[2].more_chars, "baz");

    //为每个数据项建立供以后使用的关键字,它被设为每个字符串的头一个字母加上整数
    for(i=0; i<ITEMS_USED; i++)
    {
        //把格式化数据写入某个字符串
        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_integar);

        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);
        }
    }
    ////接下来查看是否可以检索这个新存入的数据, 最狗关闭数据库
    //sprintf(key_to_use, "Tb%d", 3);
    //key_datum.dptr = (void*)key_to_use;
    //key_datum.dsize = strlen(key_to_use);
    //
    //data_datum = dbm_fetch(dbm_ptr, key_datum);//返回datum类型的结构,结构中仅仅包含一个指向数据的指针,它实际的数据仍然保存在dbm库的本地存储空间中
    //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_integar, item_retrieved.more_chars);
    //}
    //else
    //{
    //  printf("No data found for key %s\n", key_to_use);
    //}

    //在数据库中删除数据
    sprintf(key_to_use, "Tb%d", 3);//被删除数据项的关键字
    key_datum.dptr = key_to_use;
    key_datum.dsize = strlen(key_to_use);

    if(dbm_delete(dbm_ptr, key_to_use) == 0)
    {
        printf("Data with key %s deleted\n", key_to_use);
    }
    else
    {
        printf("Nothing deleted for key %s\n", key_to_use);
    }
    data_datum = dbm_fetch(dbm_ptr, key_datum);//检索数据,查看有没有被删除
    if(data_datum.dptr)//如果检索到数据
    {
        printf("Failed\n");
    }
    else
    {
        printf("Delete success\n");
    }

    //使用dbm_firstkey和dbm_nextkey对所有的关键字进行扫描

    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)
        {
            memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);
            printf("Retireved item - %s %d %s\n", item_retrieved.misc_chars, item_retrieved.any_integar, item_retrieved.more_chars);
        }
        else
        {
            printf("No data found for key %s\n", key_to_use);
        }
    }


    dbm_close(dbm_ptr);
    exit(EXIT_SUCCESS);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值