> My database gets mucked up when I do a dbm_store with mode == DBM_REPLACE.
> (under 4.3, ndbm in libc). Is this a known bug? Is there a fix?
> Also, I can't seem to find any documentation on ndbm, or the algorithm
> it uses. Does such exists? If so, where?
this is not a bug, really. but it does violate the principle of least
astonishment (at least it did for me).
the behavior you desribe is an artifact of the way ndbm works. when it
returns a pointer to the contents corresponding to a key,
the pointer points into static storage in the page block (this is mentioned
at the end of the manual page).
you're probably modifying the data in place (in the page block) and
then trying to update the information. but the way dbm_store works
with the DBM_REPLACE option is that it first does a delete followed by a
regular store. so your newly updated information is getting thrown away
(deleted). you are then inserting whatever data is left in the page
block instead of what you wanted.
i was bitten by this many times before i finally learned the hard way
how all of this worked.
anyway, the fix is to copy your data into another location before updating,
then do the dbm_store with the replace option.
the key (no pun intended) is just to remember that a store with DBM_REPLACE
is exactly the equivalent of a dbm_delete and then a dbm_store with
DBM_INSERT. this "feature" is not mentioned in the manual.
--
EMU Project {ucbvax, decvax, ihnp4}
U.C. San Diego !sdcsvax!allyn