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

Version 1.1.0
-------------

All CHANGES for 1.0.2 and 1.0.3 also apply to 1.1.0.

HTTP Interface:

 * Native SSL support.
 * Added support for HTTP range requests for attachments.
 * Added built-in filters for `_changes`: `_doc_ids` and `_design`.
 * Added configuration option for TCP_NODELAY aka "Nagle".
 * Allow POSTing arguments to `_changes`.
 * Allow `keys` parameter for GET requests to views.
 * Allow wildcards in vhosts definitions.
 * More granular ETag support for views.
 * More flexible URL rewriter.
 * Added support for recognizing "Q values" and media parameters in
   HTTP Accept headers.
 * Validate doc ids that come from a PUT to a URL.

Externals:

 * Added OS Process module to manage daemons outside of CouchDB.
 * Added HTTP Proxy handler for more scalable externals.

Replicator:

 * Added `_replicator` database to manage replications.
 * Fixed issues when an endpoint is a remote database accessible via SSL.
 * Added support for continuous by-doc-IDs replication.
 * Fix issue where revision info was omitted when replicating attachments.
 * Integrity of attachment replication is now verified by MD5.

Storage System:

 * Multiple micro-optimizations when reading data.

View Server:

 * Added CommonJS support to map functions.
 * Added `stale=update_after` query option that triggers a view update after
   returning a `stale=ok` response.
 * Warn about empty result caused by `startkey` and `endkey` limiting.
 * Built-in reduce function `_sum` now accepts lists of integers as input.
 * Added view query aliases start_key, end_key, start_key_doc_id and
   end_key_doc_id.

Futon:

 * Added a "change password"-feature to Futon.

URL Rewriter & Vhosts:

 * Fix for variable substituion

Version 1.0.1
-------------

Storage System:

  * Fix data corruption bug COUCHDB-844. Please see
    http://couchdb.apache.org/notice/1.0.1.html for details.

Replicator:

  * Added support for replication via an HTTP/HTTPS proxy.
  * Fix pull replication of attachments from 0.11 to 1.0.x.
  * Make the _changes feed work with non-integer seqnums.

HTTP Interface:

  * Expose `committed_update_seq` for monitoring purposes.
  * Show fields saved along with _deleted=true. Allows for auditing of deletes.
  * More robust Accept-header detection.

Authentication:

  * Enable basic-auth popup when required to access the server, to prevent
    people from getting locked out.

Futon:

  * User interface element for querying stale (cached) views.

Build and System Integration:

  * Included additional source files for distribution.

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

Replicator:

  * Fix bug when pushing design docs by non-admins, which was hanging the
    replicator for no good reason.
  * Fix bug when pulling design documents from a source that requires
    basic-auth.

HTTP Interface:

  * Better error messages on invalid URL requests.

Authentication:

  * User documents can now be deleted by admins or the user.

Security:

  * Avoid potential DOS attack by guarding all creation of atoms.

Futon:

  * Add some Futon files that were missing from the Makefile.

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.
