Diff

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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_couchdb/couchdb/couchdb.lib.lua	Sat Jul 10 01:35:05 2010 +0500
@@ -0,0 +1,91 @@
+
+local http = require "socket.http";
+local url = require "socket.url";
+
+local couchapi = module:require("couchdb/couchapi");
+local json = module:require("couchdb/json");
+
+local couchdb_url = assert(module:get_option("couchdb_url"), "Option couchdb_url not specified");
+local db = couchapi.db(couchdb_url);
+
+local function couchdb_get(key)
+	local a,b = db:doc(key):get()
+	print(json.encode(a));
+	if b == 404 then return nil; end
+	if b == 200 then b = nil; end
+	return a.payload,b;
+end
+
+local function couchdb_put(key, value)
+	local a,b = db:doc(key):get();
+	return db:doc(key):put({ payload = value, _rev = a and a._rev });
+end
+
+local st = require "util.stanza";
+
+local handlers = {};
+
+handlers.accounts = {
+	get = function(self, user)
+		return couchdb_get(self.host.."/"..user.."/account");
+	end;
+	set = function(self, user, data)
+		return couchdb_put(self.host.."/"..user.."/account", data);
+	end;
+};
+handlers.vcard = {
+	get = function(self, user)
+		return couchdb_get(self.host.."/"..user.."/vcard");
+	end;
+	set = function(self, user, data)
+		return couchdb_put(self.host.."/"..user.."/vcard", data);
+	end;
+};
+handlers.private = {
+	get = function(self, user)
+		return couchdb_get(self.host.."/"..user.."/private");
+	end;
+	set = function(self, user, data)
+		return couchdb_put(self.host.."/"..user.."/private", data);
+	end;
+};
+handlers.roster = {
+	get = function(self, user)
+		return couchdb_get(self.host.."/"..user.."/roster");
+	end;
+	set = function(self, user, data)
+		return couchdb_put(self.host.."/"..user.."/roster", data);
+	end;
+};
+
+-----------------------------
+local driver = {};
+driver.__index = driver;
+
+function driver:open(host, datastore, typ)
+	local cache_key = host.." "..datastore;
+	if self.ds_cache[cache_key] then return self.ds_cache[cache_key]; end
+	local instance = setmetatable({}, self);
+	instance.host = host;
+	instance.datastore = datastore;
+	local handler = handlers[datastore];
+	if not handler then return nil; end
+	for key,val in pairs(handler) do
+		instance[key] = val;
+	end
+	if instance.init then instance:init(); end
+	self.ds_cache[cache_key] = instance;
+	return instance;
+end
+
+-----------------------------
+local _M = {};
+
+function _M.new()
+	local instance = setmetatable({}, driver);
+	instance.__index = instance;
+	instance.ds_cache = {};
+	return instance;
+end
+
+return _M;