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..