mod_storage_appendmap/mod_storage_appendmap.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 5695 78f766372e2c
permissions -rw-r--r--
mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local dump = require "util.serialization".serialize;
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
local load = require "util.envload".envloadfile;
5695
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
     3
local datetime = require "util.datetime".datetime;
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local dm = require "core.storagemanager".olddm;
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
2800
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
     6
local REMOVE = {}; -- Special value for removing keys
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
     7
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
local driver = {};
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
5695
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
    10
local timestamps = module:get_option_boolean("appendmap_timestamps", true);
2800
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    11
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    12
local keywords = {
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    13
	["do"] = true; ["and"] = true; ["else"] = true; ["break"] = true;
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    14
	["if"] = true; ["end"] = true; ["goto"] = true; ["false"] = true;
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    15
	["in"] = true; ["for"] = true; ["then"] = true; ["local"] = true;
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    16
	["or"] = true; ["nil"] = true; ["true"] = true; ["until"] = true;
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    17
	["elseif"] = true; ["function"] = true; ["not"] = true;
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    18
	["repeat"] = true; ["return"] = true; ["while"] = true;
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    19
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    20
	-- _ENV is not technically a keyword but we need to treat it as such
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    21
	["_ENV"] = true;
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    22
};
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    23
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    24
local function is_usable_identifier(s)
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    25
	return type(s) == "string" and not keywords[s] and s:find("^[%a_][%w_]*$");
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    26
end
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    27
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    28
local function serialize_key(key)
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    29
	if is_usable_identifier(key) then
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    30
		return key;
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    31
	else
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    32
		return "_ENV[" .. dump(key) .. "]";
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    33
	end
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    34
end
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    35
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    36
local function serialize_value(value)
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    37
	if value == REMOVE then
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    38
		return "nil";
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    39
	else
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    40
		return dump(value);
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    41
	end
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    42
end
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    43
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    44
local function serialize_pair(key, value)
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    45
	key = serialize_key(key);
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    46
	value = serialize_value(value);
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    47
	return key .. " = " .. value .. ";\n";
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    48
end
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    49
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    50
local function serialize_map(keyvalues)
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    51
	local keys, values = {}, {};
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    52
	for key, value in pairs(keyvalues) do
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    53
		key = serialize_key(key);
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    54
		value = serialize_value(value);
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    55
		table.insert(keys, key);
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    56
		table.insert(values, value);
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    57
	end
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    58
	return table.concat(keys, ", ") .. " = " .. table.concat(values, ", ") .. ";\n";
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    59
end
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    60
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    61
local map = { remove = REMOVE };
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
local map_mt = { __index = map };
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
function map:get(user, key)
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
	module:log("debug", "map:get(%s, %s)", tostring(user), tostring(key))
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
	local filename = dm.getpath(user, module.host, self.store, "map");
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
	module:log("debug", "File is %s", filename);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
	local env = {};
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
	if _VERSION == "Lua 5.1" then -- HACK
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
		env._ENV = env; -- HACK
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
	end -- SO MANY HACKS
2639
4548c3d685b4 mod_storage_appendmap: Successfully return nothing on ENOENT
Kim Alvefur <zash@zash.se>
parents: 2435
diff changeset
    72
	local chunk, err, errno = load(filename, env);
4548c3d685b4 mod_storage_appendmap: Successfully return nothing on ENOENT
Kim Alvefur <zash@zash.se>
parents: 2435
diff changeset
    73
	if not chunk then if errno == 2 then return end return chunk, err; end
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
	local ok, err = pcall(chunk);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
	if not ok then return ok, err; end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
	if _VERSION == "Lua 5.1" then -- HACK
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
		env._ENV = nil; -- HACK
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
	end -- HACKS EVERYWHERE
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
	if key == nil then
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
		return env;
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
	end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
	return env[key];
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
function map:set_keys(user, keyvalues)
2800
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    86
	local data = serialize_map(keyvalues);
5695
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
    87
	if timestamps then
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
    88
		data = "-- " .. datetime() .. "\n" .. data;
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
    89
	end
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    90
	return dm.append_raw(user, module.host, self.store, "map", data);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
function map:set(user, key, value)
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
	if _VERSION == "Lua 5.1" then
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
		assert(key ~= "_ENV", "'_ENV' is a restricted key");
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
	end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
	if key == nil then
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
		local filename = dm.getpath(user, module.host, self.store, "map");
2800
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
    99
		return os.remove(filename);
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
	end
2800
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
   101
	local data = serialize_pair(key, value);
5695
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
   102
	if timestamps then
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
   103
		data = "-- " .. datetime() .. "\n" .. data;
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
   104
	end
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
	return dm.append_raw(user, module.host, self.store, "map", data);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   106
end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   107
5694
ea6c18ec0669 mod_storage_appendmap: Implement item/user iteration methods
Kim Alvefur <zash@zash.se>
parents: 5065
diff changeset
   108
function map:items()
ea6c18ec0669 mod_storage_appendmap: Implement item/user iteration methods
Kim Alvefur <zash@zash.se>
parents: 5065
diff changeset
   109
	return dm.users(module.host, self.store, "map");
ea6c18ec0669 mod_storage_appendmap: Implement item/user iteration methods
Kim Alvefur <zash@zash.se>
parents: 5065
diff changeset
   110
end
ea6c18ec0669 mod_storage_appendmap: Implement item/user iteration methods
Kim Alvefur <zash@zash.se>
parents: 5065
diff changeset
   111
2800
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
   112
local keyval = { remove = REMOVE };
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   113
local keyval_mt = { __index = keyval };
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   114
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   115
function keyval:get(user)
2800
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
   116
	return map.get(self, user, nil);
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   117
end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   118
2800
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
   119
function keyval:set(user, keyvalues)
6a7b7cb7148e mod_storage_appendmap: Factor out serialization into reusable functions
Kim Alvefur <zash@zash.se>
parents: 2639
diff changeset
   120
	local data = serialize_map(keyvalues);
5695
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
   121
	if timestamps then
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
   122
		data = "-- " .. datetime() .. "\n" .. data;
78f766372e2c mod_storage_appendmap: Include timestamps when appending data
Kim Alvefur <zash@zash.se>
parents: 5694
diff changeset
   123
	end
5065
e44b868cc575 mod_storage_appendmap: Fix keyvalue writes
Kim Alvefur <zash@zash.se>
parents: 2800
diff changeset
   124
	return dm.store_raw(dm.getpath(user, module.host, self.store, "map"), data);
2066
8f7083b980cf mod_storage_appendmap: Fix keyvalue:set()
Kim Alvefur <zash@zash.se>
parents: 2065
diff changeset
   125
end
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   126
5694
ea6c18ec0669 mod_storage_appendmap: Implement item/user iteration methods
Kim Alvefur <zash@zash.se>
parents: 5065
diff changeset
   127
function keyval:users()
ea6c18ec0669 mod_storage_appendmap: Implement item/user iteration methods
Kim Alvefur <zash@zash.se>
parents: 5065
diff changeset
   128
	return dm.users(module.host, self.store, "map");
ea6c18ec0669 mod_storage_appendmap: Implement item/user iteration methods
Kim Alvefur <zash@zash.se>
parents: 5065
diff changeset
   129
end
ea6c18ec0669 mod_storage_appendmap: Implement item/user iteration methods
Kim Alvefur <zash@zash.se>
parents: 5065
diff changeset
   130
2065
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   131
-- TODO some kind of periodic compaction thing?
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   132
function map:_compact(user)
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
	local data = self:get(user);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   134
	return keyval.set(self, user, data);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   135
end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   136
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   137
function driver:open(store, typ)
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   138
	if typ == "map" then
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   139
		return setmetatable({ store = store, }, map_mt);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   140
	elseif typ == nil or typ == "keyval" then
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   141
		return setmetatable({ store = store, }, keyval_mt);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   142
	end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   143
	return nil, "unsupported-store";
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   144
end
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   145
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   146
module:provides("storage", driver);
b84284144e21 mod_storage_appendmap: Experimental storage module optimized for map stores
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   147