diff options
author | Matthew Wild <mwild1@gmail.com> | 2013-04-08 12:08:34 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2013-04-08 12:08:34 +0100 |
commit | fa09a82b6e040692b27dc9a11724a34457942483 (patch) | |
tree | 4c41585b13e2062d4f79c24949a89faa20926f60 /util/datamanager.lua | |
parent | 3b78f8ac621cc16ec089591a1ba7a8f8cbf85026 (diff) | |
parent | f056043347346a781c3519b5fdb1b5357e3df771 (diff) | |
download | prosody-fa09a82b6e040692b27dc9a11724a34457942483.tar.gz prosody-fa09a82b6e040692b27dc9a11724a34457942483.zip |
Merge 0.9->trunk
Diffstat (limited to 'util/datamanager.lua')
-rw-r--r-- | util/datamanager.lua | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/util/datamanager.lua b/util/datamanager.lua index 383e738f..4a4d62b3 100644 --- a/util/datamanager.lua +++ b/util/datamanager.lua @@ -187,17 +187,25 @@ function store(username, host, datastore, data) -- save the datastore local d = "return " .. serialize(data) .. ";\n"; - local ok, msg = atomic_store(getpath(username, host, datastore, nil, true), d); - if not ok then - log("error", "Unable to write to %s storage ('%s') for user: %s@%s", datastore, msg, username or "nil", host or "nil"); - return nil, "Error saving to storage"; - end - if next(data) == nil then -- try to delete empty datastore - log("debug", "Removing empty %s datastore for user %s@%s", datastore, username or "nil", host or "nil"); - os_remove(getpath(username, host, datastore)); - end - -- we write data even when we are deleting because lua doesn't have a - -- platform independent way of checking for non-exisitng files + local mkdir_cache_cleared; + repeat + local ok, msg = atomic_store(getpath(username, host, datastore, nil, true), d); + if not ok then + if not mkdir_cache_cleared then -- We may need to recreate a removed directory + _mkdir = {}; + mkdir_cache_cleared = true; + else + log("error", "Unable to write to %s storage ('%s') for user: %s@%s", datastore, msg, username or "nil", host or "nil"); + return nil, "Error saving to storage"; + end + end + if next(data) == nil then -- try to delete empty datastore + log("debug", "Removing empty %s datastore for user %s@%s", datastore, username or "nil", host or "nil"); + os_remove(getpath(username, host, datastore)); + end + -- we write data even when we are deleting because lua doesn't have a + -- platform independent way of checking for non-exisitng files + until ok; return true; end @@ -354,4 +362,6 @@ function purge(username, host) return #errs == 0, t_concat(errs, ", "); end +_M.path_decode = decode; +_M.path_encode = encode; return _M; |