Mercurial > prosody-modules
view mod_couchdb/couchdb/couchapi.lib.lua @ 3571:f5ea0b886c7c
mod_storage_xmlarchive: Limit search to smallest time range in case of inexact match
This should improve performance in case the exact days in the 'start'
and 'end' range are missing from the index.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 03 May 2019 18:59:38 +0200 |
parents | 316d7c8e1fb0 |
children |
line wrap: on
line source
local setmetatable = setmetatable; local pcall = pcall; local type = type; local t_concat = table.concat; local print = print; local socket_url = require "socket.url"; local http = require "socket.http"; local ltn12 = require "ltn12"; --local json = require "json"; local json = module:require("couchdb/json"); --module("couchdb") local _M = {}; local function urlcat(url, path) return url:gsub("/*$", "").."/"..path:gsub("^/*", ""); end local doc_mt = {}; doc_mt.__index = doc_mt; function doc_mt:get() return self.db:get(socket_url.escape(self.id)); end function doc_mt:put(val) return self.db:put(socket_url.escape(self.id), val); end function doc_mt:__tostring() return "couchdb.doc("..self.url..")"; end local db_mt = {}; db_mt.__index = db_mt; function db_mt:__tostring() return "couchdb.db("..self.url..")"; end function db_mt:doc(id) local url = urlcat(self.url, socket_url.escape(id)); return setmetatable({ url = url, db = self, id = id }, doc_mt); end function db_mt:get(id) local url = urlcat(self.url, id); local a,b = http.request(url); local r,x = pcall(json.decode, a); if r then a = x; end return a,b; end function db_mt:put(id, value) local url = urlcat(self.url, id); if type(value) == "table" then value = json.encode(value); elseif value ~= nil and type(value) ~= "string" then return nil, "Invalid type"; end local t = {}; local a,b = http.request { url = url, sink = ltn12.sink.table(t), source = ltn12.source.string(value), method = "PUT", headers = { ["Content-Length"] = #value, ["Content-Type"] = "application/json" } }; a = t_concat(t); local r,x = pcall(json.decode, a); if r then a = x; end return a,b; end local server_mt = {}; server_mt.__index = server_mt; function server_mt:db(name) local url = urlcat(self.url, socket_url.escape(name)); return setmetatable({ url = url }, db_mt); end function server_mt:__tostring() return "couchdb.server("..self.url..")"; end function _M.server(url) return setmetatable({ url = url }, server_mt); end function _M.db(url) return setmetatable({ url = url }, db_mt); end return _M;