//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);
}
dbm数据库操作
最新推荐文章于 2024-09-11 23:43:48 发布