您的位置:首页 > 编程语言 > C语言/C++

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

2016-01-07 00:19 603 查看
看到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 3

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);
}

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: