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