.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
..   http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.

.. _release/0.8.x:

============
0.8.x Branch
============

.. contents::
    :depth: 1
    :local:

.. _release/0.8.1:

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

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.

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.

Futon
-----

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

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.
  (:issue:`83`)

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. (:issue:`84`)
* Fix for connections not getting closed after rejecting a chunked request.
  (:issue:`55`)
* CouchDB can now be bound to IPv6 addresses.
* The HTTP `Server` header now contains the versions of CouchDB and Erlang.

.. _release/0.8.0:

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

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.

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

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. (:issue:`12`)
* The database page now provides a `Compact` button to trigger database
  compaction. (:issue:`38`)
* Fixed portential double encoding of document IDs and other URI segments in
  many instances. (:issue:`39`)
* Improved display of attachments.
* The JavaScript Shell has been removed due to unresolved licensing issues.

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. (:issue:`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.

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. (:issue:`3`)
* Improved compliance of `Etag` handling with the HTTP specification.
  (:issue:`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.
