Software /
code /
prosody-modules
Comparison
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 |
comparison
equal
deleted
inserted
replaced
203:4927b9737bb7 | 204:316d7c8e1fb0 |
---|---|
1 | |
2 local setmetatable = setmetatable; | |
3 local pcall = pcall; | |
4 local type = type; | |
5 local t_concat = table.concat; | |
6 local print = print; | |
7 | |
8 local socket_url = require "socket.url"; | |
9 local http = require "socket.http"; | |
10 local ltn12 = require "ltn12"; | |
11 | |
12 --local json = require "json"; | |
13 local json = module:require("couchdb/json"); | |
14 | |
15 --module("couchdb") | |
16 local _M = {}; | |
17 | |
18 local function urlcat(url, path) | |
19 return url:gsub("/*$", "").."/"..path:gsub("^/*", ""); | |
20 end | |
21 | |
22 local doc_mt = {}; | |
23 doc_mt.__index = doc_mt; | |
24 | |
25 function doc_mt:get() | |
26 return self.db:get(socket_url.escape(self.id)); | |
27 end | |
28 function doc_mt:put(val) | |
29 return self.db:put(socket_url.escape(self.id), val); | |
30 end | |
31 function doc_mt:__tostring() | |
32 return "couchdb.doc("..self.url..")"; | |
33 end | |
34 | |
35 | |
36 local db_mt = {}; | |
37 db_mt.__index = db_mt; | |
38 | |
39 function db_mt:__tostring() | |
40 return "couchdb.db("..self.url..")"; | |
41 end | |
42 function db_mt:doc(id) | |
43 local url = urlcat(self.url, socket_url.escape(id)); | |
44 return setmetatable({ url = url, db = self, id = id }, doc_mt); | |
45 end | |
46 function db_mt:get(id) | |
47 local url = urlcat(self.url, id); | |
48 local a,b = http.request(url); | |
49 local r,x = pcall(json.decode, a); | |
50 if r then a = x; end | |
51 return a,b; | |
52 end | |
53 function db_mt:put(id, value) | |
54 local url = urlcat(self.url, id); | |
55 if type(value) == "table" then | |
56 value = json.encode(value); | |
57 elseif value ~= nil and type(value) ~= "string" then | |
58 return nil, "Invalid type"; | |
59 end | |
60 local t = {}; | |
61 local a,b = http.request { | |
62 url = url, | |
63 sink = ltn12.sink.table(t), | |
64 source = ltn12.source.string(value), | |
65 method = "PUT", | |
66 headers = { | |
67 ["Content-Length"] = #value, | |
68 ["Content-Type"] = "application/json" | |
69 } | |
70 }; | |
71 a = t_concat(t); | |
72 local r,x = pcall(json.decode, a); | |
73 if r then a = x; end | |
74 return a,b; | |
75 end | |
76 | |
77 | |
78 local server_mt = {}; | |
79 server_mt.__index = server_mt; | |
80 | |
81 function server_mt:db(name) | |
82 local url = urlcat(self.url, socket_url.escape(name)); | |
83 return setmetatable({ url = url }, db_mt); | |
84 end | |
85 function server_mt:__tostring() | |
86 return "couchdb.server("..self.url..")"; | |
87 end | |
88 | |
89 | |
90 function _M.server(url) | |
91 return setmetatable({ url = url }, server_mt); | |
92 end | |
93 function _M.db(url) | |
94 return setmetatable({ url = url }, db_mt); | |
95 end | |
96 | |
97 return _M; |