[redland] Bug w/ remove statement under BDB storage
    Chad House 
    chadh at pobox.com
       
    Mon May 13 13:41:49 BST 2002
    
    
  
I poked around the source a bit, and think I've found the problem.
'librdf_hash_bdb_delete_key_value' in rdf_hash_bdb.c calls the
database cursor's c_get function with a flag of DB_SET:
   /* V2/V3 prototype:
    * int DBcursor->c_get(DBC *cursor, DBT *key, DBT *data, u_int32_t flags);
    */
   ret=dbc->c_get(dbc, &bdb_key, &bdb_value, DB_SET);
   if(ret) {
     dbc->c_close(dbc);
     return 1;
   }
but according to the BDB documentation[1] for the DB_SET flag, "In the
presence of duplicate key values, DBcursor->c_get will return the
first data item for the given key" -- which would explain the
behaviour I was seeing.
I think the flag should be DB_GET_BOTH:
/---
| DB_GET_BOTH
|
|    The DB_GET_BOTH flag is identical to the DB_SET flag, except that
|    both the key and the data arguments must be matched by the key and
|    data item in the database.
\---
I changed the flag in my local copy and now my testcase does the right
thing.
Chad
Footnotes: 
[1]  http://sleepycat.com/docs/api_c/dbc_get.html
    
    
More information about the redland-dev
mailing list