# HG changeset patch # User Kim Alvefur # Date 1449887406 -3600 # Node ID e63dba236a2aed0cd0d7b8584d339b8cbf64232a # Parent 95ad6e68e20373586fd39b7f7aabb5771360e125 mod_storage_xmlarchive: Use datamanager.append_raw (had that code duplicated here) diff -r 95ad6e68e203 -r e63dba236a2a mod_storage_xmlarchive/README.markdown --- a/mod_storage_xmlarchive/README.markdown Sat Dec 12 03:25:57 2015 +0100 +++ b/mod_storage_xmlarchive/README.markdown Sat Dec 12 03:30:06 2015 +0100 @@ -23,7 +23,7 @@ } ``` -To use it with [mod\_mam\_muc] or [mod_http_muc_log]: +To use it with [mod\_mam\_muc] or [mod\_http\_muc\_log]: ``` lua storage = { @@ -31,8 +31,8 @@ } ``` -Refer to [Prosodys data storage -documentation](https://prosody.im/doc/storage) for more information. +Refer to [Prosodys data storage documentation][doc:storage] for more +information. Note that this module does not implement the "keyval" storage method and can't be used by anything other than archives. diff -r 95ad6e68e203 -r e63dba236a2a mod_storage_xmlarchive/mod_storage_xmlarchive.lua --- a/mod_storage_xmlarchive/mod_storage_xmlarchive.lua Sat Dec 12 03:25:57 2015 +0100 +++ b/mod_storage_xmlarchive/mod_storage_xmlarchive.lua Sat Dec 12 03:30:06 2015 +0100 @@ -12,21 +12,6 @@ local new_stream = require "util.xmppstream".new; local empty = {}; -local function fallocate(f, offset, len) - -- This assumes that current position == offset - local fake_data = (" "):rep(len); - local ok, msg = f:write(fake_data); - if not ok then - return ok, msg; - end - return f:seek("set", offset); -end; - -pcall(function() - local pposix = require "util.pposix"; - fallocate = pposix.fallocate or fallocate; -end); - local archive = {}; local archive_mt = { __index = archive }; @@ -43,25 +28,23 @@ data = tostring(data) .. "\n"; local day = dt.date(when); - local filename = dm.getpath(username.."@"..day, module.host, self.store, "xml", true); - - local ok, err; - local f = io.open(filename, "r+"); - if not f then - f, err = io.open(filename, "w"); if not f then return nil, err; end - ok, err = dm.list_append(username, module.host, self.store, day); - if not ok then return nil, err; end + local ok, err = dm.append_raw(username.."@"..day, module.host, self.store, "xml", data); + if not ok then + return nil, err; end - local offset = f:seek("end"); -- Seek to the end and collect current file length - -- then make sure there is enough free space for what we're about to add - ok, err = fallocate(f, offset, #data); if not ok then return nil, err; end - ok, err = f:write(data); if not ok then return nil, err; end - ok, err = f:close(); if not ok then return nil, err; end + local offset = ok and err; local id = day .. "-" .. hmac_sha256(username.."@"..day.."+"..offset, data, true):sub(-16); ok, err = dm.list_append(username.."@"..day, module.host, self.store, { id = id, when = dt.datetime(when), with = with, offset = offset, length = #data }); - if not ok then return nil, err; end + if offset == 0 then + -- means the message is at the beginnig of the file, so it's a new day + -- so we add this new day to the "index" + dm.list_append(username, module.host, self.store, day); + end + if not ok then + return nil, err; + end return id; end