204
+ − 1
+ − 2 local http = require "socket.http" ;
+ − 3 local url = require "socket.url" ;
+ − 4
+ − 5 local couchapi = module : require ( "couchdb/couchapi" );
+ − 6 local json = module : require ( "couchdb/json" );
+ − 7
+ − 8 local couchdb_url = assert ( module : get_option ( "couchdb_url" ), "Option couchdb_url not specified" );
+ − 9 local db = couchapi . db ( couchdb_url );
+ − 10
+ − 11 local function couchdb_get ( key )
+ − 12 local a , b = db : doc ( key ): get ()
+ − 13 print ( json . encode ( a ));
+ − 14 if b == 404 then return nil ; end
+ − 15 if b == 200 then b = nil ; end
+ − 16 return a . payload , b ;
+ − 17 end
+ − 18
+ − 19 local function couchdb_put ( key , value )
+ − 20 local a , b = db : doc ( key ): get ();
+ − 21 return db : doc ( key ): put ({ payload = value , _rev = a and a . _rev });
+ − 22 end
+ − 23
+ − 24 local st = require "util.stanza" ;
+ − 25
+ − 26 local handlers = {};
+ − 27
+ − 28 handlers . accounts = {
+ − 29 get = function ( self , user )
+ − 30 return couchdb_get ( self . host .. "/" .. user .. "/account" );
+ − 31 end ;
+ − 32 set = function ( self , user , data )
+ − 33 return couchdb_put ( self . host .. "/" .. user .. "/account" , data );
+ − 34 end ;
+ − 35 };
+ − 36 handlers . vcard = {
+ − 37 get = function ( self , user )
+ − 38 return couchdb_get ( self . host .. "/" .. user .. "/vcard" );
+ − 39 end ;
+ − 40 set = function ( self , user , data )
+ − 41 return couchdb_put ( self . host .. "/" .. user .. "/vcard" , data );
+ − 42 end ;
+ − 43 };
+ − 44 handlers . private = {
+ − 45 get = function ( self , user )
+ − 46 return couchdb_get ( self . host .. "/" .. user .. "/private" );
+ − 47 end ;
+ − 48 set = function ( self , user , data )
+ − 49 return couchdb_put ( self . host .. "/" .. user .. "/private" , data );
+ − 50 end ;
+ − 51 };
+ − 52 handlers . roster = {
+ − 53 get = function ( self , user )
+ − 54 return couchdb_get ( self . host .. "/" .. user .. "/roster" );
+ − 55 end ;
+ − 56 set = function ( self , user , data )
+ − 57 return couchdb_put ( self . host .. "/" .. user .. "/roster" , data );
+ − 58 end ;
+ − 59 };
+ − 60
+ − 61 -----------------------------
+ − 62 local driver = {};
+ − 63 driver . __index = driver ;
+ − 64
+ − 65 function driver : open ( host , datastore , typ )
+ − 66 local cache_key = host .. " " .. datastore ;
+ − 67 if self . ds_cache [ cache_key ] then return self . ds_cache [ cache_key ]; end
+ − 68 local instance = setmetatable ({}, self );
+ − 69 instance . host = host ;
+ − 70 instance . datastore = datastore ;
+ − 71 local handler = handlers [ datastore ];
+ − 72 if not handler then return nil ; end
+ − 73 for key , val in pairs ( handler ) do
+ − 74 instance [ key ] = val ;
+ − 75 end
+ − 76 if instance . init then instance : init (); end
+ − 77 self . ds_cache [ cache_key ] = instance ;
+ − 78 return instance ;
+ − 79 end
+ − 80
+ − 81 -----------------------------
+ − 82 local _M = {};
+ − 83
+ − 84 function _M . new ()
+ − 85 local instance = setmetatable ({}, driver );
+ − 86 instance . __index = instance ;
+ − 87 instance . ds_cache = {};
+ − 88 return instance ;
+ − 89 end
+ − 90
+ − 91 return _M ;