aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2023-01-30 00:38:26 +0100
committerKim Alvefur <zash@zash.se>2023-01-30 00:38:26 +0100
commit0147b972e079bffb40160041de78ec50c5a1bdba (patch)
tree5ef5ca70fd4f51dcfc2ec6c2036868bca8d714e4
parentdc958f1e40eef23f6aed6eba17c30f3b880b3c08 (diff)
downloadprosody-0147b972e079bffb40160041de78ec50c5a1bdba.tar.gz
prosody-0147b972e079bffb40160041de78ec50c5a1bdba.zip
mod_storage_sql: Record connection to database as module status
Allows retrieving this in e.g. a health reporting module Thanks pfak
-rw-r--r--plugins/mod_storage_sql.lua6
-rw-r--r--util/sql.lua8
-rw-r--r--util/sqlite3.lua8
3 files changed, 18 insertions, 4 deletions
diff --git a/plugins/mod_storage_sql.lua b/plugins/mod_storage_sql.lua
index 45fda70d..824bcf14 100644
--- a/plugins/mod_storage_sql.lua
+++ b/plugins/mod_storage_sql.lua
@@ -840,6 +840,7 @@ function module.load()
engine = engines[db_uri];
if not engine then
module:log("debug", "Creating new engine %s", db_uri);
+ module:log_status("debug", "Creating new engine for "..params.driver);
engine = sql:create_engine(params, function (engine) -- luacheck: ignore 431/engine
if module:get_option("sql_manage_tables", true) then
-- Automatically create table, ignore failure (table probably already exists)
@@ -858,8 +859,13 @@ function module.load()
end
end
end
+ module:set_status("info", "Connected to " .. engine.params.driver);
+ end, function (engine)
+ module:set_status("error", "Disconnected from " .. engine.params.driver);
end);
engines[sql.db2uri(params)] = engine;
+ else
+ module:set_status("info", "Using existing engine");
end
module:provides("storage", driver);
diff --git a/util/sql.lua b/util/sql.lua
index 9d1c86ca..623d4ed4 100644
--- a/util/sql.lua
+++ b/util/sql.lua
@@ -99,6 +99,9 @@ end
function engine:onconnect() -- luacheck: ignore 212/self
-- Override from create_engine()
end
+function engine:ondisconnect() -- luacheck: ignore 212/self
+ -- Override from create_engine()
+end
function engine:prepquery(sql)
if self.params.driver == "MySQL" then
@@ -224,6 +227,7 @@ function engine:transaction(...)
if not conn or not conn:ping() then
log("debug", "Database connection was closed. Will reconnect and retry.");
self.conn = nil;
+ self:ondisconnect();
log("debug", "Retrying SQL transaction [%s]", (...));
ok, ret, b, c = self:_transaction(...);
log("debug", "SQL transaction retry %s", ok and "succeeded" or "failed");
@@ -365,8 +369,8 @@ local function db2uri(params)
};
end
-local function create_engine(_, params, onconnect)
- return setmetatable({ url = db2uri(params), params = params, onconnect = onconnect }, engine_mt);
+local function create_engine(_, params, onconnect, ondisconnect)
+ return setmetatable({ url = db2uri(params); params = params; onconnect = onconnect; ondisconnect = ondisconnect }, engine_mt);
end
return {
diff --git a/util/sqlite3.lua b/util/sqlite3.lua
index 4caf121a..dce45e13 100644
--- a/util/sqlite3.lua
+++ b/util/sqlite3.lua
@@ -159,6 +159,9 @@ end
function engine:onconnect()
-- Override from create_engine()
end
+function engine:ondisconnect() -- luacheck: ignore 212/self
+ -- Override from create_engine()
+end
function engine:execute(sql, ...)
local success, err = self:connect();
if not success then return success, err; end
@@ -322,6 +325,7 @@ function engine:transaction(...)
local conn = self.conn;
if not conn or not conn:isopen() then
self.conn = nil;
+ self:ondisconnect();
ok, ret = self:_transaction(...);
end
end
@@ -389,9 +393,9 @@ local function db2uri(params)
};
end
-local function create_engine(_, params, onconnect)
+local function create_engine(_, params, onconnect, ondisconnect)
assert(params.driver == "SQLite3", "Only SQLite3 is supported without LuaDBI");
- return setmetatable({ url = db2uri(params), params = params, onconnect = onconnect }, engine_mt);
+ return setmetatable({ url = db2uri(params); params = params; onconnect = onconnect; ondisconnect = ondisconnect }, engine_mt);
end
return {