Mercurial > prosody-modules
comparison mod_storage_xmlarchive/mod_storage_xmlarchive.lua @ 1969:e63dba236a2a
mod_storage_xmlarchive: Use datamanager.append_raw (had that code duplicated here)
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 12 Dec 2015 03:30:06 +0100 |
| parents | 004d3bfc05ea |
| children | a85b5c3791dc |
comparison
equal
deleted
inserted
replaced
| 1968:95ad6e68e203 | 1969:e63dba236a2a |
|---|---|
| 10 local st = require"util.stanza"; | 10 local st = require"util.stanza"; |
| 11 local dt = require"util.datetime"; | 11 local dt = require"util.datetime"; |
| 12 local new_stream = require "util.xmppstream".new; | 12 local new_stream = require "util.xmppstream".new; |
| 13 local empty = {}; | 13 local empty = {}; |
| 14 | 14 |
| 15 local function fallocate(f, offset, len) | |
| 16 -- This assumes that current position == offset | |
| 17 local fake_data = (" "):rep(len); | |
| 18 local ok, msg = f:write(fake_data); | |
| 19 if not ok then | |
| 20 return ok, msg; | |
| 21 end | |
| 22 return f:seek("set", offset); | |
| 23 end; | |
| 24 | |
| 25 pcall(function() | |
| 26 local pposix = require "util.pposix"; | |
| 27 fallocate = pposix.fallocate or fallocate; | |
| 28 end); | |
| 29 | |
| 30 local archive = {}; | 15 local archive = {}; |
| 31 local archive_mt = { __index = archive }; | 16 local archive_mt = { __index = archive }; |
| 32 | 17 |
| 33 function archive:append(username, _, data, when, with) | 18 function archive:append(username, _, data, when, with) |
| 34 if type(when) ~= "number" then | 19 if type(when) ~= "number" then |
| 41 | 26 |
| 42 username = username or "@"; | 27 username = username or "@"; |
| 43 data = tostring(data) .. "\n"; | 28 data = tostring(data) .. "\n"; |
| 44 | 29 |
| 45 local day = dt.date(when); | 30 local day = dt.date(when); |
| 46 local filename = dm.getpath(username.."@"..day, module.host, self.store, "xml", true); | 31 local ok, err = dm.append_raw(username.."@"..day, module.host, self.store, "xml", data); |
| 47 | 32 if not ok then |
| 48 local ok, err; | 33 return nil, err; |
| 49 local f = io.open(filename, "r+"); | 34 end |
| 50 if not f then | 35 |
| 51 f, err = io.open(filename, "w"); if not f then return nil, err; end | 36 local offset = ok and err; |
| 52 ok, err = dm.list_append(username, module.host, self.store, day); | |
| 53 if not ok then return nil, err; end | |
| 54 end | |
| 55 | |
| 56 local offset = f:seek("end"); -- Seek to the end and collect current file length | |
| 57 -- then make sure there is enough free space for what we're about to add | |
| 58 ok, err = fallocate(f, offset, #data); if not ok then return nil, err; end | |
| 59 ok, err = f:write(data); if not ok then return nil, err; end | |
| 60 ok, err = f:close(); if not ok then return nil, err; end | |
| 61 | 37 |
| 62 local id = day .. "-" .. hmac_sha256(username.."@"..day.."+"..offset, data, true):sub(-16); | 38 local id = day .. "-" .. hmac_sha256(username.."@"..day.."+"..offset, data, true):sub(-16); |
| 63 ok, err = dm.list_append(username.."@"..day, module.host, self.store, { id = id, when = dt.datetime(when), with = with, offset = offset, length = #data }); | 39 ok, err = dm.list_append(username.."@"..day, module.host, self.store, { id = id, when = dt.datetime(when), with = with, offset = offset, length = #data }); |
| 64 if not ok then return nil, err; end | 40 if offset == 0 then |
| 41 -- means the message is at the beginnig of the file, so it's a new day | |
| 42 -- so we add this new day to the "index" | |
| 43 dm.list_append(username, module.host, self.store, day); | |
| 44 end | |
| 45 if not ok then | |
| 46 return nil, err; | |
| 47 end | |
| 65 return id; | 48 return id; |
| 66 end | 49 end |
| 67 | 50 |
| 68 function archive:find(username, query) | 51 function archive:find(username, query) |
| 69 username = username or "@"; | 52 username = username or "@"; |
