Update comment
Include expected etag in response
Fix totalResults/next weirdness with inaccessible notes

The note access check was doing after the item search, which caused various issues. Note access is now checking by the search itself, so result counts should now be accurate again.

format=keys was also returning inaccessible notes in its list (though the notes themselves weren't accessible).
Fix broken test
Include item key in note-too-long error

The item key is searchable (in complete all-caps form) in recent Zotero versions, which should make it easier for people to find the note in question.
Allow for 'version' field in groups table before new code rollout
Test for trying to add a note without note access

Disabled for now, since the API currently allows it (and just displays a blank feed with the 201)
Clearer error messages for too-long notes and fields
Always include the library in the field-too-long error
Strip control characters in XML data
ETag support for group metadata

Includes ETag header and /users/<userID>/groups?format=etags
Multiple collection creation via API

- POST /collections with 'collections' property
- Creating a single collection without 'collections' is still supported
- Collection creation now returns 201, as documented
- collectionKey=<key>,<key>,<key> support
- order=itemKeyList is now order=keyList and works for itemKey and collectionKey
- The canonical order of query parameters is now a bit more logical (which unfortunately could change some Atom ids)
Make 'parent' property optional for collections

This means that a PUT for a subcollection without a 'parent' property would become a root collection.
API::parseDataFromItemEntry -> API::parseDataFromAtomEntry in remote tests
Test multiple collection creation
Rename test files so that they're actually run...
Zotero-Last-Modified-Version for items and collections (w/schema changes)
Warn if transaction is open at request end

Also automatically roll back open transactions for 4xx/5xx errors, and change some die() calls to pass through the closing function
Fix conditional order for $all=true in Zotero_DB::rollback()
When getting Unix timestamp for DB transaction, check the right variable