Software /
code /
prosody-modules
Diff
mod_couchdb/couchdb/couchapi.lib.lua @ 204:316d7c8e1fb0
mod_couchdb: Initial commit.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 10 Jul 2010 01:35:05 +0500 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_couchdb/couchdb/couchapi.lib.lua Sat Jul 10 01:35:05 2010 +0500 @@ -0,0 +1,97 @@ + +local setmetatable = setmetatable; +local pcall = pcall; +local type = type; +local t_concat = table.concat; +local print = print; + +local socket_url = require "socket.url"; +local http = require "socket.http"; +local ltn12 = require "ltn12"; + +--local json = require "json"; +local json = module:require("couchdb/json"); + +--module("couchdb") +local _M = {}; + +local function urlcat(url, path) + return url:gsub("/*$", "").."/"..path:gsub("^/*", ""); +end + +local doc_mt = {}; +doc_mt.__index = doc_mt; + +function doc_mt:get() + return self.db:get(socket_url.escape(self.id)); +end +function doc_mt:put(val) + return self.db:put(socket_url.escape(self.id), val); +end +function doc_mt:__tostring() + return "couchdb.doc("..self.url..")"; +end + + +local db_mt = {}; +db_mt.__index = db_mt; + +function db_mt:__tostring() + return "couchdb.db("..self.url..")"; +end +function db_mt:doc(id) + local url = urlcat(self.url, socket_url.escape(id)); + return setmetatable({ url = url, db = self, id = id }, doc_mt); +end +function db_mt:get(id) + local url = urlcat(self.url, id); + local a,b = http.request(url); + local r,x = pcall(json.decode, a); + if r then a = x; end + return a,b; +end +function db_mt:put(id, value) + local url = urlcat(self.url, id); + if type(value) == "table" then + value = json.encode(value); + elseif value ~= nil and type(value) ~= "string" then + return nil, "Invalid type"; + end + local t = {}; + local a,b = http.request { + url = url, + sink = ltn12.sink.table(t), + source = ltn12.source.string(value), + method = "PUT", + headers = { + ["Content-Length"] = #value, + ["Content-Type"] = "application/json" + } + }; + a = t_concat(t); + local r,x = pcall(json.decode, a); + if r then a = x; end + return a,b; +end + + +local server_mt = {}; +server_mt.__index = server_mt; + +function server_mt:db(name) + local url = urlcat(self.url, socket_url.escape(name)); + return setmetatable({ url = url }, db_mt); +end +function server_mt:__tostring() + return "couchdb.server("..self.url..")"; +end + + +function _M.server(url) + return setmetatable({ url = url }, server_mt); +end +function _M.db(url) + return setmetatable({ url = url }, db_mt); +end + +return _M;