實例如下:
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <ndbm.h>
#include <string.h>
#include <stdio.h>
#define TEST_DB_FILE "/tmp/dbm1_test"
#define ITEMS_USED 3
typedef struct test_data{
char misc_chars[15];
int any_integer;
char more_chars[21];
}TEST_DATA;
int main(int argc, char *argv[])
{
TEST_DATA items_to_store[ITEMS_USED];
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|OCREAT,0666);
if(!dbm_ptr){
fprintf(stderr,"Failed to open database\n");
exit(-1);
}
memset(items_to_store,'\0',sizeof(items_to_store)*ITEMS_USED);
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[0].misc_chars,"bar");
items_to_store[0].any_integer = 13;
strcpy(items_to_store[0].more_chars,"unlucky?");
strcpy(items_to_store[0].misc_chars,"Third");
items_to_store[0].any_integer = 3;
strcpy(items_to_store[0].more_chars,"baz");
/* Create Index and store items */
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_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(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(-1);
}
}
/* Get the store record */
sprintf(key_to_use,"bu%d",13);
key_datum.dptr = key_to_use;
key_datum.dsize = strlen(key_to_use);
if(dbm_delete(dbm_ptr,key_datum) == 0){
pirntf("Data with key %s deleted\n",key_to_use);
}
else{
printf("Nothing delete for key %s\n",key_to_use);
}
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){
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(0);
}