From 8ba3a53320c85fd5ab8a34fe64d1fb03c29b66b6 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Wed, 2 Sep 2026 15:52:56 +0200 Subject: [PATCH] MT#65662 Add support for loading based on prefs group (subscribers) Add support of loading based on the name of the preferences group (e.g. "Media Codec Transcoding Options") For that to work extend functionality on levels of: - root of the framework (NGCP) - peers prefrences handling (NGCPPrefs) - real preferences handling (NGCPRealPrefs) Then in the kamailio script use it like: lua_run("ngcp_caller_usr_load_group", "$avp(s:caller_uuid)", "Media Codec Transcoding Options") This is on the same manner as done previously here: 4661e5c30658b5ec Change-Id: If1dba6e90fb76308f323779afb0499c96f3c6f38 (cherry picked from commit cf94e2c5bbe0381904b43ff6fb0f14fd0f058ccb) --- ngcp/ngcp.lua | 12 ++++++++++ ngcp/pref.lua | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ ngcp/rp.lua | 8 +++++++ 3 files changed, 84 insertions(+) diff --git a/ngcp/ngcp.lua b/ngcp/ngcp.lua index aa2b6c0..2bdb459 100644 --- a/ngcp/ngcp.lua +++ b/ngcp/ngcp.lua @@ -127,6 +127,12 @@ function NGCP:caller_usr_load(uuid, domain) return unique_keys end +function NGCP:caller_load_group(uuid, group_name) + local keys = self.prefs.usr:caller_load_group(uuid, group_name) + self.prefs.real:caller_usr_load_group(keys) + return keys +end + function NGCP:callee_usr_load(uuid, domain) local keys = { domain = self.prefs.dom:callee_load(domain), @@ -143,6 +149,12 @@ function NGCP:callee_usr_load(uuid, domain) return unique_keys end +function NGCP:callee_load_group(uuid, group_name) + local keys = self.prefs.usr:callee_load_group(uuid, group_name) + self.prefs.real:callee_usr_load_group(keys) + return keys +end + function NGCP:log_pref(level, vtype) local xavp,xavp_log local msg = "%s:%s\n" diff --git a/ngcp/pref.lua b/ngcp/pref.lua index b839a9e..56e3481 100644 --- a/ngcp/pref.lua +++ b/ngcp/pref.lua @@ -26,6 +26,18 @@ local NGCPPrefs = utils.inheritsFrom() NGCPPrefs.__class__ = 'NGCPPrefs' NGCPPrefs.levels = {"caller", "callee"} NGCPPrefs.query_blob = "SELECT * FROM provisioning.voip_%s_blob WHERE id = %s" +NGCPPrefs.select_id_query = + "SELECT id FROM provisioning.voip_preference_groups WHERE name = '%s'" +NGCPPrefs.group_query = [[ +SELECT prefs.* + FROM %s AS prefs + JOIN provisioning.voip_preferences AS vp + ON vp.attribute = prefs.attribute + JOIN provisioning.voip_preference_groups AS vpg + ON vpg.id = vp.voip_preference_groups_id + WHERE prefs.uuid = '%s' AND vpg.id = %s + ORDER BY prefs.id DESC +]] function NGCPPrefs.__tostring(self) local output, msg = '', "%s_%s:%s\n" @@ -131,6 +143,58 @@ function NGCPPrefs:_load(level, uuid) return self:_set_xavp(level, cur, query) end +function NGCPPrefs:get_pref_group_id(name) + local con = assert(self.config:getDBConnection()) + local query = self.select_id_query:format(name) + local cur = assert(con:execute(query)) + local row = cur:fetch({}, "a") + cur:close() + + if row and row.id then + return tonumber(row.id) + end + + KSR.err(string.format("[NGCP] preference group '%s' not found\n", name)) + return nil +end + +function NGCPPrefs:load_group(level, uuid, group_id) + if not uuid or uuid == '' then + return {} + end + if not self.group_query then + error(string.format("no group query for prefs:%s", self.group)) + end + + local con = assert(self.config:getDBConnection()) + local query = self.group_query:format(self.db_table, uuid, group_id) + local cur = assert(con:execute(query)) + + return self:_set_xavp(level, cur, query) +end + +function NGCPPrefs:caller_load_group(uuid, name) + local group_id = self:get_pref_group_id(name) + if not group_id then + KSR.err(string.format("[NGCP] Cannot load group '%s', skipping\n", + name)) + return {} + end + + return self:load_group("caller", uuid, group_id) +end + +function NGCPPrefs:callee_load_group(uuid, name) + local group_id = self:get_pref_group_id(name) + if not group_id then + KSR.err(string.format("[NGCP] Cannot load group '%s', skipping\n", + name)) + return {} + end + + return self:load_group("callee", uuid, group_id) +end + function NGCPPrefs:caller_load(uuid) if not uuid or uuid == '' then return {} diff --git a/ngcp/rp.lua b/ngcp/rp.lua index 3c3fa7a..d426978 100644 --- a/ngcp/rp.lua +++ b/ngcp/rp.lua @@ -71,6 +71,14 @@ function NGCPRealPrefs:callee_peer_load_group(keys) return self:_peer_load("callee", keys) end +function NGCPRealPrefs:caller_usr_load_group(keys) + return self:_usr_load("caller", keys) +end + +function NGCPRealPrefs:callee_usr_load_group(keys) + return self:_usr_load("callee", keys) +end + function NGCPRealPrefs:caller_usr_load(keys) return self:_usr_load("caller", keys) end