Mercurial > prosody-modules
comparison mod_storage_xmlarchive/mod_storage_xmlarchive.lua @ 1740:11f7fb2f927f
mod_storage_xmlarchive: Code is annoying to read when every other line is 'if not ok then return'
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 18 May 2015 02:44:41 +0200 |
| parents | 940a4ab75cec |
| children | 07ceaf5f6f0d |
comparison
equal
deleted
inserted
replaced
| 1739:940a4ab75cec | 1740:11f7fb2f927f |
|---|---|
| 12 if not ok then | 12 if not ok then |
| 13 return ok, msg; | 13 return ok, msg; |
| 14 end | 14 end |
| 15 return f:seek("set", offset); | 15 return f:seek("set", offset); |
| 16 end; | 16 end; |
| 17 | |
| 17 pcall(function() | 18 pcall(function() |
| 18 local pposix = require "util.pposix"; | 19 local pposix = require "util.pposix"; |
| 19 fallocate = pposix.fallocate or fallocate; | 20 fallocate = pposix.fallocate or fallocate; |
| 20 end); | 21 end); |
| 21 | 22 |
| 25 function archive:append(username, _, when, with, data) | 26 function archive:append(username, _, when, with, data) |
| 26 if getmetatable(data) ~= st.stanza_mt then | 27 if getmetatable(data) ~= st.stanza_mt then |
| 27 module:log("error", "Attempt to store non-stanza object, traceback: %s", debug.traceback()); | 28 module:log("error", "Attempt to store non-stanza object, traceback: %s", debug.traceback()); |
| 28 return nil, "unsupported-datatype"; | 29 return nil, "unsupported-datatype"; |
| 29 end | 30 end |
| 31 | |
| 30 username = username or "@"; | 32 username = username or "@"; |
| 31 data = tostring(data) .. "\n"; | 33 data = tostring(data) .. "\n"; |
| 34 | |
| 32 local day = dt.date(when); | 35 local day = dt.date(when); |
| 33 local filename = dm.getpath(username.."@"..day, module.host, self.store, "xml", true); | 36 local filename = dm.getpath(username.."@"..day, module.host, self.store, "xml", true); |
| 37 | |
| 34 local ok, err; | 38 local ok, err; |
| 35 local f = io.open(filename, "r+"); | 39 local f = io.open(filename, "r+"); |
| 36 if not f then | 40 if not f then |
| 37 f, err = io.open(filename, "w"); | 41 f, err = io.open(filename, "w"); if not f then return nil, err; end |
| 38 if not f then return nil, err; end | |
| 39 ok, err = dm.list_append(username, module.host, self.store, day); | 42 ok, err = dm.list_append(username, module.host, self.store, day); |
| 40 if not ok then return nil, err; end | 43 if not ok then return nil, err; end |
| 41 end | 44 end |
| 42 local offset = f and f:seek("end"); | 45 |
| 43 ok, err = fallocate(f, offset, #data); | 46 local offset = f:seek("end"); -- Seek to the end and collect current file length |
| 44 if not ok then return nil, err; end | 47 -- then make sure there is enough free space for what we're about to add |
| 45 f:seek("set", offset); | 48 ok, err = fallocate(f, offset, #data); if not ok then return nil, err; end |
| 46 ok, err = f:write(data); | 49 ok, err = f:write(data); if not ok then return nil, err; end |
| 47 if not ok then return nil, err; end | 50 ok, err = f:close(); if not ok then return nil, err; end |
| 48 ok, err = f:close(); | 51 |
| 49 if not ok then return nil, err; end | |
| 50 local id = day .. "-" .. hmac_sha256(username.."@"..day.."+"..offset, data, true):sub(-16); | 52 local id = day .. "-" .. hmac_sha256(username.."@"..day.."+"..offset, data, true):sub(-16); |
| 51 ok, err = dm.list_append(username.."@"..day, module.host, self.store, { id = id, when = when, with = with, offset = offset, length = #data }); | 53 ok, err = dm.list_append(username.."@"..day, module.host, self.store, { id = id, when = when, with = with, offset = offset, length = #data }); |
| 52 if not ok then return nil, err; end | 54 if not ok then return nil, err; end |
| 53 return id; | 55 return id; |
| 54 end | 56 end |
