Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

View server for CouchDB which lets you write map and reduce functions in ruby

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 bin
Octocat-spinner-32 test
Octocat-spinner-32 .gitignore
Octocat-spinner-32 License.txt
Octocat-spinner-32 Makefile
Octocat-spinner-32 README
README
Installation
------------
Copy bin/couchdb_ruby_view to somewhere like /usr/local/bin, and make
sure it is executable.

Edit /usr/local/etc/couchdb/local.ini and set:

[query_servers]
ruby = /usr/local/bin/couchdb_ruby_view

or

ruby = /path/to/ruby /usr/local/bin/couchdb_ruby_view

Restart couchdb.

API
---
map:

  proc { |doc|
    ...
    emit(key,val)
    ...
  }

reduce/rereduce:

  proc { |ks,vs,rereduce|
    vs.inject(0) { |a,b| a+b }
  }

Note that CouchDB actually passes objects which could be iterated directly
using { |(k,id),v| ... }. However I've split these into separate arrays of
[k,id] and v for consistency with the Javascript view server, and because it
simplifies some reduce/rereduce functions (as in the example above, where
both reduce and rereduce are the same)

*** IMPORTANT SECURITY WARNING ***
----------------------------------
DON'T USE THIS CODE IF UNTRUSTED USERS HAVE DIRECT ACCESS TO YOUR DATABASE!
They will be able to run *any* code or read/write *any* file as the couchdb
user if they can post to _temp_view or update design documents.

TODO: improve this by compiling and running the functions in a separate
thread with $SAFE=4.  There is also _why's ruby sandbox gem, although this
requires a small patch to the ruby interpreter itself.

ALSO TODO
---------
If map/reduce functions define helper methods using 'def', they should do
this inside a singleton class rather than globally.

Authors
-------
Johan Sørensen <johan@johansorensen.com>
Brian Candler <B.Candler@pobox.com>
Something went wrong with that request. Please try again.