From c4baca477b74e73f20bc748002abe3aec76e782d Mon Sep 17 00:00:00 2001 From: munja Date: Fri, 1 Apr 2022 16:56:49 +0100 Subject: [PATCH 1/2] fix: removing LUA dependency from mv_webout to enable Viya 4 compatibility --- all.sas | 142 ++++++++++-------------------- sasjs/sasjsconfig.json | 8 +- tests/viyaonly/mv_webout.test.sas | 22 ++++- viya/mv_createwebservice.sas | 71 +++++---------- viya/mv_webout.sas | 71 +++++---------- 5 files changed, 113 insertions(+), 201 deletions(-) diff --git a/all.sas b/all.sas index d706dc5..aa7d526 100644 --- a/all.sas +++ b/all.sas @@ -20497,7 +20497,7 @@ data _null_; put ' sasjs_tables SYS_JES_JOB_URI; '; put '%if %index("&_debug",log) %then %let _debug=131; '; put ' '; - put '%local i tempds; '; + put '%local i tempds table; '; put '%let action=%upcase(&action); '; put ' '; put '%if &action=FETCH %then %do; '; @@ -20512,60 +20512,35 @@ data _null_; put ' %end; '; put ' '; put ' /* if the sasjs_tables param is passed, we expect param based upload */ '; - put ' %if %length(&sasjs_tables.XX)>2 %then %do; '; - put ' filename _sasjs "%sysfunc(pathname(work))/sasjs.lua"; '; - put ' data _null_; '; - put ' file _sasjs; '; - put ' put ''s=sas.symget("sasjs_tables")''; '; - put ' put ''if(s:sub(1,7) == "%nrstr(")''; '; - put ' put ''then''; '; - put ' put '' tablist=s:sub(8,s:len()-1)''; '; - put ' put ''else''; '; - put ' put '' tablist=s''; '; - put ' put ''end''; '; - put ' put ''for i = 1,sas.countw(tablist) ''; '; - put ' put ''do ''; '; - put ' put '' tab=sas.scan(tablist,i)''; '; - put ' put '' sasdata=""''; '; - put ' put '' if (sas.symexist("sasjs"..i.."data0")==0)''; '; - put ' put '' then''; '; - put ' /* TODO - condense this logic */ '; - put ' put '' s=sas.symget("sasjs"..i.."data")''; '; - put ' put '' if(s:sub(1,7) == "%nrstr(")''; '; - put ' put '' then''; '; - put ' put '' sasdata=s:sub(8,s:len()-1)''; '; - put ' put '' else''; '; - put ' put '' sasdata=s''; '; - put ' put '' end''; '; - put ' put '' else''; '; - put ' put '' for d = 1, sas.symget("sasjs"..i.."data0")''; '; - put ' put '' do''; '; - put ' put '' s=sas.symget("sasjs"..i.."data"..d)''; '; - put ' put '' if(s:sub(1,7) == "%nrstr(")''; '; - put ' put '' then''; '; - put ' put '' sasdata=sasdata..s:sub(8,s:len()-1)''; '; - put ' put '' else''; '; - put ' put '' sasdata=sasdata..s''; '; - put ' put '' end''; '; - put ' put '' end''; '; - put ' put '' end''; '; - put ' put '' file = io.open(sas.pathname("work").."/"..tab..".csv", "a")''; '; - put ' put '' io.output(file)''; '; - put ' put '' io.write(sasdata)''; '; - put ' put '' io.close(file)''; '; - put ' put ''end''; '; - put ' run; '; - put ' %inc _sasjs; '; + put ' %if %length(&sasjs_tables.X)>1 %then %do; '; put ' '; - put ' /* now read in the data */ '; + put ' /* convert data from macro variables to datasets */ '; put ' %do i=1 %to %sysfunc(countw(&sasjs_tables)); '; - put ' %local table; %let table=%scan(&sasjs_tables,&i); '; + put ' %let table=%scan(&sasjs_tables,&i,%str( )); '; + put ' %if %symexist(sasjs&i.data0)=0 %then %let sasjs&i.data0=1; '; + put ' data _null_; '; + put ' file "%sysfunc(pathname(work))/&table..csv" recfm=n; '; + put ' retain nrflg 0; '; + put ' length line $32767; '; + put ' do i=1 to &&sasjs&i.data0; '; + put ' if &&sasjs&i.data0=1 then line=symget("sasjs&i.data"); '; + put ' else line=symget(cats("sasjs&i.data",i)); '; + put ' if i=1 and substr(line,1,7)=''%nrstr('' then do; '; + put ' nrflg=1; '; + put ' line=substr(line,8); '; + put ' end; '; + put ' if i=&&sasjs&i.data0 and nrflg=1 then do; '; + put ' line=substr(line,1,length(line)-1); '; + put ' end; '; + put ' put line +(-1) @; '; + put ' end; '; + put ' run; '; put ' data _null_; '; put ' infile "%sysfunc(pathname(work))/&table..csv" termstr=crlf ; '; put ' input; '; put ' if _n_=1 then call symputx(''input_statement'',_infile_); '; put ' list; '; - put ' data &table; '; + put ' data work.&table; '; put ' infile "%sysfunc(pathname(work))/&table..csv" firstobs=2 dsd '; put ' termstr=crlf; '; put ' input &input_statement; '; @@ -24329,7 +24304,7 @@ filename &fref1 clear; sasjs_tables SYS_JES_JOB_URI; %if %index("&_debug",log) %then %let _debug=131; -%local i tempds; +%local i tempds table; %let action=%upcase(&action); %if &action=FETCH %then %do; @@ -24344,60 +24319,35 @@ filename &fref1 clear; %end; /* if the sasjs_tables param is passed, we expect param based upload */ - %if %length(&sasjs_tables.XX)>2 %then %do; - filename _sasjs "%sysfunc(pathname(work))/sasjs.lua"; - data _null_; - file _sasjs; - put 's=sas.symget("sasjs_tables")'; - put 'if(s:sub(1,7) == "%nrstr(")'; - put 'then'; - put ' tablist=s:sub(8,s:len()-1)'; - put 'else'; - put ' tablist=s'; - put 'end'; - put 'for i = 1,sas.countw(tablist) '; - put 'do '; - put ' tab=sas.scan(tablist,i)'; - put ' sasdata=""'; - put ' if (sas.symexist("sasjs"..i.."data0")==0)'; - put ' then'; - /* TODO - condense this logic */ - put ' s=sas.symget("sasjs"..i.."data")'; - put ' if(s:sub(1,7) == "%nrstr(")'; - put ' then'; - put ' sasdata=s:sub(8,s:len()-1)'; - put ' else'; - put ' sasdata=s'; - put ' end'; - put ' else'; - put ' for d = 1, sas.symget("sasjs"..i.."data0")'; - put ' do'; - put ' s=sas.symget("sasjs"..i.."data"..d)'; - put ' if(s:sub(1,7) == "%nrstr(")'; - put ' then'; - put ' sasdata=sasdata..s:sub(8,s:len()-1)'; - put ' else'; - put ' sasdata=sasdata..s'; - put ' end'; - put ' end'; - put ' end'; - put ' file = io.open(sas.pathname("work").."/"..tab..".csv", "a")'; - put ' io.output(file)'; - put ' io.write(sasdata)'; - put ' io.close(file)'; - put 'end'; - run; - %inc _sasjs; + %if %length(&sasjs_tables.X)>1 %then %do; - /* now read in the data */ + /* convert data from macro variables to datasets */ %do i=1 %to %sysfunc(countw(&sasjs_tables)); - %local table; %let table=%scan(&sasjs_tables,&i); + %let table=%scan(&sasjs_tables,&i,%str( )); + %if %symexist(sasjs&i.data0)=0 %then %let sasjs&i.data0=1; + data _null_; + file "%sysfunc(pathname(work))/&table..csv" recfm=n; + retain nrflg 0; + length line $32767; + do i=1 to &&sasjs&i.data0; + if &&sasjs&i.data0=1 then line=symget("sasjs&i.data"); + else line=symget(cats("sasjs&i.data",i)); + if i=1 and substr(line,1,7)='%nrstr(' then do; + nrflg=1; + line=substr(line,8); + end; + if i=&&sasjs&i.data0 and nrflg=1 then do; + line=substr(line,1,length(line)-1); + end; + put line +(-1) @; + end; + run; data _null_; infile "%sysfunc(pathname(work))/&table..csv" termstr=crlf ; input; if _n_=1 then call symputx('input_statement',_infile_); list; - data &table; + data work.&table; infile "%sysfunc(pathname(work))/&table..csv" firstobs=2 dsd termstr=crlf; input &input_statement; diff --git a/sasjs/sasjsconfig.json b/sasjs/sasjsconfig.json index a88f06c..27c72a6 100644 --- a/sasjs/sasjsconfig.json +++ b/sasjs/sasjsconfig.json @@ -39,12 +39,6 @@ "viya", "tests/viyaonly" ], - "programFolders": [], - "binaryFolders": [], - "deployConfig": { - "deployServicePack": true, - "deployScripts": [] - }, "contextName": "SAS Job Execution compute context" }, { @@ -71,7 +65,7 @@ }, { "name": "server", - "serverUrl": "https://sas.analytium.co.uk:5000", + "serverUrl": "", "serverType": "SASJS", "httpsAgentOptions": { "allowInsecureRequests": false diff --git a/tests/viyaonly/mv_webout.test.sas b/tests/viyaonly/mv_webout.test.sas index 2be9b3a..24ce20c 100644 --- a/tests/viyaonly/mv_webout.test.sas +++ b/tests/viyaonly/mv_webout.test.sas @@ -1,15 +1,33 @@ /** @file - @brief Testing mm_webout macro + @brief Testing mv_webout macro

SAS Macros

@li mf_getuniquefileref.sas @li mv_webout.sas @li mp_assert.sas + @li mp_assertdsobs.sas **/ +/* testing FETCHing (WEB approach) */ + +data _null_; + call symputx('sasjs1data','area:$char4.'!!'0d0a'x!!'Adak'); + call symputx('sasjs_tables','areas'); +run; +%put &=sasjs1data; + +%mv_webout(FETCH) + +%mp_assertdsobs(work.areas, + desc=Test input table has 1 row, + test=EQUALS 1, + outds=work.test_results +) + + %let fref=%mf_getuniquefileref(); %global _metaperson; data some datasets; @@ -38,4 +56,4 @@ run; %mp_assert( iftrue=(%str(&checkval)=%str(&sysvlong)), desc=Check if the sysvlong value was created -) \ No newline at end of file +) diff --git a/viya/mv_createwebservice.sas b/viya/mv_createwebservice.sas index fcb7abf..acbc844 100644 --- a/viya/mv_createwebservice.sas +++ b/viya/mv_createwebservice.sas @@ -461,7 +461,7 @@ data _null_; put ' sasjs_tables SYS_JES_JOB_URI; '; put '%if %index("&_debug",log) %then %let _debug=131; '; put ' '; - put '%local i tempds; '; + put '%local i tempds table; '; put '%let action=%upcase(&action); '; put ' '; put '%if &action=FETCH %then %do; '; @@ -476,60 +476,35 @@ data _null_; put ' %end; '; put ' '; put ' /* if the sasjs_tables param is passed, we expect param based upload */ '; - put ' %if %length(&sasjs_tables.XX)>2 %then %do; '; - put ' filename _sasjs "%sysfunc(pathname(work))/sasjs.lua"; '; - put ' data _null_; '; - put ' file _sasjs; '; - put ' put ''s=sas.symget("sasjs_tables")''; '; - put ' put ''if(s:sub(1,7) == "%nrstr(")''; '; - put ' put ''then''; '; - put ' put '' tablist=s:sub(8,s:len()-1)''; '; - put ' put ''else''; '; - put ' put '' tablist=s''; '; - put ' put ''end''; '; - put ' put ''for i = 1,sas.countw(tablist) ''; '; - put ' put ''do ''; '; - put ' put '' tab=sas.scan(tablist,i)''; '; - put ' put '' sasdata=""''; '; - put ' put '' if (sas.symexist("sasjs"..i.."data0")==0)''; '; - put ' put '' then''; '; - put ' /* TODO - condense this logic */ '; - put ' put '' s=sas.symget("sasjs"..i.."data")''; '; - put ' put '' if(s:sub(1,7) == "%nrstr(")''; '; - put ' put '' then''; '; - put ' put '' sasdata=s:sub(8,s:len()-1)''; '; - put ' put '' else''; '; - put ' put '' sasdata=s''; '; - put ' put '' end''; '; - put ' put '' else''; '; - put ' put '' for d = 1, sas.symget("sasjs"..i.."data0")''; '; - put ' put '' do''; '; - put ' put '' s=sas.symget("sasjs"..i.."data"..d)''; '; - put ' put '' if(s:sub(1,7) == "%nrstr(")''; '; - put ' put '' then''; '; - put ' put '' sasdata=sasdata..s:sub(8,s:len()-1)''; '; - put ' put '' else''; '; - put ' put '' sasdata=sasdata..s''; '; - put ' put '' end''; '; - put ' put '' end''; '; - put ' put '' end''; '; - put ' put '' file = io.open(sas.pathname("work").."/"..tab..".csv", "a")''; '; - put ' put '' io.output(file)''; '; - put ' put '' io.write(sasdata)''; '; - put ' put '' io.close(file)''; '; - put ' put ''end''; '; - put ' run; '; - put ' %inc _sasjs; '; + put ' %if %length(&sasjs_tables.X)>1 %then %do; '; put ' '; - put ' /* now read in the data */ '; + put ' /* convert data from macro variables to datasets */ '; put ' %do i=1 %to %sysfunc(countw(&sasjs_tables)); '; - put ' %local table; %let table=%scan(&sasjs_tables,&i); '; + put ' %let table=%scan(&sasjs_tables,&i,%str( )); '; + put ' %if %symexist(sasjs&i.data0)=0 %then %let sasjs&i.data0=1; '; + put ' data _null_; '; + put ' file "%sysfunc(pathname(work))/&table..csv" recfm=n; '; + put ' retain nrflg 0; '; + put ' length line $32767; '; + put ' do i=1 to &&sasjs&i.data0; '; + put ' if &&sasjs&i.data0=1 then line=symget("sasjs&i.data"); '; + put ' else line=symget(cats("sasjs&i.data",i)); '; + put ' if i=1 and substr(line,1,7)=''%nrstr('' then do; '; + put ' nrflg=1; '; + put ' line=substr(line,8); '; + put ' end; '; + put ' if i=&&sasjs&i.data0 and nrflg=1 then do; '; + put ' line=substr(line,1,length(line)-1); '; + put ' end; '; + put ' put line +(-1) @; '; + put ' end; '; + put ' run; '; put ' data _null_; '; put ' infile "%sysfunc(pathname(work))/&table..csv" termstr=crlf ; '; put ' input; '; put ' if _n_=1 then call symputx(''input_statement'',_infile_); '; put ' list; '; - put ' data &table; '; + put ' data work.&table; '; put ' infile "%sysfunc(pathname(work))/&table..csv" firstobs=2 dsd '; put ' termstr=crlf; '; put ' input &input_statement; '; diff --git a/viya/mv_webout.sas b/viya/mv_webout.sas index 7480b4d..20a81c9 100644 --- a/viya/mv_webout.sas +++ b/viya/mv_webout.sas @@ -49,7 +49,7 @@ sasjs_tables SYS_JES_JOB_URI; %if %index("&_debug",log) %then %let _debug=131; -%local i tempds; +%local i tempds table; %let action=%upcase(&action); %if &action=FETCH %then %do; @@ -64,60 +64,35 @@ %end; /* if the sasjs_tables param is passed, we expect param based upload */ - %if %length(&sasjs_tables.XX)>2 %then %do; - filename _sasjs "%sysfunc(pathname(work))/sasjs.lua"; - data _null_; - file _sasjs; - put 's=sas.symget("sasjs_tables")'; - put 'if(s:sub(1,7) == "%nrstr(")'; - put 'then'; - put ' tablist=s:sub(8,s:len()-1)'; - put 'else'; - put ' tablist=s'; - put 'end'; - put 'for i = 1,sas.countw(tablist) '; - put 'do '; - put ' tab=sas.scan(tablist,i)'; - put ' sasdata=""'; - put ' if (sas.symexist("sasjs"..i.."data0")==0)'; - put ' then'; - /* TODO - condense this logic */ - put ' s=sas.symget("sasjs"..i.."data")'; - put ' if(s:sub(1,7) == "%nrstr(")'; - put ' then'; - put ' sasdata=s:sub(8,s:len()-1)'; - put ' else'; - put ' sasdata=s'; - put ' end'; - put ' else'; - put ' for d = 1, sas.symget("sasjs"..i.."data0")'; - put ' do'; - put ' s=sas.symget("sasjs"..i.."data"..d)'; - put ' if(s:sub(1,7) == "%nrstr(")'; - put ' then'; - put ' sasdata=sasdata..s:sub(8,s:len()-1)'; - put ' else'; - put ' sasdata=sasdata..s'; - put ' end'; - put ' end'; - put ' end'; - put ' file = io.open(sas.pathname("work").."/"..tab..".csv", "a")'; - put ' io.output(file)'; - put ' io.write(sasdata)'; - put ' io.close(file)'; - put 'end'; - run; - %inc _sasjs; + %if %length(&sasjs_tables.X)>1 %then %do; - /* now read in the data */ + /* convert data from macro variables to datasets */ %do i=1 %to %sysfunc(countw(&sasjs_tables)); - %local table; %let table=%scan(&sasjs_tables,&i); + %let table=%scan(&sasjs_tables,&i,%str( )); + %if %symexist(sasjs&i.data0)=0 %then %let sasjs&i.data0=1; + data _null_; + file "%sysfunc(pathname(work))/&table..csv" recfm=n; + retain nrflg 0; + length line $32767; + do i=1 to &&sasjs&i.data0; + if &&sasjs&i.data0=1 then line=symget("sasjs&i.data"); + else line=symget(cats("sasjs&i.data",i)); + if i=1 and substr(line,1,7)='%nrstr(' then do; + nrflg=1; + line=substr(line,8); + end; + if i=&&sasjs&i.data0 and nrflg=1 then do; + line=substr(line,1,length(line)-1); + end; + put line +(-1) @; + end; + run; data _null_; infile "%sysfunc(pathname(work))/&table..csv" termstr=crlf ; input; if _n_=1 then call symputx('input_statement',_infile_); list; - data &table; + data work.&table; infile "%sysfunc(pathname(work))/&table..csv" firstobs=2 dsd termstr=crlf; input &input_statement; From c2597bd07b9e84669da86e3d5959d43266497781 Mon Sep 17 00:00:00 2001 From: munja Date: Fri, 1 Apr 2022 17:29:06 +0100 Subject: [PATCH 2/2] fix: missing dependency in mp_hashdataset.test.sas --- tests/crossplatform/mp_hashdataset.test.sas | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/crossplatform/mp_hashdataset.test.sas b/tests/crossplatform/mp_hashdataset.test.sas index f08b9cd..72ae0ef 100644 --- a/tests/crossplatform/mp_hashdataset.test.sas +++ b/tests/crossplatform/mp_hashdataset.test.sas @@ -3,6 +3,7 @@ @brief Testing mp_hashdataset.sas macro

SAS Macros

+ @li mf_nobs.sas @li mp_hashdataset.sas @li mp_assert.sas @li mp_assertscope.sas