[[CouchDB-CamelCouchDBcomponent]]
Camel CouchDB component
~~~~~~~~~~~~~~~~~~~~~~~

*Available as of Camel 2.11*

The *couchdb:* component allows you to treat
http://couchdb.apache.org/[CouchDB] instances as a producer or consumer
of messages. Using the lightweight LightCouch API, this camel component
has the following features:

* As a consumer, monitors couch changesets for inserts, updates and
deletes and publishes these as messages into camel routes.
* As a producer, can save or update documents into couch.
* Can support as many endpoints as required, eg for multiple databases
across multiple instances.
* Ability to have events trigger for only deletes, only inserts/updates
or all (default).
* Headers set for sequenceId, document revision, document id, and HTTP
method type.

Maven users will need to add the following dependency to their `pom.xml`
for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-couchdb</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

[[CouchDB-URIformat]]
URI format
^^^^^^^^^^

[source,java]
-------------------------------------------------
couchdb:http://hostname[:port]/database?[options]
-------------------------------------------------

Where *hostname* is the hostname of the running couchdb instance. Port
is optional and if not specified then defaults to 5984.

[[CouchDB-Options]]
Options
^^^^^^^

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Property |Default |Description

|`deletes` |`true` |document deletes are published as events

|`updates` |`true` |document inserts/updates are published as events

|`heartbeat` |`30000` |how often to send an empty message to keep socket alive in millis

|`createDatabase` |`true` |create the database if it does not already exist

|`username` |`null` |username in case of authenticated databases

|`password` |`null` |password for authenticated databases
|=======================================================================

[[CouchDB-Headers]]
Headers
^^^^^^^

The following headers are set on exchanges during message transport.

[width="100%",cols="20%,80%",options="header",]
|=======================================================================
|Property |Value

|`CouchDbDatabase` |the database the message came from

|`CouchDbSeq` |the couchdb changeset sequence number of the update / delete message

|`CouchDbId` |the couchdb document id

|`CouchDbRev` |the couchdb document revision

|`CouchDbMethod` |the method (delete / update)
|=======================================================================

Headers are set by the consumer once the message is received. The
producer will also set the headers for downstream processors once the
insert/update has taken place. Any headers set prior to the producer are
ignored. That means for example, if you set CouchDbId as a header, it
will not be used as the id for insertion, the id of the document will
still be used.

[[CouchDB-MessageBody]]
Message Body
^^^^^^^^^^^^

The component will use the message body as the document to be inserted.
If the body is an instance of String, then it will be marshalled into a
GSON object before insert. This means that the string must be valid JSON
or the insert / update will fail. If the body is an instance of a
com.google.gson.JsonElement then it will be inserted as is. Otherwise
the producer will throw an exception of unsupported body type.

[[CouchDB-Samples]]
Samples
^^^^^^^

For example if you wish to consume all inserts, updates and deletes from
a CouchDB instance running locally, on port 9999 then you could use the
following:

[source,java]
-------------------------------------------------------------
from("couchdb:http://localhost:9999").process(someProcessor);
-------------------------------------------------------------

If you were only interested in deletes, then you could use the following

[source,java]
---------------------------------------------------------------------------
from("couchdb:http://localhost:9999?updates=false").process(someProcessor);
---------------------------------------------------------------------------

If you wanted to insert a message as a document, then the body of the
exchange is used

[source,java]
----------------------------------------------------------------------------------------
from("someProducingEndpoint").process(someProcessor).to("couchdb:http://localhost:9999")
----------------------------------------------------------------------------------------
