204
|
1 |
|
|
2 |
local http = require "socket.http"; |
|
3 |
local url = require "socket.url"; |
|
4 |
|
|
5 |
local couchapi = module:require("couchdb/couchapi"); |
|
6 |
local json = module:require("couchdb/json"); |
|
7 |
|
|
8 |
local couchdb_url = assert(module:get_option("couchdb_url"), "Option couchdb_url not specified"); |
|
9 |
local db = couchapi.db(couchdb_url); |
|
10 |
|
|
11 |
local function couchdb_get(key) |
|
12 |
local a,b = db:doc(key):get() |
|
13 |
print(json.encode(a)); |
|
14 |
if b == 404 then return nil; end |
|
15 |
if b == 200 then b = nil; end |
|
16 |
return a.payload,b; |
|
17 |
end |
|
18 |
|
|
19 |
local function couchdb_put(key, value) |
|
20 |
local a,b = db:doc(key):get(); |
|
21 |
return db:doc(key):put({ payload = value, _rev = a and a._rev }); |
|
22 |
end |
|
23 |
|
|
24 |
local st = require "util.stanza"; |
|
25 |
|
|
26 |
local handlers = {}; |
|
27 |
|
|
28 |
handlers.accounts = { |
|
29 |
get = function(self, user) |
|
30 |
return couchdb_get(self.host.."/"..user.."/account"); |
|
31 |
end; |
|
32 |
set = function(self, user, data) |
|
33 |
return couchdb_put(self.host.."/"..user.."/account", data); |
|
34 |
end; |
|
35 |
}; |
|
36 |
handlers.vcard = { |
|
37 |
get = function(self, user) |
|
38 |
return couchdb_get(self.host.."/"..user.."/vcard"); |
|
39 |
end; |
|
40 |
set = function(self, user, data) |
|
41 |
return couchdb_put(self.host.."/"..user.."/vcard", data); |
|
42 |
end; |
|
43 |
}; |
|
44 |
handlers.private = { |
|
45 |
get = function(self, user) |
|
46 |
return couchdb_get(self.host.."/"..user.."/private"); |
|
47 |
end; |
|
48 |
set = function(self, user, data) |
|
49 |
return couchdb_put(self.host.."/"..user.."/private", data); |
|
50 |
end; |
|
51 |
}; |
|
52 |
handlers.roster = { |
|
53 |
get = function(self, user) |
|
54 |
return couchdb_get(self.host.."/"..user.."/roster"); |
|
55 |
end; |
|
56 |
set = function(self, user, data) |
|
57 |
return couchdb_put(self.host.."/"..user.."/roster", data); |
|
58 |
end; |
|
59 |
}; |
|
60 |
|
|
61 |
----------------------------- |
|
62 |
local driver = {}; |
|
63 |
driver.__index = driver; |
|
64 |
|
|
65 |
function driver:open(host, datastore, typ) |
|
66 |
local cache_key = host.." "..datastore; |
|
67 |
if self.ds_cache[cache_key] then return self.ds_cache[cache_key]; end |
|
68 |
local instance = setmetatable({}, self); |
|
69 |
instance.host = host; |
|
70 |
instance.datastore = datastore; |
|
71 |
local handler = handlers[datastore]; |
|
72 |
if not handler then return nil; end |
|
73 |
for key,val in pairs(handler) do |
|
74 |
instance[key] = val; |
|
75 |
end |
|
76 |
if instance.init then instance:init(); end |
|
77 |
self.ds_cache[cache_key] = instance; |
|
78 |
return instance; |
|
79 |
end |
|
80 |
|
|
81 |
----------------------------- |
|
82 |
local _M = {}; |
|
83 |
|
|
84 |
function _M.new() |
|
85 |
local instance = setmetatable({}, driver); |
|
86 |
instance.__index = instance; |
|
87 |
instance.ds_cache = {}; |
|
88 |
return instance; |
|
89 |
end |
|
90 |
|
|
91 |
return _M; |