(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))