=================
Improvements
------------
- Add group_by/having methods on ResultSet objects, to allow access to
the "GROUP BY" and "HAVING" statements.
- Change tests/store to keep the connection during the tests to make it
faster.
- Implemented support for plugging generic "tracers". Statement
debugging is now implemented using a tracer, and easily enabled
with storm.tracer.debug(True) (storm.database.DEBUG = True is gone).
- All properties now accept a "validator" parameter. When used, a
function like validate(object, attribute_name, value) should be
given, and it may validate or modify the value before it's set in
the property. The value assigned to the property is the result
of the validator, so the original value should be returned if
changing it isn't intended.
- Expressions can be passed to Store.find() as well as classes. This
makes it possible to request individual columns from a table,
computed expressions or aggregates.
- Objects will be flushed in the order they become dirty by default.
This means that generally the order in which Python operations are
performed will be used to define the order in which flushes are done,
which is generally the most expected.
- The cextensions module was fixed, optimized, and improved. It's now
built by default, but to actually enable it the environment variable
STORM_CEXTENSIONS=1 must be defined at runtime. The module will
likely be enabled by default on a future release.
- ClassAlias will now cache all explicitly named aliases, to prevent
the cost of rebuilding it.
- Result sets and reference sets now have a __contains__() method.
While code like "item in set" was previously possible, it involved
iterating over the result set, which is expensive for large
databases.
- The storm.zope.zstorm code can now be used with only the
zope.interface and transaction packages installed. This makes it
easier to reuse the per-thread store management and global
transaction handling from other web frameworks.
Bug fixes
---------
- Make is_in returns False instead of NULL on an empty result set.
- ZStorm now keeps strong references to named stores. Previously it only kept
weak ones, so stores were recreated more often than necessary.
- References now won't flush the store or query the database when
the foreign key is None.
- When a reference is set to an object that wasn't yet inserted in
the database, the foreign key is immediately unset instead of
keeping the old value up to the flushing.
- Setting a reference to None works even if the previously referenced
object isn't in memory.
- When setting a reference, flush ordering is only enforced if the
key is dirty. This allows a number of changes that would
previously raise OrderLoopError.
- If the remote object in a back reference is removed, the reference
will now be broken.
- Fixed a race condition when two threads try to initialize the
ClassInfo for a given class at the same time.
- Improve handling of AUTO INCREMENT columns in the MySQL backend to
remove an unnecessary query when adding objects to a store.