mod_storage_mongodb/mod_storage_mongodb.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 1325 b21236b6b8d8
child 1593 3e4d15ae2133
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:
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
     1
local next = next;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
     2
local setmetatable = setmetatable;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
     3
507
46f578da4ff0 mod_storage_mongodb: assert the configuration options
James Callahan <james@chatid.com>
parents: 506
diff changeset
     4
local params = assert ( module:get_option("mongodb") , "mongodb configuration not found" );
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
     5
509
bf2ad6d6c778 mod_storage_mongodb: (un)lock globals around require; only auth if we need to
James Callahan <james@chatid.com>
parents: 508
diff changeset
     6
prosody.unlock_globals();
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
     7
local mongo = require "mongo";
509
bf2ad6d6c778 mod_storage_mongodb: (un)lock globals around require; only auth if we need to
James Callahan <james@chatid.com>
parents: 508
diff changeset
     8
prosody.lock_globals();
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
     9
1010
fd420237a5e4 mod_storage_mongodb: Use util.json to encode our data (handles non-string table keys, etc).
Waqas Hussain <waqas20@gmail.com>
parents: 813
diff changeset
    10
local json = require "util.json";
fd420237a5e4 mod_storage_mongodb: Use util.json to encode our data (handles non-string table keys, etc).
Waqas Hussain <waqas20@gmail.com>
parents: 813
diff changeset
    11
508
9831506dcfd6 mod_storage_mongodb: move database connecting to inside driver:open
James Callahan <james@chatid.com>
parents: 507
diff changeset
    12
local conn
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    13
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    14
local keyval_store = {};
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    15
keyval_store.__index = keyval_store;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    16
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    17
function keyval_store:get(username)
506
0e07810550c8 mod_storage_mongodb: Use _global as host when none provided
James Callahan <james@chatid.com>
parents: 505
diff changeset
    18
	local host = module.host or "_global";
0e07810550c8 mod_storage_mongodb: Use _global as host when none provided
James Callahan <james@chatid.com>
parents: 505
diff changeset
    19
	local store = self.store;
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    20
507
46f578da4ff0 mod_storage_mongodb: assert the configuration options
James Callahan <james@chatid.com>
parents: 506
diff changeset
    21
	-- The database name can't have a period in it (hence it can't be a host/ip)
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    22
	local namespace = params.dbname .. "." .. host;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    23
	local v = { _id = { store = store ; username = username } };
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    24
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    25
	local cursor , err = conn:query ( namespace , v );
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    26
	if not cursor then return nil , err end;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    27
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    28
	local r , err = cursor:next ( );
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    29
	if not r then return nil , err end;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    30
	return r.data;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    31
end
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    32
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    33
function keyval_store:set(username, data)
506
0e07810550c8 mod_storage_mongodb: Use _global as host when none provided
James Callahan <james@chatid.com>
parents: 505
diff changeset
    34
	local host = module.host or "_global";
0e07810550c8 mod_storage_mongodb: Use _global as host when none provided
James Callahan <james@chatid.com>
parents: 505
diff changeset
    35
	local store = self.store;
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    36
507
46f578da4ff0 mod_storage_mongodb: assert the configuration options
James Callahan <james@chatid.com>
parents: 506
diff changeset
    37
	-- The database name can't have a period in it (hence it can't be a host/ip)
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    38
	local namespace = params.dbname .. "." .. host;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    39
	local v = { _id = { store = store ; username = username } };
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    40
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    41
	if next(data) ~= nil then -- set data
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    42
		v.data = data;
1010
fd420237a5e4 mod_storage_mongodb: Use util.json to encode our data (handles non-string table keys, etc).
Waqas Hussain <waqas20@gmail.com>
parents: 813
diff changeset
    43
		return conn:insert ( namespace , json.encode(v) );
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    44
	else -- delete data
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    45
		return conn:remove ( namespace , v );
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    46
	end;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    47
end
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    48
813
2469f779b3f7 mod_storage_*: Update to use module:provides().
Waqas Hussain <waqas20@gmail.com>
parents: 509
diff changeset
    49
local driver = {};
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    50
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    51
function driver:open(store, typ)
508
9831506dcfd6 mod_storage_mongodb: move database connecting to inside driver:open
James Callahan <james@chatid.com>
parents: 507
diff changeset
    52
	if not conn then
9831506dcfd6 mod_storage_mongodb: move database connecting to inside driver:open
James Callahan <james@chatid.com>
parents: 507
diff changeset
    53
		conn = assert ( mongo.Connection.New ( true ) );
9831506dcfd6 mod_storage_mongodb: move database connecting to inside driver:open
James Callahan <james@chatid.com>
parents: 507
diff changeset
    54
		assert ( conn:connect ( params.server ) );
509
bf2ad6d6c778 mod_storage_mongodb: (un)lock globals around require; only auth if we need to
James Callahan <james@chatid.com>
parents: 508
diff changeset
    55
		if params.username then
bf2ad6d6c778 mod_storage_mongodb: (un)lock globals around require; only auth if we need to
James Callahan <james@chatid.com>
parents: 508
diff changeset
    56
			assert ( conn:auth ( params ) );
bf2ad6d6c778 mod_storage_mongodb: (un)lock globals around require; only auth if we need to
James Callahan <james@chatid.com>
parents: 508
diff changeset
    57
		end
508
9831506dcfd6 mod_storage_mongodb: move database connecting to inside driver:open
James Callahan <james@chatid.com>
parents: 507
diff changeset
    58
	end
9831506dcfd6 mod_storage_mongodb: move database connecting to inside driver:open
James Callahan <james@chatid.com>
parents: 507
diff changeset
    59
504
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    60
	if not typ then -- default key-value store
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    61
		return setmetatable({ store = store }, keyval_store);
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    62
	end;
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    63
	return nil, "unsupported-store";
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    64
end
0e9b43db7a2c mod_storage_mondodb: Add module
James Callahan <james@chatid.com>
parents:
diff changeset
    65
813
2469f779b3f7 mod_storage_*: Update to use module:provides().
Waqas Hussain <waqas20@gmail.com>
parents: 509
diff changeset
    66
module:provides("storage", driver);