
2014-09-22 v0.84

* LMDB 0.9.14 is bundled.

* CFFI Cursor.putmulti() could crash when append=False and a key already
  existed.


2014-06-24 v0.83

* LMDB 0.9.13 is bundled along with extra fixes from upstream Git.

* Environment.__enter__() and __exit__() are implemented, allowing
  Environments to behave like context managers.

* Cursor.close(), __enter__() and __exit__() are implemented, allowing Cursors
  to be explicitly closed. In CFFI this mechanism *must* be used when many
  cursors are used within a single transaction, otherwise a resource leak will
  occur.

* Dependency tracking in CFFI is now much faster, especially on PyPy, however
  at a cost: Cursor use must always be wrapped in a context manager, or
  .close() must be manually invoked for discarded Cursors when the parent
  transaction is long lived.

* Fixed crash in CFFI Cursor.putmulti().


2014-05-26 v0.82

* Both variants now implement max_spare_txns, reducing the cost of creating a
  read-only transaction 4x for an uncontended database and by up to 20x for
  very read-busy environments. By default only 1 read-only transaction is
  cached, adjust max_spare_txns= parameter if your script operates multiple
  simultaneous read transactions.

* Patch from Vladimir Vladimirov implementing MDB_NOLOCK.

* The max_spare_iters and max_spare_cursors parameters were removed, neither
  ever had any effect.

* Cursor.putmulti() implemented based on a patch from Luke Kenneth Casson
  Leighton. This function moves the loop required to batch populate a
  database out of Python and into C.

* The bundled LMDB 0.9.11 has been updated with several fixes from upstream
  Git.

* The cost of using keyword arguments in the CPython extension was
  significantly reduced.


2014-04-26 v0.81

* On Python 2.x the extension module would silently interpret Unicode
  instances as buffer objects, causing UCS-2/UCS-4 string data to end up in
  the database. This was never intentional and now raises TypeError. Any
  Unicode data passed to py-lmdb must explicitly be encoded with .encode()
  first.

* open_db()'s name argument was renamed to key, and its semantics now match
  get() and put(): in other words the key must be a bytestring, and passing
  Unicode will raise TypeError.

* The extension module now builds under Python 3.4 on Windows.


2014-04-21 v0.80

* Both variants now build successfully as 32 bit / 64bit binaries on
  Windows under Visual Studio 9.0, the compiler for Python 2.7. This enables
  py-lmdb to be installed via pip on Windows without requiring a compiler to
  be available. In future, .egg/.whl releases will be pre-built for all recent
  Python versions on Windows.

  Known bugs: Environment.copy() and Environment.copyfd() currently produce a
  database that cannot be reopened.

* The lmdb.enable_drop_gil() function was removed. Its purpose was
  experimental at best, confusing at worst.


2014-03-17 v0.79

* CPython Cursor.delete() lacked dupdata argument, fixed.

* Fixed minor bug where CFFI _get_cursor() did not note its idea of
  the current key and value were up to date.

* Cursor.replace() and Cursor.pop() updated for MDB_DUPSORT databases. For
  pop(), the first data item is popped and returned. For replace(), the first
  data item is returned, and all duplicates for the key are replaced.

* Implement remaining Cursor methods necessary for working with MDB_DUPSORT
  databases: next_dup(), next_nodup(), prev_dup(), prev_nodup(), first_dup(),
  last_dup(), set_key_dup(), set_range_dup(), iternext_dup(),
  iternext_nodup(), iterprev_dup(), iterprev_nodup().

* The default for Transaction.put(dupdata=...) and Cursor.put(dupdata=...) has
  changed from False to True. The previous default did not reflect LMDB's
  normal mode of operation.

* LMDB 0.9.11 is bundled along with extra fixes from upstream Git.


2014-01-18 v0.78

* Patch from bra-fsn to fix LMDB_LIBDIR.

* Various inaccurate documentation improvements.

* Initial work towards Windows/Microsoft Visual C++ 9.0 build.

* LMDB 0.9.11 is now bundled.

* To work around install failures minimum CFFI version is now >=0.8.0.

* ticket #38: remove all buffer object hacks. This results in ~50% slowdown
  for cursor enumeration, but results in far simpler object lifetimes. A
  future version may introduce a better mechanism for achieving the same
  performance without loss of sanity.


2013-11-30 v0.77

* Added Environment.max_key_size(), Environment.max_readers().

* CFFI now raises the correct Error subclass associated with an MDB_* return
  code.

* Numerous CFFI vs. CPython behavioural inconsistencies have been fixed.

* An endless variety of Unicode related 2.x/3.x/CPython/CFFI fixes were made.

* LMDB 0.9.10 is now bundled, along with some extra fixes from Git.

* Added Environment(meminit=...) option.


2013-10-28 v0.76

* Added support for Environment(..., readahead=False).

* LMDB 0.9.9 is now bundled.

* Many Python 2.5 and 3.x fixes were made. Future changes are automatically
  tested via Travis CI <https://travis-ci.org/dw/py-lmdb>.

* When multiple cursors exist, and one cursor performs a mutation,
  remaining cursors may have returned corrupt results via key(), value(),
  or item(). Mutations are now explicitly tracked and cause the cursor's
  data to be refreshed in this case.

* setup.py was adjusted to ensure the distutils default of '-DNDEBUG' is never
  defined while building LMDB. This caused many important checks in the engine
  to be disabled.

* The old 'transactionless' API was removed. A future version may support the
  same API, but the implementation will be different.

* Transaction.pop() and Cursor.pop() helpers added, to complement
  Transaction.replace() and Cursor.replace().
