Apache CouchDB CHANGES
======================

Version 1.0.0
-------------

Security:

 * Added authentication caching, to avoid repeated opening and closing of the
   users database for each request requiring authentication.

Storage System:

 * Small optimization for reordering result lists.
 * More efficient header commits.
 * Use O_APPEND to save lseeks.
 * Faster implementation of pread_iolist(). Further improves performance on
   concurrent reads.

View Server:

 * Faster default view collation.
 * Added option to include update_seq in view responses.

Version 0.11.1
--------------

HTTP Interface:

 * Mask passwords in active tasks and logging.
 * Update mochijson2 to allow output of BigNums not in float form.
 * Added support for X-HTTP-METHOD-OVERRIDE.
 * Better error message for database names.
 * Disable jsonp by default.
 * Accept gzip encoded standalone attachments.
 * Made max_concurrent_connections configurable.
 * Made changes API more robust.
 * Send newly generated document rev to callers of an update function.

Futon:

 * Use "expando links" for over-long document values in Futon.
 * Added continuous replication option.
 * Added option to replicating test results anonymously to a community
   CouchDB instance.
 * Allow creation and deletion of config entries.
 * Fixed display issues with doc ids that have escaped characters.
 * Fixed various UI issues.

Build and System Integration:

 * Output of `couchdb --help` has been improved.
 * Fixed compatibility with the Erlang R14 series.
 * Fixed warnings on Linux builds.
 * Fixed build error when aclocal needs to be called during the build.
 * Require ICU 4.3.1.
 * Fixed compatibility with Solaris.

Security:

 * Added authentication redirect URL to log in clients.
 * Fixed query parameter encoding issue in oauth.js.
 * Made authentication timeout configurable.
 * Temporary views are now admin-only resources.

Storage System:

 * Don't require a revpos for attachment stubs.
 * Added checking to ensure when a revpos is sent with an attachment stub,
   it's correct.
 * Make file deletions async to avoid pauses during compaction and db
   deletion.
 * Fixed for wrong offset when writing headers and converting them to blocks,
   only triggered when header is larger than 4k.
 * Preserve _revs_limit and instance_start_time after compaction.

Configuration System:

 * Fixed timeout with large .ini files.

JavaScript Clients:

 * Added tests for couch.js and jquery.couch.js
 * Added changes handler to jquery.couch.js.
 * Added cache busting to jquery.couch.js if the user agent is msie.
 * Added support for multi-document-fetch (via _all_docs) to jquery.couch.js.
 * Added attachment versioning to jquery.couch.js.
 * Added option to control ensure_full_commit to jquery.couch.js.
 * Added list functionality to jquery.couch.js.
 * Fixed issues where bulkSave() wasn't sending a POST body.

View Server:

 * Provide a UUID to update functions (and all other functions) that they can
   use to create new docs.
 * Upgrade CommonJS modules support to 1.1.1.
 * Fixed erlang filter funs and normalize filter fun API.
 * Fixed hang in view shutdown.

Log System:

 * Log HEAD requests as HEAD, not GET.
 * Keep massive JSON blobs out of the error log.
 * Fixed a timeout issue.

Replication System:

 * Refactored various internal APIs related to attachment streaming.
 * Fixed hanging replication.
 * Fixed keepalive issue.

URL Rewriter & Vhosts:

 * Allow more complex keys in rewriter.
 * Allow global rewrites so system defaults are available in vhosts.
 * Allow isolation of databases with vhosts.
 * Fix issue with passing variables to query parameters.

Test Suite:

 * Made the test suite overall more reliable.

Version 0.11.0
--------------

Security:

 * Fixed CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability.
 * Added default cookie-authentication and users database.
 * Added Futon user interface for user signup and login.
 * Added per-database reader access control lists.
 * Added per-database security object for configuration data in validation
   functions.
 * Added proxy authentication handler

HTTP Interface:

 * Provide Content-MD5 header support for attachments.
 * Added URL Rewriter handler.
 * Added virtual host handling.

View Server:

 * Added optional 'raw' binary collation for faster view builds where Unicode
   collation is not important.
 * Improved view index build time by reducing ICU collation callouts.
 * Improved view information objects.
 * Bug fix for partial updates during view builds.
 * Move query server to a design-doc based protocol.
 * Use json2.js for JSON serialization for compatiblity with native JSON.
 * Major refactoring of couchjs to lay the groundwork for disabling cURL
   support. The new HTTP interaction acts like a synchronous XHR. Example usage
   of the new system is in the JavaScript CLI test runner.

Replication:

 * Added option to implicitly create replication target databases.
 * Avoid leaking file descriptors on automatic replication restarts.
 * Added option to replicate a list of documents by id.
 * Allow continuous replication to be cancelled.

Storage System:

 * Adds batching of multiple updating requests, to improve throughput with many
   writers. Removed the now redundant couch_batch_save module.
 * Adds configurable compression of attachments.

Runtime Statistics:

 * Statistics are now calculated for a moving window instead of non-overlapping
   timeframes.
 * Fixed a problem with statistics timers and system sleep.
 * Moved statistic names to a term file in the priv directory.

Futon:

 * Added a button for view compaction.
 * JSON strings are now displayed as-is in the document view, without the escaping of
   new-lines and quotes. That dramatically improves readability of multi-line
   strings.
 * Same goes for editing of JSON string values. When a change to a field value is
   submitted, and the value is not valid JSON it is assumed to be a string. This
   improves editing of multi-line strings a lot.
 * Hitting tab in textareas no longer moves focus to the next form field, but simply
   inserts a tab character at the current caret position.
 * Fixed some font declarations.

Build and System Integration:

 * Updated and improved source documentation.
 * Fixed distribution preparation for building on Mac OS X.
 * Added support for building a Windows installer as part of 'make dist'.
 * Bug fix for building couch.app's module list.
 * ETap tests are now run during make distcheck. This included a number of
   updates to the build system to properly support VPATH builds.
 * Gavin McDonald setup a build-bot instance. More info can be found at
   http://ci.apache.org/buildbot.html

Version 0.10.1
--------------

Replicator:

 * Stability enhancements regarding redirects, timeouts, OAuth.

Query Server:

 * Avoid process leaks
 * Allow list and view to span languages

Stats:

 * Eliminate new process flood on system wake

Build and System Integration:

 * Test suite now works with the distcheck target.

Version 0.10.0
--------------

Storage Format:

 * Add move headers with checksums to the end of database files for extra robust
   storage and faster storage.

View Server:

 * Added native Erlang views for high-performance applications.

HTTP Interface:

 * Added optional cookie-based authentication handler.
 * Added optional two-legged OAuth authentication handler.

Build and System Integration:

 * Changed `couchdb` script configuration options.
 * Added default.d and local.d configuration directories to load sequence.


Version 0.9.2
-------------

Replication:

 * Fix replication with 0.10 servers initiated by an 0.9 server (COUCHDB-559).

Build and System Integration:

 * Remove branch callbacks to allow building couchjs against newer versions of
   Spidermonkey.

Version 0.9.1
-------------

Build and System Integration:

 * PID file directory is now created by the SysV/BSD daemon scripts.
 * Fixed the environment variables shown by the configure script.
 * Fixed the build instructions shown by the configure script.
 * Updated ownership and permission advice in `README` for better security.

Configuration and stats system:

 * Corrected missing configuration file error message.
 * Fixed incorrect recording of request time.

Database Core:

 * Document validation for underscore prefixed variables.
 * Made attachment storage less sparse.
 * Fixed problems when a database with delayed commits pending is considered
   idle, and subject to losing changes when shutdown. (COUCHDB-334)

External Handlers:

 * Fix POST requests.

Futon:

 * Redirect when loading a deleted view URI from the cookie.

HTTP Interface:

 * Attachment requests respect the "rev" query-string parameter.

JavaScript View Server:

 * Useful JavaScript Error messages.

Replication:

 * Added support for Unicode characters transmitted as UTF-16 surrogate pairs.
 * URL-encode attachment names when necessary.
 * Pull specific revisions of an attachment, instead of just the latest one.
 * Work around a rare chunk-merging problem in ibrowse.
 * Work with documents containing Unicode characters outside the Basic
   Multilingual Plane.

Version 0.9.0
-------------

Futon Utility Client:

 * Added pagination to the database listing page.
 * Implemented attachment uploading from the document page.
 * Added page that shows the current configuration, and allows modification of
   option values.
 * Added a JSON "source view" for document display.
 * JSON data in view rows is now syntax highlighted.
 * Removed the use of an iframe for better integration with browser history and
   bookmarking.
 * Full database listing in the sidebar has been replaced by a short list of
   recent databases.
 * The view editor now allows selection of the view language if there is more
   than one configured.
 * Added links to go to the raw view or document URI.
 * Added status page to display currently running tasks in CouchDB.
 * JavaScript test suite split into multiple files.
 * Pagination for reduce views.

Design Document Resource Paths:

 * Added httpd_design_handlers config section.
 * Moved _view to httpd_design_handlers.
 * Added ability to render documents as non-JSON content-types with _show and
   _list functions, which are also httpd_design_handlers.

HTTP Interface:

 * Added client side UUIDs for idempotent document creation
 * HTTP COPY for documents
 * Streaming of chunked attachment PUTs to disk
 * Remove negative count feature
 * Add include_docs option for view queries
 * Add multi-key view post for views
 * Query parameter validation
 * Use stale=ok to request potentially cached view index
 * External query handler module for full-text or other indexers.
 * Etags for attachments, views, shows and lists
 * Show and list functions for rendering documents and views as developer
   controlled content-types.
 * Attachment names may use slashes to allow uploading of nested directories
   (useful for static web hosting).
 * Option for a view to run over design documents.
 * Added newline to JSON responses. Closes bike-shed.

Replication:

 * Using ibrowse.
 * Checkpoint replications so failures are less expensive.
 * Automatically retry of failed replications.
 * Stream attachments in pull-replication.

Database Core:

 * Faster B-tree implementation.
 * Changed internal JSON term format.
 * Improvements to Erlang VM interactions under heavy load.
 * User context and administrator role.
 * Update validations with design document validation functions.
 * Document purge functionality.
 * Ref-counting for database file handles.

Build and System Integration:

 * The `couchdb` script now supports system chainable configuration files.
 * The Mac OS X daemon script now redirects STDOUT and STDERR like SysV/BSD.
 * The build and system integration have been improved for portability.
 * Added COUCHDB_OPTIONS to etc/default/couchdb file.
 * Remove COUCHDB_INI_FILE and COUCHDB_PID_FILE from etc/default/couchdb file.
 * Updated `configure.ac` to manually link `libm` for portability.
 * Updated `configure.ac` to extended default library paths.
 * Removed inets configuration files.
 * Added command line test runner.
 * Created dev target for make.

Configuration and stats system:

 * Separate default and local configuration files.
 * HTTP interface for configuration changes.
 * Statistics framework with HTTP query API.

Version 0.8.1-incubating
------------------------

Database Core:

 * Fix for replication problems where the write queues can get backed up if the
   writes aren't happening fast enough to keep up with the reads. For a large
   replication, this can exhaust memory and crash, or slow down the machine
   dramatically. The fix keeps only one document in the write queue at a time.
 * Fix for databases sometimes incorrectly reporting that they contain 0
   documents after compaction.
 * CouchDB now uses ibrowse instead of inets for its internal HTTP client
   implementation. This means better replication stability.

HTTP Interface:

 * Fix for chunked responses where chunks were always being split into multiple
   TCP packets, which caused problems with the test suite under Safari, and in
   some other cases.
 * Fix for an invalid JSON response body being returned for some kinds of
   views. (COUCHDB-84)
 * Fix for connections not getting closed after rejecting a chunked request.
   (COUCHDB-55)
 * CouchDB can now be bound to IPv6 addresses.
 * The HTTP `Server` header now contains the versions of CouchDB and Erlang.

JavaScript View Server:

 * Sealing of documents has been disabled due to an incompatibility with
   SpiderMonkey 1.9.
 * Improve error handling for undefined values emitted by map functions.
   (COUCHDB-83)

Build and System Integration:

 * The `couchdb` script no longer uses `awk` for configuration checks as this
   was causing portability problems.
 * Updated `sudo` example in `README` to use the `-i` option, this fixes
   problems when invoking from a directory the `couchdb` user cannot access.

Futon:

 * The view selector dropdown should now work in Opera and Internet Explorer
   even when it includes optgroups for design documents. (COUCHDB-81)

Version 0.8.0-incubating
------------------------

Database Core:

 * The view engine has been completely decoupled from the storage engine. Index
   data is now stored in separate files, and the format of the main database
   file has changed.
 * Databases can now be compacted to reclaim space used for deleted documents
   and old document revisions.
 * Support for incremental map/reduce views has been added.
 * To support map/reduce, the structure of design documents has changed. View
   values are now JSON objects containing at least a `map` member, and
   optionally a `reduce` member.
 * View servers are now identified by name (for example `javascript`) instead of
   by media type.
 * Automatically generated document IDs are now based on proper UUID generation
   using the crypto module.
 * The field `content-type` in the JSON representation of attachments has been
   renamed to `content_type` (underscore).

HTTP Interface:

 * CouchDB now uses MochiWeb instead of inets for the HTTP server
   implementation. Among other things, this means that the extra configuration
   files needed for inets (such as `couch_httpd.conf`) are no longer used.
 * The HTTP interface now completely supports the `HEAD` method. (COUCHDB-3)
 * Improved compliance of `Etag` handling with the HTTP specification.
   (COUCHDB-13)
 * Etags are no longer included in responses to document `GET` requests that
   include query string parameters causing the JSON response to change without
   the revision or the URI having changed.
 * The bulk document update API has changed slightly on both the request and the
   response side. In addition, bulk updates are now atomic.
 * CouchDB now uses `TCP_NODELAY` to fix performance problems with persistent
   connections on some platforms due to nagling.
 * Including a `?descending=false` query string parameter in requests to views
   no longer raises an error.
 * Requests to unknown top-level reserved URLs (anything with a leading
   underscore) now return a `unknown_private_path` error instead of the
   confusing `illegal_database_name`.
 * The Temporary view handling now expects a JSON request body, where the JSON
   is an object with at least a `map` member, and optional `reduce` and
   `language` members.
 * Temporary views no longer determine the view server based on the Content-Type
   header of the `POST` request, but rather by looking for a `language` member
   in the JSON body of the request.
 * The status code of responses to `DELETE` requests is now 200 to reflect that
   that the deletion is performed synchronously.

JavaScript View Server:

 * SpiderMonkey is no longer included with CouchDB, but rather treated as a
   normal external dependency. A simple C program (`_couchjs`) is provided that
   links against an existing SpiderMonkey installation and uses the interpreter
   embedding API.
 * View functions using the default JavaScript view server can now do logging
   using the global `log(message)` function. Log messages are directed into the
   CouchDB log at `INFO` level. (COUCHDB-59)
 * The global `map(key, value)` function made available to view code has been
   renamed to `emit(key, value)`.
 * Fixed handling of exceptions raised by view functions.

Build and System Integration:

 * CouchDB can automatically respawn following a server crash.
 * Database server no longer refuses to start with a stale PID file.
 * System logrotate configuration provided.
 * Improved handling of ICU shared libraries.
 * The `couchdb` script now automatically enables SMP support in Erlang.
 * The `couchdb` and `couchjs` scripts have been improved for portability.
 * The build and system integration have been improved for portability.

Futon:

 * When adding a field to a document, Futon now just adds a field with an
   autogenerated name instead of prompting for the name with a dialog. The name
   is automatically put into edit mode so that it can be changed immediately.
 * Fields are now sorted alphabetically by name when a document is displayed.
 * Futon can be used to create and update permanent views.
 * The maximum number of rows to display per page on the database page can now
   be adjusted.
 * Futon now uses the XMLHTTPRequest API asynchronously to communicate with the
   CouchDB HTTP server, so that most operations no longer block the browser.
 * View results sorting can now be switched between ascending and descending by
   clicking on the `Key` column header.
 * Fixed a bug where documents that contained a `@` character could not be
   viewed. (COUCHDB-12)
 * The database page now provides a `Compact` button to trigger database
   compaction. (COUCHDB-38)
 * Fixed portential double encoding of document IDs and other URI segments in
   many instances. (COUCHDB-39)
 * Improved display of attachments.
 * The JavaScript Shell has been removed due to unresolved licensing issues.
