dbm数据库操作

来源:互联网 发布:上海嘉桥数据咨询公司 编辑:程序博客网 时间:2024/05/17 09:05
//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);}
原创粉丝点击