local os_remove = os.remove;
local os_rename = os.rename;
local tonumber = tonumber;
+local tostring = tostring;
local next = next;
+local type = type;
local t_insert = table.insert;
local t_concat = table.concat;
local envloadfile = require"util.envload".envloadfile;
local function atomic_store(filename, data)
local scratch = filename.."~";
local f, ok, msg;
- repeat
- f, msg = io_open(scratch, "w");
- if not f then break end
- ok, msg = f:write(data);
- if not ok then break end
+ f, msg = io_open(scratch, "w");
+ if not f then
+ return nil, msg;
+ end
- ok, msg = f:close();
- if not ok then break end
+ ok, msg = f:write(data);
+ if not ok then
+ f:close();
+ os_remove(scratch);
+ return nil, msg;
+ end
- return os_rename(scratch, filename);
- until false;
+ ok, msg = f:close();
+ if not ok then
+ os_remove(scratch);
+ return nil, msg;
+ end
- -- Cleanup
- if f then f:close(); end
- os_remove(scratch);
- return nil, msg;
+ return os_rename(scratch, filename);
end
if prosody and prosody.platform ~= "posix" then
-- Append a blob of data to a file
local function append(username, host, datastore, ext, data)
+ if type(data) ~= "string" then return; end
local filename = getpath(username, host, datastore, ext, true);
local ok;
-- File did probably not exist, let's create it
f, msg = io_open(filename, "w");
if not f then
- return nil, msg;
+ return nil, msg, "open";
end
end
ok, msg = f:write(data);
if not ok then
f:close();
- return ok, msg;
+ return ok, msg, "write";
end
ok, msg = f:close();
return ok, msg;
end
- return true;
+ return true, pos;
end
local function list_append(username, host, datastore, data)
getpath = getpath;
load = load;
store = store;
+ append_raw = append;
list_append = list_append;
list_store = list_store;
list_load = list_load;