204
+ − 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 ;