JMessmer
March 20th, 2024, 15:51
I was just developing a registry for managing Crossreferences of dbnodes within a dedicated manager when I stumbed upon this bug that using
DB.setValue(targetNode, "number", 20)
does not work while
DB.setValue(DB.getPath(targetNode), "number", 20)
does.
According to the API ref:
function setValue(sourcenode, [subpath], type, value)
sourcenode (string (or databasenode))
A data node identifier path (or a databasenode object) representing the target node
both options should be possible!
Example:
_tHandlerRegistry = {};
function onClose()
local sFuncName = "onClose";
DebugManager.printLogMessage2(sScriptName, sFuncName);
if _tHandlerRegistry then
for k, v in pairs(_tHandlerRegistry) do
DB.removeHandler(DB.getPath(k), v["action"], handleUpdate);
end
end
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende");
end
function addLinkHandler(originalNode, targetNode, sAction, func)
local sFuncName = "addLinkHandler";
DebugManager.printLogMessage2(sScriptName, sFuncName);
if not originalNode or not targetNode then
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende mit nil");
return;
end
if originalNode.getType() ~= targetNode.getType() then
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende mit inkompatiblen Datentypen");
return;
end
_tHandlerRegistry[originalNode] = {target = targetNode, action = sAction, funcRef = func};
DB.addHandler(DB.getPath(originalNode), sAction, handleUpdate);
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende");
end
function handleUpdate(source)
local sFuncName = "handleUpdate";
DebugManager.printLogMessage2(sScriptName, sFuncName);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "source: ", source);
registryEntry = _tHandlerRegistry[source];
DebugManager.printDebugMessage2(sScriptName, sFuncName, "registryEntry: ", registryEntry);
registryEntry["funcRef"](source, registryEntry["target"]);
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende");
end
function updateLanguageList(source, target)
local sFuncName = "updateLanguageList";
DebugManager.printLogMessage2(sScriptName, sFuncName);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "source: ", source);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "target: ", target);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "source.getType(): ", source.getType());
DebugManager.printDebugMessage2(sScriptName, sFuncName, "target.getType(): ", target.getType());
local sTargetDataType = target.getType();
local sourceValue = DB.getValue(source);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "sTargetDataType: ", sTargetDataType);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "sourceValue: ", sourceValue);
DB.setValue(target.getParent(), "wert", "number", 20);
DB.setValue(DB.getPath(target), sTargetDataType, sourceValue); -- this one works!
DB.setValue(target, sTargetDataType, sourceValue); -- this one does not!!
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende");
end
...
function testfunction()
self.addLinkHandler(languageTalentNode.getChild("talentwert"), langListNode.getChild(LanguageManagerDSA.CAMPAIGN_ LANGUAGE_LIST_VALUE), "onUpdate", updateLanguageList)
end
Debugging output:
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, handleUpdate'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, handleUpdate, source: ' | databasenode = { charsheet.id-00003.skilllist.sprechen.id-00001.talentwert }
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, handleUpdate, registryEntry: ' | { s'target' = databasenode = { charsheet.id-00003.languagelist.id-00003.wert }, s'action' = s'onUpdate', s'funcRef' = fn }
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, source: ' | databasenode = { charsheet.id-00003.skilllist.sprechen.id-00001.talentwert }
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, target: ' | databasenode = { charsheet.id-00003.languagelist.id-00003.wert }
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, source.getType(): ' | s'number'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, target.getType(): ' | s'number'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, sTargetDataType: ' | s'number'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, sourceValue: ' | #10
[3/20/2024 2:05:48 PM] [ERROR] Handler error: [string "DSA_DZ_4.1:scripts/manager_talent_DSA.lua"]:305: setValue: Invalid data type parameter
DB.setValue(targetNode, "number", 20)
does not work while
DB.setValue(DB.getPath(targetNode), "number", 20)
does.
According to the API ref:
function setValue(sourcenode, [subpath], type, value)
sourcenode (string (or databasenode))
A data node identifier path (or a databasenode object) representing the target node
both options should be possible!
Example:
_tHandlerRegistry = {};
function onClose()
local sFuncName = "onClose";
DebugManager.printLogMessage2(sScriptName, sFuncName);
if _tHandlerRegistry then
for k, v in pairs(_tHandlerRegistry) do
DB.removeHandler(DB.getPath(k), v["action"], handleUpdate);
end
end
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende");
end
function addLinkHandler(originalNode, targetNode, sAction, func)
local sFuncName = "addLinkHandler";
DebugManager.printLogMessage2(sScriptName, sFuncName);
if not originalNode or not targetNode then
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende mit nil");
return;
end
if originalNode.getType() ~= targetNode.getType() then
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende mit inkompatiblen Datentypen");
return;
end
_tHandlerRegistry[originalNode] = {target = targetNode, action = sAction, funcRef = func};
DB.addHandler(DB.getPath(originalNode), sAction, handleUpdate);
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende");
end
function handleUpdate(source)
local sFuncName = "handleUpdate";
DebugManager.printLogMessage2(sScriptName, sFuncName);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "source: ", source);
registryEntry = _tHandlerRegistry[source];
DebugManager.printDebugMessage2(sScriptName, sFuncName, "registryEntry: ", registryEntry);
registryEntry["funcRef"](source, registryEntry["target"]);
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende");
end
function updateLanguageList(source, target)
local sFuncName = "updateLanguageList";
DebugManager.printLogMessage2(sScriptName, sFuncName);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "source: ", source);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "target: ", target);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "source.getType(): ", source.getType());
DebugManager.printDebugMessage2(sScriptName, sFuncName, "target.getType(): ", target.getType());
local sTargetDataType = target.getType();
local sourceValue = DB.getValue(source);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "sTargetDataType: ", sTargetDataType);
DebugManager.printDebugMessage2(sScriptName, sFuncName, "sourceValue: ", sourceValue);
DB.setValue(target.getParent(), "wert", "number", 20);
DB.setValue(DB.getPath(target), sTargetDataType, sourceValue); -- this one works!
DB.setValue(target, sTargetDataType, sourceValue); -- this one does not!!
DebugManager.printLogMessage2(sScriptName, sFuncName, "Ende");
end
...
function testfunction()
self.addLinkHandler(languageTalentNode.getChild("talentwert"), langListNode.getChild(LanguageManagerDSA.CAMPAIGN_ LANGUAGE_LIST_VALUE), "onUpdate", updateLanguageList)
end
Debugging output:
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, handleUpdate'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, handleUpdate, source: ' | databasenode = { charsheet.id-00003.skilllist.sprechen.id-00001.talentwert }
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, handleUpdate, registryEntry: ' | { s'target' = databasenode = { charsheet.id-00003.languagelist.id-00003.wert }, s'action' = s'onUpdate', s'funcRef' = fn }
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, source: ' | databasenode = { charsheet.id-00003.skilllist.sprechen.id-00001.talentwert }
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, target: ' | databasenode = { charsheet.id-00003.languagelist.id-00003.wert }
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, source.getType(): ' | s'number'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, target.getType(): ' | s'number'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, sTargetDataType: ' | s'number'
[3/20/2024 2:05:48 PM] s'gm | scripts/manager_talent_DSA.lua, updateLanguageList, sourceValue: ' | #10
[3/20/2024 2:05:48 PM] [ERROR] Handler error: [string "DSA_DZ_4.1:scripts/manager_talent_DSA.lua"]:305: setValue: Invalid data type parameter