[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: LibLmdb non string data



On 02. des. 2016 12:26, Tim Uckun wrote:
I am writing a wrapper for liblmdb and one thing I was able to do was to
store simple integers and floats as the value into the database.  This seems
to work pretty well but I am wondering if this is somehow against best practice.

One bad thing about this is that when you are doing a seek or a cursor
operation the code does not know what kind of data is at the record. I have
some routines to cast them back from the pointers but the user has to know
what to cast them to. It would be very handy if the MDB_val struct had a
field for metadata, even if it just a byte.

LMDB handles binary data fine.  The problem is ordering:

Use a single datatype for each DB, and mdb_set_compare()
mdb_set_dupsort() to order data in that DB properly.  Or
MDB_INTEGERKEY/MDB_INTEGERDUP which do this for unsigned int/size_t.

If that is not feasible and you are mixing different datatypes in a
single database, you need to tag each data item so the compare function
can figure out how to parse and order them all.  Note that a slow
compare function can degrade LMDB's performance.

Note that the compare functions may receive unaligned values.  Though
you can hack alignment 2, 4, or sizeof(size_t) = 4 or 8 by ensuring
*every* key and value in a DB has size = multiple of that alignment.
Keys always have alignment of at least 2.  Hmm, I should add some
code so data will too except when both key and data have uneven size.

Requests to add a user-defined argument to the compare functions have
been rejected.  If you need that, maybe your wrapper can emulate it by
setting thread-specific data before calling LMDB, and then your sort
function can read that data.  That gets cumbersome, though.

If this is all generic, maybe define a DB with meta-info where your
wrapper can look up which datatypes (sizes, compare functions, whatever)
are in which database.

--
Hallvard