Forum Stats

  • 3,757,056 Users
  • 2,251,192 Discussions
  • 7,869,716 Comments

Discussions

berkeley db-bulk load example

Hi,

I am trying to bulk load and read from BDB-Btree with "unsigned long int" keys.

When I make some minor modifications in the Bulkexample code, the tree is not being generated correctly.

What I have done: I changed the key type as u_int32_t and changed the variables type in compare_int function as well.

It seemed to me the problem is about alignment.

Then, I put my key data in byte array and used marshalling/unmarshalling techniques, still I cannot read data sorted by key :(

The code has something like the below

u_int32_t keyvalue=rnd->nextUniformUnsignedLong(); // rnd is my random generator

uint32_t sizeOfKey = sizeof(u_int32_t);

uint8_t *bufkey = new uint8_t[sizeOfKey]; // allocate a buffer area.

uint8_t *it = bufkey; // pointer variable to iterate over the buffer.

memcpy(it, &keyvalue, sizeOfKey);


uint8_t *bufdata = new uint8_t[DATALEN]; // allocate a buffer area. 

it = bufdata; // pointer variable to iterate over the buffer.

memcpy(it, &(data_val->id), sizeof(int));

it += sizeof(int);

memcpy(it, data_val->str, STRLEN);

...

if (ptrkd->append(bufkey, sizeOfKey,

  bufdata, DATALEN) == false)

throwException(dbenv,

  txnp, EXIT_FAILURE,...)


In the compare function:

uint32_t sizeOfKey = sizeof(u_int32_t); //uint_fast32_t

uint8_t *it = (uint8_t *)a->get_data(); // allocate a total buffer area. Write explicit size for the array, do not use sizeof()

memcpy(&ai, it, sizeOfKey);

it=nullptr;

it = (uint8_t*) b->get_data(); // allocate a total buffer area. Write explicit size for the array, do not use sizeof()

memcpy(&bi, it, sizeOfKey);


// memcpy(&ai, a->get_data(), sizeof(int));

// memcpy(&bi, b->get_data(), sizeof(int));

return (ai - bi);

Similiar problems occur when I try to load b-tree with double keys..It does not sort correctly.

Thanks for the help. Good holidays..

Answers