Software /
code /
prosody-modules
Comparison
mod_couchdb/couchdb/couchdb.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 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; |