Mercurial > prosody-modules
diff mod_storage_mongodb/mod_storage_mongodb.lua @ 1324:853a382c9bd6
mod_turncredentials: Advertise the XEP-0215 feature (thanks Gryffus)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 28 Feb 2014 15:36:06 +0100 |
parents | fd420237a5e4 |
children | b21236b6b8d8 |
line wrap: on
line diff
--- a/mod_storage_mongodb/mod_storage_mongodb.lua Wed Feb 26 13:08:47 2014 -0800 +++ b/mod_storage_mongodb/mod_storage_mongodb.lua Fri Feb 28 15:36:06 2014 +0100 @@ -1,5 +1,8 @@ local next = next; local setmetatable = setmetatable; +local set = require"util.set"; +local it = require"util.iterators"; +local array = require"util.array"; local params = assert ( module:get_option("mongodb") , "mongodb configuration not found" ); @@ -46,6 +49,75 @@ end; end +local roster_store = {}; +roster_store.__index = roster_store; + +function roster_store:get(username) + local host = module.host or "_global"; + local store = self.store; + + -- The database name can't have a period in it (hence it can't be a host/ip) + local namespace = params.dbname .. "." .. host; + local v = { _id = { store = store ; username = username } }; + + local cursor , err = conn:query ( namespace , v ); + if not cursor then return nil , err end; + + local r , err = cursor:next ( ); + if not r then return nil , err end; + local roster = { + [false] = { + version = r.version; + }; + pending = set.new( r.pending )._items; + }; + local items = r.items; + for i = 1, #items do + local item = items[i]; + roster[item.jid] = { + subscription = item.subscription; + groups = set.new( item.groups )._items; + ask = item.ask; + name = item.name; + } + end + return roster; +end + +function roster_store:set(username, data) + local host = module.host or "_global"; + local store = self.store; + + -- The database name can't have a period in it (hence it can't be a host/ip) + local namespace = params.dbname .. "." .. host; + local v = { _id = { store = store ; username = username } }; + + if data == nil or next(data) == nil then -- delete data + return conn:remove ( namespace , v ); + end + + v.version = data[false].version + if data.pending then + v.pending = array(it.keys(v.pending)) + end + + local items = {} + for jid, item in pairs(data) do + if jid and jid ~= "pending" then + table.insert(items, { + jid = jid; + subscription = item.subscription; + groups = array(it.keys( item.groups )); + name = item.name; + ask = item.ask; + }); + end + end + v.items = items; + + return conn:insert ( namespace , v ); +end + local driver = {}; function driver:open(store, typ) @@ -58,6 +130,9 @@ end if not typ then -- default key-value store + if store == "roster" then + return setmetatable({ store = store }, roster_store); + end return setmetatable({ store = store }, keyval_store); end; return nil, "unsupported-store";