diff --git a/ngcp/rp.lua b/ngcp/rp.lua index e5fd1eb..59a604d 100644 --- a/ngcp/rp.lua +++ b/ngcp/rp.lua @@ -63,40 +63,48 @@ NGCPRealPrefs_MT.__tostring = function () local xavp = { peer = NGCPPeerPrefs:xavp(level), } - local real_keys = {} - local value + local peer_values = {} + local values = sr.xavp.get(xavp.peer.name, 0, 0) for _,v in pairs(keys) do - value = xavp.peer(v) + local value = values[v] if value then - table.add(real_keys, v) + peer_values[v] = value end end - return real_keys + local peer_keys = {} + for k,v in pairs(peer_values) do + table.insert(peer_keys, k) + xavp.peer(k, v) + end + return peer_keys end function NGCPRealPrefs:_usr_load(level, keys) - local _,v + local _,v,k local xavp = { - real = NGCPRealPrefs:xavp(level), + real = NGCPRealPrefs:xavp(level), dom = NGCPDomainPrefs:xavp(level), usr = NGCPUserPrefs:xavp(level) } - local real_keys = {} - local value + local real_values = {} + local dom_values = sr.xavp.get(xavp.dom.name, 0, 0) + local usr_values = sr.xavp.get(xavp.usr.name, 0, 0) for _,v in pairs(keys) do - value = xavp.usr(v) + local value = usr_values[v] if not value then - value = xavp.dom(v) - --sr.log("info", string.format("key:%s value:%s from domain", v, value)) + value = dom_values[v] end if value then - table.add(real_keys, v) - --sr.log("info", string.format("key:%s value:%s", v, value)) - xavp.real(v, value) + real_values[v] = value else sr.log("err", string.format("key:%s not in user or domain", v)) end end + local real_keys = {} + for k,v in pairs(real_values) do + table.insert(real_keys, k) + xavp.real(k, v) + end return real_keys end diff --git a/ngcp/xavp.lua b/ngcp/xavp.lua index f02eedf..b761b8a 100644 --- a/ngcp/xavp.lua +++ b/ngcp/xavp.lua @@ -38,12 +38,25 @@ NGCPXAvp_MT = { return sr.pv.get(id) elseif type(value) == "number" then table.add(t.keys, key) - sr.log("dbg", string.format("seti: [%s]:%d", id, value)) + --sr.log("dbg", string.format("seti: [%s]:%d", id, value)) sr.pv.seti(id, value) elseif type(value) == "string" then table.add(t.keys, key) - sr.log("dbg", string.format("sets: [%s]:%s", id, value)) + --sr.log("dbg", string.format("sets: [%s]:%s", id, value)) sr.pv.sets(id, value) + elseif type(value) == "table" then + table.add(t.keys, key) + local i, v + for i = #value, 1, -1 do + v = value[i] + if type(v) == "number" then + sr.pv.seti(id, v) + elseif type(v) == "string" then + sr.pv.sets(id, v) + else + error("unknown type: %s", type(v)) + end + end else error("value is not a number or string") end diff --git a/tests/ngcp_rp.lua b/tests/ngcp_rp.lua index aecca33..0080d54 100644 --- a/tests/ngcp_rp.lua +++ b/tests/ngcp_rp.lua @@ -130,7 +130,7 @@ TestNGCPRealPrefs = {} --class xavp.user("dos",2) assertEquals(sr.pv.get("$xavp(caller_usr_prefs=>dos)"),2) local real_keys = self.real:caller_usr_load(keys) - assertEquals(real_keys, keys) + assertItemsEquals(real_keys, keys) assertEquals(xavp.real("uno"),1) assertEquals(xavp.real("dos"),2) end @@ -163,7 +163,7 @@ TestNGCPRealPrefs = {} --class xavp.user("dos",2) assertEquals(sr.pv.get("$xavp(callee_usr_prefs=>dos)"),2) local real_keys = self.real:callee_usr_load(keys) - assertEquals(real_keys, keys) + assertItemsEquals(real_keys, keys) assertEquals(xavp.real("uno"),1) assertEquals(xavp.real("dos"),2) end