bmatsuo / lmdb-go

Bindings for the LMDB C library
BSD 3-Clause "New" or "Revised" License
158 stars 59 forks source link

Cursor.Get handles key return values specicially for Set #97

Closed bmatsuo closed 7 years ago

bmatsuo commented 7 years ago

Fixes #96

Issue #56 illustrated that working with Go memory using "C-style" memory does not work well in modern Go runtimes. That problem was thought to be properly addressed, but #96 showed a lingering case where Set does not modify MDB_val key passed to mdb_cursor_get.

This commit addresses this lingering case by special-casing return value processing for the Set operation of Cursor.Get. If LMDB will not modify the MDB_val, the returned key must use non-standard methods for copying the value. Likewise, when txn.RawRead is true the Cursor.Get must use a special method to ensure that the returned key shares memory with the corresponding input argument.