+function list_append(username, host, datastore, data)
+ if not data then return; end
+ if callback(username, host, datastore) == false then return true; end
+ -- save the datastore
+ local f, msg = io_open(getpath(username, host, datastore, "list", true), "a+");
+ if not f then
+ log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil"));
+ return;
+ end
+ f:write("item(");
+ append(f, data);
+ f:write(");\n");
+ f:close();
+ return true;
+end
+
+function list_store(username, host, datastore, data)
+ if not data then
+ data = {};
+ end
+ if callback(username, host, datastore) == false then return true; end
+ -- save the datastore
+ local f, msg = io_open(getpath(username, host, datastore, "list", true), "w+");
+ if not f then
+ log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil"));
+ return;
+ end
+ for _, d in ipairs(data) do
+ f:write("item(");
+ append(f, d);
+ f:write(");\n");
+ end
+ f:close();
+ 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, "list"));
+ end
+ -- we write data even when we are deleting because lua doesn't have a
+ -- platform independent way of checking for non-exisitng files
+ return true;
+end
+
+function list_load(username, host, datastore)
+ local data, ret = loadfile(getpath(username, host, datastore, "list"));
+ if not data then
+ log("debug", "Failed to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil"));
+ return nil;
+ end
+ local items = {};
+ setfenv(data, {item = function(i) t_insert(items, i); end});
+ local success, ret = pcall(data);
+ if not success then
+ log("error", "Unable to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil"));
+ return nil;
+ end
+ return items;
+end
+
+return _M;