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;
|