Can someone provide a complete example on storing C structures to Berkeley DB? I having problems with the examples from the SleepyCat website.
int add(void)
{
size_t len;
u_int8_t *p, data_buffer[1024];
DBT data, key;
DB *dbp;
int ret;
long SerialNumber = 1989;
info.data1 = "Hello World";
info.data2 = 500;
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = &SerialNumber;
key.size = sizeof(SerialNumber);
p = &data_buffer[0];
len = strlen(info.data1);
memcpy(p, &len, sizeof(len));
p += sizeof(len);
memcpy(p, info.data1, len);
p += len;
memcpy(p, &info.data2, sizeof(info.data2));
p += sizeof(info.data2);
data.data = &p;
data.size = sizeof(p);
if ((ret = db_create(&dbp, NULL, 0)) != 0)
{
fprintf(stderr, "db_create: %s\n", db_strerror(ret));
return(ret);
}
if ((ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0)
{
dbp->err(dbp, ret, "%s", DATABASE);
return(ret);;
}
if ((ret = dbp->put(dbp, NULL, &key, &data, 0)) == 0)
{
printf("db: %lu: key stored.\n", *(unsigned long *)key.data);
}
else
{
dbp->err(dbp, ret, "DB->put");
return(ret);
}
ret = dbp->close(dbp, 0);
return(ret);
}
int get(void)
{
size_t len;
u_int8_t *p, data_buffer[1024];
DBT data, key;
DB *dbp;
int ret;
long SerialNumber = 1989;
if ((ret = db_create(&dbp, NULL, 0)) != 0)
{
fprintf(stderr, "db_create: %s\n", db_strerror(ret));
return(ret);
}
if ((ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0)
{
dbp->err(dbp, ret, "%s", DATABASE);
return(ret);;
}
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = &SerialNumber;
key.size = sizeof(SerialNumber);
if ((ret = dbp->get(dbp, NULL, &key, &data, 0)) == 0)
{
printf("db: %lu: key retrieved: data was %s.\n",
*(unsigned long *)key.data, (char *)data.data);
}
else
{
//dbp->err(dbp, ret, "DB->get");
return(ret);
}
strcpy(data_buffer,data.da
ta);
p = &data_buffer[0];
memcpy(&len, p, sizeof(len));
p += sizeof(len);
info.data1 = malloc(len);
memcpy(info.data1, p, len);
p += len;
memcpy(&info.data2, p, sizeof(info.data2));
p += sizeof(info.data2);
printf("%s\n",info.data1);
return(0);
}
The examples do not really show how to store and receive the data structure so I have no way to determine if I am doing it correct.