(ns clojure.http.couch
  (:require [clojure.http.resourcefully :as resourcefully])
  (:use [clojure.http.client :only [url-encode]]
        [clojure.contrib.str-utils :only [str-join]]
        [org.danlarkin.json :only [encode-to-str decode-from-str]]))

(def *host* "localhost")
(def *port* 5984)
(def *db* nil)

(defn url-for [& id]
  (str "http://" *host* ":" *port* "/" *db* "/"
       (str-join "/" (map url-encode id))))

(defn body [response]
  (decode-from-str (str-join "\n" (:body-seq response))))

(defn create-db [name]
  (binding [*db* name]
    (clojure.http.client/request (url-for) :put)))

(defn delete-db [name]
  (binding [*db* name]
    (clojure.http.client/request (url-for) :delete)))

(defn get-doc [id]
  (body (resourcefully/get (url-for id))))

(defn update-doc [id doc]
  (body (resourcefully/put (url-for id)
                           {} (encode-to-str doc))))

(defn create-doc [doc]
  (body (resourcefully/post (url-for)
                            {} (encode-to-str doc))))

(defn delete-doc [id revision]
  (body (resourcefully/delete (str (url-for id) "?rev=" revision))))

(defmacro with-db [db-name & body]
  `(binding [*db* ~db-name]
     ~@body))

Generated by Phil Hagelberg using scpaste at Thu May 21 10:01:45 2009. PDT. (original)