Skip to content
Snippets Groups Projects
Commit 41fbe44e authored by Ruud Overeem's avatar Ruud Overeem
Browse files

BugID: 465

Added functionality to the solveVHparam functions to handle the array indicatior
([]). When a reference and in [] the size of the referenced array is returned.
When an [] is used somewhere in the reference name that array is treated as a
reference array.
E.g. VirtInstrument.stationlist = [ RS001, RS002, CS020 CS021 ]
	 StationIPlist = >>VirtInstrument.stationlist[].IPaddress
will fill the StationIPlist variable with the IPaddress of the stations in the
VI.stationlist.
parent e1e75ae7
Branches
Tags
No related merge requests found
...@@ -42,32 +42,79 @@ CREATE OR REPLACE FUNCTION resolveVHparam(INT4, TEXT) ...@@ -42,32 +42,79 @@ CREATE OR REPLACE FUNCTION resolveVHparam(INT4, TEXT)
vNodeName VARCHAR(200); vNodeName VARCHAR(200);
vParamName VARCHAR(200); vParamName VARCHAR(200);
vRemainder VARCHAR(200); vRemainder VARCHAR(200);
vOrgArray VARCHAR(200);
vElem VARCHAR(100);
vAnswer TEXT;
vIsArray BOOLEAN;
vSize INTEGER;
vRecord RECORD; vRecord RECORD;
BEGIN BEGIN
--RAISE WARNING \'resolveVHparam(%,%)\', $1, $2; vDotpos := strpos($2, \'.\'); -- >>a.b.c or <<a
vDotpos := strpos($2, \'.\'); IF vDotpos < 1 THEN
vNodeName := substr($2, 3, vDotpos-3); RETURN $2;
vParamName := substr($2, vDotpos+1); END IF;
vNodeName := substr($2, 3, vDotpos-3); -- a
vParamName := substr($2, vDotpos+1); -- b.c
vDotpos := strpos(vParamName, \'.\'); vDotpos := strpos(vParamName, \'.\');
IF vDotpos > 0 THEN IF vDotpos > 0 THEN
vRemainder := substr(vParamName, vDotPos); vRemainder := substr(vParamName, vDotPos); -- .c
vParamName := substr(vParamName, 1, vDotPos-1); vParamName := substr(vParamName, 1, vDotPos-1); -- b
ELSE ELSE
vRemainder := \'\'; vRemainder := \'\';
END IF; END IF;
--RAISE WARNING \'resolveVHparam: % : % : %\', vNodeName, vParamName, vRemainder; -- does paramname end in [] ?
IF rtrim(vParamName, \'[]\') != vParamName THEN
vIsArray := true;
vParamName := rtrim(vParamName, \'[]\');
ELSE
vIsArray := false;
END IF;
-- Get parameter definition
SELECT * SELECT *
INTO vRecord INTO vRecord
FROM getVICNodeDef ($1, vNodeName, vParamName); FROM getVICNodeDef ($1, vNodeName, vParamName);
IF NOT FOUND THEN
RAISE EXCEPTION \'Parameter % from Node % not found\', vNodeName, vParamName;
END IF;
IF vIsArray THEN
IF vRemainder = \'\' THEN
-- calc size of array
RETURN calcArraySize(vRecord.limits);
ELSE
-- reference array
-- create an array with same size as current vRecord.limits array
-- while rereferencing the elements of the vRecord.limits array.
vAnswer := \'[\';
vOrgArray := btrim(vRecord.limits, \'[] \');
vSize := calcArraySize(vRecord.limits);
FOR i IN 1..vSize LOOP
-- get clean name of element
vElem := btrim(split_part(vOrgArray, \',\', i), \' \');
-- make sure it begins with <<
IF substr(vElem,1,2) != \'<<\' THEN
vElem := \'<<\' || vElem;
END IF;
-- resolve value
vElem := resolveVHparam($1, vElem || vRemainder);
-- add to array
vAnswer := vAnswer || vElem || \',\';
END LOOP;
-- finish array and return result.
vAnswer := rtrim(vAnswer, \',\') || \']\';
RETURN vAnswer;
END IF;
ELSE
IF vRemainder = \'\' THEN IF vRemainder = \'\' THEN
RETURN vRecord.limits; RETURN vRecord.limits;
ELSE ELSE
vRecord.limits := vRecord.limits || vRemainder; vRecord.limits := vRecord.limits || vRemainder;
RETURN resolveVHparam($1, vRecord.limits); RETURN resolveVHparam($1, vRecord.limits);
END IF; END IF;
END IF;
END; END;
' LANGUAGE plpgsql; ' LANGUAGE plpgsql;
......
...@@ -210,3 +210,31 @@ CREATE OR REPLACE FUNCTION isReference(TEXT) ...@@ -210,3 +210,31 @@ CREATE OR REPLACE FUNCTION isReference(TEXT)
END; END;
' LANGUAGE plpgsql IMMUTABLE; ' LANGUAGE plpgsql IMMUTABLE;
--
-- calcArraySize (arraystring)
--
-- Authorisation: n/a
--
-- Tables: none
--
-- Types: none
--
CREATE OR REPLACE FUNCTION calcArraySize(TEXT)
RETURNS TEXT AS '
DECLARE
vSize INTEGER;
vArray TEXT;
BEGIN
vArray := ltrim($1,\'[ \');
vArray := rtrim(vArray,\'] \');
vSize := 0;
WHILE length(vArray) > 0 LOOP
-- remove element
vArray := ltrim(vArray, \'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ "[]{}+%<>.\');
vSize := vSize + 1; -- count element
vArray := ltrim(vArray, \',\'); -- strip comma
END LOOP;
RETURN vSize;
END;
' LANGUAGE plpgsql IMMUTABLE;
...@@ -138,6 +138,17 @@ par systemClock I dbl MHz 0 0 200 - 'systemclock' ...@@ -138,6 +138,17 @@ par systemClock I dbl MHz 0 0 200 - 'systemclock'
par channelWidth I dbl Hz 0 0 762.939453125 - 'width of the channels' par channelWidth I dbl Hz 0 0 762.939453125 - 'width of the channels'
par subbandWidth I dbl kHz 0 0 195.3125 - 'width of the 512 subbands' par subbandWidth I dbl kHz 0 0 195.3125 - 'width of the 512 subbands'
# -- Clock160 --
# name vers qual constr. descr.
#------------------------------------------------------------------------------
node Clock160 1.0.0 test 'node constraint' '160 MHz clock'
# name dir. type unit prun. vm value constr. descr.
#------------------------------------------------------------------------------
par systemClock I dbl MHz 0 0 160 - 'systemclock'
par channelWidth I dbl Hz 0 0 610.3515625 - 'width of the channels'
par subbandWidth I dbl kHz 0 0 156.25 - 'width of the 512 subbands'
# -- Observation -- # -- Observation --
# name vers qual constr. descr. # name vers qual constr. descr.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
...@@ -164,5 +175,6 @@ node TopNode 1.0.0 test 'node constraint' 'Toplevel node' ...@@ -164,5 +175,6 @@ node TopNode 1.0.0 test 'node constraint' 'Toplevel node'
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
uses 'Observation' 1.0.0 test 0..1 "x" uses 'Observation' 1.0.0 test 0..1 "x"
uses 'Clock200' 1.0.0 test 1 "x" uses 'Clock200' 1.0.0 test 1 "x"
uses 'Clock160' 1.0.0 test 1 "x"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment