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