[[couchdb-component]]
= CouchDB Component

*Since Camel 2.11*

// HEADER START
*Both producer and consumer is supported*
// HEADER END

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, update, delete (by using CouchDbMethod with DELETE value)
documents and get documents by id (by using CouchDbMethod with GET value) 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>
------------------------------------------------------------

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

== Options

// component options: START
The CouchDB component supports 3 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
|===
// component options: END

// endpoint options: START
The CouchDB endpoint is configured using URI syntax:

----
couchdb:protocol:hostname:port/database
----

with the following path and query parameters:

=== Path Parameters (4 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *protocol* | *Required* The protocol to use for communicating with the database. |  | String
| *hostname* | *Required* Hostname of the running couchdb instance |  | String
| *port* | Port number for the running couchdb instance | 5984 | int
| *database* | *Required* Name of the database to use |  | String
|===


=== Query Parameters (14 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *createDatabase* (common) | Creates the database if it does not already exist | false | boolean
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *deletes* (consumer) | Document deletes are published as events | true | boolean
| *heartbeat* (consumer) | How often to send an empty message to keep socket alive in millis | 30000 | long
| *since* (consumer) | Start tracking changes immediately after the given update sequence. The default, null, will start monitoring from the latest sequence. |  | String
| *style* (consumer) | Specifies how many revisions are returned in the changes array. The default, main_only, will only return the current winning revision; all_docs will return all leaf revisions (including conflicts and deleted former conflicts.) | main_only | String
| *updates* (consumer) | Document inserts/updates are published as events | true | boolean
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *password* (security) | Password for authenticated databases |  | String
| *username* (security) | Username in case of authenticated databases |  | String
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

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


The component supports 4 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.couchdb.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.couchdb.bridge-error-handler* | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | Boolean
| *camel.component.couchdb.enabled* | Enable couchdb component | true | Boolean
| *camel.component.couchdb.lazy-start-producer* | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
|===
// spring-boot-auto-configure options: END


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

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

== 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")
----------------------------------------------------------------------------------------
