Mercurial > prosody-modules
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 1323:c84ff82658cb | 1324:853a382c9bd6 |
|---|---|
| 1 local next = next; | 1 local next = next; |
| 2 local setmetatable = setmetatable; | 2 local setmetatable = setmetatable; |
| 3 local set = require"util.set"; | |
| 4 local it = require"util.iterators"; | |
| 5 local array = require"util.array"; | |
| 3 | 6 |
| 4 local params = assert ( module:get_option("mongodb") , "mongodb configuration not found" ); | 7 local params = assert ( module:get_option("mongodb") , "mongodb configuration not found" ); |
| 5 | 8 |
| 6 prosody.unlock_globals(); | 9 prosody.unlock_globals(); |
| 7 local mongo = require "mongo"; | 10 local mongo = require "mongo"; |
| 44 else -- delete data | 47 else -- delete data |
| 45 return conn:remove ( namespace , v ); | 48 return conn:remove ( namespace , v ); |
| 46 end; | 49 end; |
| 47 end | 50 end |
| 48 | 51 |
| 52 local roster_store = {}; | |
| 53 roster_store.__index = roster_store; | |
| 54 | |
| 55 function roster_store:get(username) | |
| 56 local host = module.host or "_global"; | |
| 57 local store = self.store; | |
| 58 | |
| 59 -- The database name can't have a period in it (hence it can't be a host/ip) | |
| 60 local namespace = params.dbname .. "." .. host; | |
| 61 local v = { _id = { store = store ; username = username } }; | |
| 62 | |
| 63 local cursor , err = conn:query ( namespace , v ); | |
| 64 if not cursor then return nil , err end; | |
| 65 | |
| 66 local r , err = cursor:next ( ); | |
| 67 if not r then return nil , err end; | |
| 68 local roster = { | |
| 69 [false] = { | |
| 70 version = r.version; | |
| 71 }; | |
| 72 pending = set.new( r.pending )._items; | |
| 73 }; | |
| 74 local items = r.items; | |
| 75 for i = 1, #items do | |
| 76 local item = items[i]; | |
| 77 roster[item.jid] = { | |
| 78 subscription = item.subscription; | |
| 79 groups = set.new( item.groups )._items; | |
| 80 ask = item.ask; | |
| 81 name = item.name; | |
| 82 } | |
| 83 end | |
| 84 return roster; | |
| 85 end | |
| 86 | |
| 87 function roster_store:set(username, data) | |
| 88 local host = module.host or "_global"; | |
| 89 local store = self.store; | |
| 90 | |
| 91 -- The database name can't have a period in it (hence it can't be a host/ip) | |
| 92 local namespace = params.dbname .. "." .. host; | |
| 93 local v = { _id = { store = store ; username = username } }; | |
| 94 | |
| 95 if data == nil or next(data) == nil then -- delete data | |
| 96 return conn:remove ( namespace , v ); | |
| 97 end | |
| 98 | |
| 99 v.version = data[false].version | |
| 100 if data.pending then | |
| 101 v.pending = array(it.keys(v.pending)) | |
| 102 end | |
| 103 | |
| 104 local items = {} | |
| 105 for jid, item in pairs(data) do | |
| 106 if jid and jid ~= "pending" then | |
| 107 table.insert(items, { | |
| 108 jid = jid; | |
| 109 subscription = item.subscription; | |
| 110 groups = array(it.keys( item.groups )); | |
| 111 name = item.name; | |
| 112 ask = item.ask; | |
| 113 }); | |
| 114 end | |
| 115 end | |
| 116 v.items = items; | |
| 117 | |
| 118 return conn:insert ( namespace , v ); | |
| 119 end | |
| 120 | |
| 49 local driver = {}; | 121 local driver = {}; |
| 50 | 122 |
| 51 function driver:open(store, typ) | 123 function driver:open(store, typ) |
| 52 if not conn then | 124 if not conn then |
| 53 conn = assert ( mongo.Connection.New ( true ) ); | 125 conn = assert ( mongo.Connection.New ( true ) ); |
| 56 assert ( conn:auth ( params ) ); | 128 assert ( conn:auth ( params ) ); |
| 57 end | 129 end |
| 58 end | 130 end |
| 59 | 131 |
| 60 if not typ then -- default key-value store | 132 if not typ then -- default key-value store |
| 133 if store == "roster" then | |
| 134 return setmetatable({ store = store }, roster_store); | |
| 135 end | |
| 61 return setmetatable({ store = store }, keyval_store); | 136 return setmetatable({ store = store }, keyval_store); |
| 62 end; | 137 end; |
| 63 return nil, "unsupported-store"; | 138 return nil, "unsupported-store"; |
| 64 end | 139 end |
| 65 | 140 |
