mod_couchdb/couchdb/couchapi.lib.lua
changeset 204 316d7c8e1fb0
equal deleted inserted replaced
203:4927b9737bb7 204:316d7c8e1fb0
       
     1 
       
     2 local setmetatable = setmetatable;
       
     3 local pcall = pcall;
       
     4 local type = type;
       
     5 local t_concat = table.concat;
       
     6 local print = print;
       
     7 
       
     8 local socket_url = require "socket.url";
       
     9 local http = require "socket.http";
       
    10 local ltn12 = require "ltn12";
       
    11 
       
    12 --local json = require "json";
       
    13 local json = module:require("couchdb/json");
       
    14 
       
    15 --module("couchdb")
       
    16 local _M = {};
       
    17 
       
    18 local function urlcat(url, path)
       
    19 	return url:gsub("/*$", "").."/"..path:gsub("^/*", "");
       
    20 end
       
    21 
       
    22 local doc_mt = {};
       
    23 doc_mt.__index = doc_mt;
       
    24 
       
    25 function doc_mt:get()
       
    26 	return self.db:get(socket_url.escape(self.id));
       
    27 end
       
    28 function doc_mt:put(val)
       
    29 	return self.db:put(socket_url.escape(self.id), val);
       
    30 end
       
    31 function doc_mt:__tostring()
       
    32 	return "couchdb.doc("..self.url..")";
       
    33 end
       
    34 
       
    35 
       
    36 local db_mt = {};
       
    37 db_mt.__index = db_mt;
       
    38 
       
    39 function db_mt:__tostring()
       
    40 	return "couchdb.db("..self.url..")";
       
    41 end
       
    42 function db_mt:doc(id)
       
    43 	local url = urlcat(self.url, socket_url.escape(id));
       
    44 	return setmetatable({ url = url, db = self, id = id }, doc_mt);
       
    45 end
       
    46 function db_mt:get(id)
       
    47 	local url = urlcat(self.url, id);
       
    48 	local a,b = http.request(url);
       
    49 	local r,x = pcall(json.decode, a);
       
    50 	if r then a = x; end
       
    51 	return a,b;
       
    52 end
       
    53 function db_mt:put(id, value)
       
    54 	local url = urlcat(self.url, id);
       
    55 	if type(value) == "table" then
       
    56 		value = json.encode(value);
       
    57 	elseif value ~= nil and type(value) ~= "string" then
       
    58 		return nil, "Invalid type";
       
    59 	end
       
    60 	local t = {};
       
    61 	local a,b = http.request {
       
    62 		url = url,
       
    63 		sink = ltn12.sink.table(t),
       
    64 		source = ltn12.source.string(value),
       
    65 		method = "PUT",
       
    66 		headers = {
       
    67 			["Content-Length"] = #value,
       
    68 			["Content-Type"] = "application/json"
       
    69 		}
       
    70 	};
       
    71 	a = t_concat(t);
       
    72 	local r,x = pcall(json.decode, a);
       
    73 	if r then a = x; end
       
    74 	return a,b;
       
    75 end
       
    76 
       
    77 
       
    78 local server_mt = {};
       
    79 server_mt.__index = server_mt;
       
    80 
       
    81 function server_mt:db(name)
       
    82 	local url = urlcat(self.url, socket_url.escape(name));
       
    83 	return setmetatable({ url = url }, db_mt);
       
    84 end
       
    85 function server_mt:__tostring()
       
    86 	return "couchdb.server("..self.url..")";
       
    87 end
       
    88 
       
    89 
       
    90 function _M.server(url)
       
    91 	return setmetatable({ url = url }, server_mt);
       
    92 end
       
    93 function _M.db(url)
       
    94 	return setmetatable({ url = url }, db_mt);
       
    95 end
       
    96 
       
    97 return _M;