diff -r 0ae8584ba3e7 -r 8ff454831f7d util/datamanager.lua --- a/util/datamanager.lua Thu Dec 25 05:16:11 2008 +0500 +++ b/util/datamanager.lua Thu Dec 25 06:35:05 2008 +0500 @@ -26,11 +26,13 @@ local log = require "util.logger".init("datamanager"); local io_open = io.open; local os_remove = os.remove; +local io_popen = io.popen; local tostring, tonumber = tostring, tonumber; local error = error; local next = next; local t_insert = table.insert; local append = require "util.serialization".append; +local path_separator = "/"; if os.getenv("WINDIR") then path_separator = "\\" end module "datamanager" @@ -48,21 +50,37 @@ end end +local _mkdir = {}; +local function mkdir(path) + path = path:gsub("/", path_separator); -- TODO as an optimization, do this during path creation rather than here + if not _mkdir[path] then + local x = io_popen("mkdir \""..path.."\" 2>&1"):read("*a"); + _mkdir[path] = true; + end + return path; +end + +local data_path = "data"; + ------- API ------------- -local data_path = "data"; function set_data_path(path) log("info", "Setting data path to %s", path); data_path = path; end -function getpath(username, host, datastore, ext) +function getpath(username, host, datastore, ext, create) ext = ext or "dat"; + host = host and encode(host); + username = username and encode(username); if username then - return format("%s/%s/%s/%s.%s", data_path, encode(host), datastore, encode(username), ext); + if create then mkdir(mkdir(mkdir(data_path).."/"..host).."/"..datastore); end + return format("%s/%s/%s/%s.%s", data_path, host, datastore, username, ext); elseif host then - return format("%s/%s/%s.%s", data_path, encode(host), datastore, ext); + if create then mkdir(mkdir(data_path).."/"..host); end + return format("%s/%s/%s.%s", data_path, host, datastore, ext); else + if create then mkdir(data_path); end return format("%s/%s.%s", data_path, datastore, ext); end end @@ -87,7 +105,7 @@ data = {}; end -- save the datastore - local f, msg = io_open(getpath(username, host, datastore), "w+"); + local f, msg = io_open(getpath(username, host, datastore, nil, true), "w+"); if not f then log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil")); return; @@ -106,7 +124,7 @@ function list_append(username, host, datastore, data) if not data then return; end -- save the datastore - local f, msg = io_open(getpath(username, host, datastore, "list"), "a+"); + 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; @@ -123,7 +141,7 @@ data = {}; end -- save the datastore - local f, msg = io_open(getpath(username, host, datastore, "list"), "w+"); + 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;