mod_couchdb/couchdb/couchdb.lib.lua
changeset 204 316d7c8e1fb0
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;