# Adapters

PouchDB is not a self-contained database; it is a CouchDB-style abstraction layer over other databases. By default, PouchDB ships with IndexedDB and WebSQL adapters in the browser, and a LevelDB adapter in Node.js.

PouchDB attempts to provide a consistent API that "just works" across every browser and JavaScript environment, and in most cases, you can just use the defaults. However, if you're trying to reach the widest possible audience, or if you want the best performance, then you will sometimes want to tinker with the adapter settings.

#### Topics:

- PouchDB in the browser
- PouchDB in Node.js
- PouchDB over HTTP
- More resources

PouchDB in the browser

In the browser, PouchDB prefers IndexedDB, and falls back to WebSQL if IndexedDB is not available. As of 2014, the browser support looks like this:

### Desktop

Adapter | IE | Firefox | Chrome | Safari | Opera
--- | --- | --- | --- | --- | ---
IndexedDB | ✓ (10+) | ✓ | ✓ |  | ✓
WebSQL |  |  | ✓ | ✓ | ✓

### Mobile

Adapter | iOS Safari | Opera Mini | Android Browser | BlackBerry Browser | Opera Mobile | Chrome for Android | Firefox for Android | IE Mobile
IndexedDB |  |  | ✓ (4.4+) | ✓ (10+) | ✓ (21+) | ✓ | ✓ | ✓
WebSQL | ✓ |  | ✓ | ✓ | ✓ | ✓ |  |

Safari 7.1+ and iOS 8+ supposedly support IndexedDB, but their implementation has many bugs, so PouchDB currently ignores it.

If you're ever curious which adapter is being used in a particular browser, you can use the following method:

    var pouch = new PouchDB('myDB');
    console.log(pouch.adapter); // prints either 'idb' or 'websql'

### SQLite plugin for Cordova/PhoneGap

On Cordova/PhoneGap, it is often more performant to use the native SQLite database rather than the WebSQL database. This is also a good way to avoid HTML5 storage quotas.

Luckily, there is a SQLite Plugin that accomplishes exactly this. If you include this plugin in your project, then PouchDB will automatically pick it up based on the `window.sqlitePlugin` object.

However, this only occurs if the adapter is `'websql'`, not `'idb'` (e.g. on Android 4.4+). To force PouchDB to use the WebSQL adapter, you can do:

    var websqlPouch = new PouchDB('myDB', {adapter: 'websql'});

The SQLite plugin is known to pass the PouchDB test suite on both iOS and Android. You may run into issues on Windows Phone 8.

### Experimental adapter plugins

PouchDB also offers separate browser plugins that use backends other than IndexedDB and WebSQL. These plugins pass our test suite at 100%, but are not yet part of the official release due to build issues with Browserify. They also add a hefty footprint due to external dependencies, so take them with a grain of salt.

Currently these plugins do not work with Browserify itself; you have to include them as separate scripts in your HTML page.

Downloads:

- pouchdb.localstorage.js
- pouchdb.memory.js
- pouchdb.idb-alt.js

#### LocalStorage plugin

If you need to support very old browsers, such as IE ≤ 9.0 and Opera Mini, you can use the `pouchdb.localstorage.js` plugin, which allows PouchDB to fall back to LocalStorage on browsers that don't support either IndexedDB or WebSQL. The es5-shims will also be necessary.

    <script src="pouchdb.js"></script>
    <script src="pouchdb.localstorage.js"></script>
    <script>
      // this pouch is backed by LocalStorage
      var pouch = new PouchDB('mydb', {adapter: 'localstorage'});
    </script>

The LocalStorage plugin should be considered highly experimental, and the underlying structure may change in the future. Currently it stores all document IDs in memory, which works fine on small databases but may crash on larger databases. You can follow localstorage-down to track our progress.

#### Memory plugin

If you want a quick database for your unit tests, you can use the `pouchdb.memory.js` plugin, which offers a pure in-memory PouchDB:

    <script src="pouchdb.js"></script>
    <script src="pouchdb.memory.js"></script>
    <script>
      // this pouch is ephemeral; it only exists in memory
      var pouch = new PouchDB('mydb', {adapter: 'memory'});
    </script>

This pouch will act exactly like a normal one – replicating, storing attachments, pagination, etc. – but it will be deleted as soon as the user closes their browser. However, multiple `PouchDB` objects with the same database name will share the same data:

    // pouch1 and pouch2 will share the same data
    var pouch1 = new PouchDB('myDB', {adapter: 'memory'});
    var pouch2 = new PouchDB('myDB', {adapter: 'memory'});

    // pouch3 will have its own data
    var pouch3 = new PouchDB('myOtherDB', {adapter: 'memory'});

#### Alternative IndexedDB adapter

We are currently experimenting with a LevelDown-based IndexedDB adapter (using level-js) which may eventually replace the current IndexedDB adapter. If you would like to experiment with this, you may use the `pouchdb.idb-alt.js` plugin:

    <script src="pouchdb.js"></script>
    <script src="pouchdb.idb-alt.js"></script>
    <script>
      // this pouch is backed by IndexedDB but uses
      // a different structure than the main one
      var pouch = new PouchDB('mydb', {adapter: 'idb-alt'});
    </script>

This adapter does not currently offer any advantages over the `'idb'` adapter, but PouchDB developers will be interested in testing it.

PouchDB in Node.js

In Node.js, the adapter situation is much simpler than in browsers. By default, if you create a PouchDB like this one:

    var pouch = new PouchDB('./path/to/db');

then a LevelDB-based database will be created in the directory `./path/to/db`.

Plus, since the LevelDB adapter is based on LevelDOWN, you also benefit from the rich ecosystem of LevelDOWN-based adapters. They may be installed using plain old `npm install` and `require()`. Below are a few examples.

#### In-memory

Just as in the browser, you can create a pure in-memory pouch based on MemDOWN:

    $ npm install memdown

then:

    var pouch = new PouchDB('myDB', {db: require('memdown')});

Notice that in Node.js, we use the key `'db'` instead of `'adapter'`. In Node.js the adapter is always called `'leveldb'` for historical reasons.

#### Riak-based adapter

This pouch is backed by RiakDOWN:

    $ npm install riakdown

then:

    var pouch = new PouchDB('riak://localhost:8087/somebucket', {db: require('riakdown')});

#### More LevelDOWN adapters

There are many other LevelDOWN-based plugins – far too many to list here. You can find a mostly-complete list on Github that includes implementations on top of MySQL, Windows Azure Table Storage, and SQLite.

We do not currently test against any LevelDOWN adapters other than LevelDB and MemDOWN, so the other backends should be considered experimental.

PouchDB over HTTP

In both the browser and in Node.js, PouchDB can also function as a straightforward API on top of any CouchDB-compliant database, such as IrisCouch, Cloudant, and Couchbase Sync Gateway:

    var pouch = new PouchDB('http://my-site.com:5984/my-db');
    var securePouch = new PouchDB('https://my-secure-site.com:5984/my-secure-db');

However, we do not currently claim to support any database at 100% fidelity except for CouchDB, so your mileage may vary when syncing with the others. We will add databases to our supported list as we increase our test coverage.

If you are ever unsure what to do, consider replicating from PouchDB to a CouchDB, then from that CouchDB to one of the other servers.

#### PouchDB Server

PouchDB Server is a standalone REST server that implements the CouchDB API, while using a LevelDB-based PouchDB under the hood. PouchDB Server passes our unit test suite at 100%, but be aware that it is not as full-featured or battle-tested as CouchDB.

#### PouchDB Express

The underlying module for PouchDB Server, Express PouchDB is an Express submodule that mimics most of the CouchDB API within your Express application.

More resources

The best place to look for information on which browsers support which databases is caniuse.com. You can consult their tables on browser support for various backends:

- IndexedDB
- WebSQL
- LocalStorage