Mercurial > prosody-hg
comparison util/datamanager.lua @ 1381:46a58df8557d
util.datamanager: Allow multiple data storage callbacks, and allow them to modify parameters
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 22 Jun 2009 14:15:33 +0100 |
| parents | c5b33640a5f0 |
| children | 44780b856ce7 |
comparison
equal
deleted
inserted
replaced
| 1380:9b3b43b8963a | 1381:46a58df8557d |
|---|---|
| 48 end | 48 end |
| 49 return path; | 49 return path; |
| 50 end | 50 end |
| 51 | 51 |
| 52 local data_path = "data"; | 52 local data_path = "data"; |
| 53 local callback; | 53 local callbacks = {}; |
| 54 | 54 |
| 55 ------- API ------------- | 55 ------- API ------------- |
| 56 | 56 |
| 57 function set_data_path(path) | 57 function set_data_path(path) |
| 58 log("debug", "Setting data path to: %s", path); | 58 log("debug", "Setting data path to: %s", path); |
| 59 data_path = path; | 59 data_path = path; |
| 60 end | 60 end |
| 61 function set_callback(func) | 61 |
| 62 callback = func; | 62 local function callback(username, host, datastore, data) |
| 63 for _, f in ipairs(callbacks) do | |
| 64 username, host, datastore, data = f(username, host, datastore, data); | |
| 65 if not username then break; end | |
| 66 end | |
| 67 | |
| 68 return username, host, datastore, data; | |
| 69 end | |
| 70 function add_callback(func) | |
| 71 if not callbacks[func] then -- Would you really want to set the same callback more than once? | |
| 72 callbacks[func] = true; | |
| 73 callbacks[#callbacks+1] = func; | |
| 74 return true; | |
| 75 end | |
| 76 end | |
| 77 function remove_callback(func) | |
| 78 if callbacks[func] then | |
| 79 for i, f in ipairs(callbacks) do | |
| 80 if f == func then | |
| 81 callbacks[i] = nil; | |
| 82 callbacks[f] = nil; | |
| 83 return true; | |
| 84 end | |
| 85 end | |
| 86 end | |
| 63 end | 87 end |
| 64 | 88 |
| 65 function getpath(username, host, datastore, ext, create) | 89 function getpath(username, host, datastore, ext, create) |
| 66 ext = ext or "dat"; | 90 ext = ext or "dat"; |
| 67 host = host and encode(host); | 91 host = host and encode(host); |
| 95 | 119 |
| 96 function store(username, host, datastore, data) | 120 function store(username, host, datastore, data) |
| 97 if not data then | 121 if not data then |
| 98 data = {}; | 122 data = {}; |
| 99 end | 123 end |
| 100 if callback and callback(username, host, datastore) then return true; end | 124 |
| 125 username, host, datastore, data = callback(username, host, datastore, data); | |
| 126 if not username then | |
| 127 return true; -- Don't save this data at all | |
| 128 end | |
| 129 | |
| 101 -- save the datastore | 130 -- save the datastore |
| 102 local f, msg = io_open(getpath(username, host, datastore, nil, true), "w+"); | 131 local f, msg = io_open(getpath(username, host, datastore, nil, true), "w+"); |
| 103 if not f then | 132 if not f then |
| 104 log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil")); | 133 log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil")); |
| 105 return; | 134 return; |
