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

Version 0.10.2
--------------

Replicator

 * Avoid leaking file descriptors on automatic replication restarts.
 * Close security vulnerability CVE-2010-0009.

Build and System Integration:

 * Fixed distribution preparation for building on Mac OS X.

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

 * Remove branch callbacks to allow building couchjs against newer versions of
   Spidermonkey.
 * Fix replication with 0.10 servers initiated by an 0.9 server (COUCHDB-559).

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.
