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

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.

Build and System Integration:

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

HTTP Interface:

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

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 Utility Client:

 * 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 Utility Client:

 * 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 Utility Client:

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