mod_couchdb/couchdb/mod_couchdb.lua
author Matthew Wild <mwild1@gmail.com>
Mon, 19 Mar 2012 17:06:02 +0000
changeset 625 2c07bcf56a36
parent 229 5689ffaf97df
child 813 2469f779b3f7
permissions -rw-r--r--
mod_smacks: Don't hibernate session on graceful stream close
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
229
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     2
local http = require "socket.http";
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     3
local url = require "socket.url";
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     4
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
local couchapi = module:require("couchdb/couchapi");
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
local json = module:require("couchdb/json");
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
local couchdb_url = assert(module:get_option("couchdb_url"), "Option couchdb_url not specified");
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     9
local db = couchapi.db(couchdb_url);
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
local function couchdb_get(key)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
	local a,b = db:doc(key):get()
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    13
	print(json.encode(a));
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
	if b == 404 then return nil; end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    15
	if b == 200 then b = nil; end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    16
	return a.payload,b;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    17
end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    18
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    19
local function couchdb_put(key, value)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    20
	local a,b = db:doc(key):get();
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
	return db:doc(key):put({ payload = value, _rev = a and a._rev });
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    23
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
local st = require "util.stanza";
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    26
local handlers = {};
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    27
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    28
handlers.accounts = {
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    29
	get = function(self, user)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    30
		return couchdb_get(self.host.."/"..user.."/account");
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    31
	end;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    32
	set = function(self, user, data)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    33
		return couchdb_put(self.host.."/"..user.."/account", data);
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    34
	end;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    35
};
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    36
handlers.vcard = {
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    37
	get = function(self, user)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    38
		return couchdb_get(self.host.."/"..user.."/vcard");
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    39
	end;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    40
	set = function(self, user, data)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    41
		return couchdb_put(self.host.."/"..user.."/vcard", data);
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    42
	end;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    43
};
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    44
handlers.private = {
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    45
	get = function(self, user)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    46
		return couchdb_get(self.host.."/"..user.."/private");
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    47
	end;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    48
	set = function(self, user, data)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    49
		return couchdb_put(self.host.."/"..user.."/private", data);
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    50
	end;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    51
};
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    52
handlers.roster = {
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    53
	get = function(self, user)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    54
		return couchdb_get(self.host.."/"..user.."/roster");
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    55
	end;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    56
	set = function(self, user, data)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    57
		return couchdb_put(self.host.."/"..user.."/roster", data);
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    58
	end;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    59
};
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    60
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    61
-----------------------------
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    62
local driver = {};
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    64
function driver:open(datastore, typ)
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    65
	local handler = handlers[datastore];
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
	if not handler then return nil; end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
	local host = module.host;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
	--local cache_key = host.." "..datastore;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
	--if self.ds_cache[cache_key] then return self.ds_cache[cache_key]; end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    70
	local instance = setmetatable({ host = host, datastore = datastore }, { __index = handler });
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    71
	--for key,val in pairs(handler) do
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
	--	instance[key] = val;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
	--end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
	--if instance.init then instance:init(); end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
	--self.ds_cache[cache_key] = instance;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
	return instance;
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    77
end
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    78
5689ffaf97df mod_couchdb: Now added as a proper module using the new storage provider system.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    79
module:add_item("data-driver", driver);