1
0
mirror of https://github.com/sasjs/core.git synced 2026-01-05 16:40:06 +00:00

fix: updating all.sas

This commit is contained in:
munja
2022-03-07 10:45:06 +00:00
parent b49e11bc79
commit f7ee012be3

338
all.sas
View File

@@ -7573,6 +7573,11 @@ create table &outds as
outfile=0 outfile=0
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%if "%substr(&sysver,1,4)"="V.04" %then %do;
%put %str(ERR)OR: Viya 4 does not support the IO library in lua;
%return;
%end;
%ml_gsubfile() %ml_gsubfile()
%mend mp_gsubfile; %mend mp_gsubfile;
@@ -20969,10 +20974,16 @@ libname &libref1a clear;
%mv_deleteviyafolder(path=/Public/test) %mv_deleteviyafolder(path=/Public/test)
@param path= The full path of the folder to be deleted @param [in] path= The full path of the folder to be deleted
@param access_token_var= The global macro variable to contain the access token @param [in] access_token_var= (ACCESS_TOKEN) The global macro variable to
@param grant_type= valid values are "password" or "authorization_code" (unquoted). contain the access token
The default is authorization_code. @param [in] grant_type= (sas_services) Valid values are:
@li password
@li authorization_code
@li detect - will check if access_token exists, if not will use sas_services
if a SASStudioV session else authorization_code. Default option.
@li sas_services - will use oauth_bearer=sas_services.
@param [in] mdebug= (0) Set to 1 to enable DEBUG messages
@version VIYA V.03.04 @version VIYA V.03.04
@@ -20990,6 +21001,7 @@ libname &libref1a clear;
%macro mv_deleteviyafolder(path= %macro mv_deleteviyafolder(path=
,access_token_var=ACCESS_TOKEN ,access_token_var=ACCESS_TOKEN
,grant_type=sas_services ,grant_type=sas_services
,mdebug=0
); );
%local oauth_bearer; %local oauth_bearer;
%if &grant_type=detect %then %do; %if &grant_type=detect %then %do;
@@ -21066,14 +21078,17 @@ run;
%let libref1a=%mf_getuniquelibref(); %let libref1a=%mf_getuniquelibref();
libname &libref1a JSON fileref=&fname1a; libname &libref1a JSON fileref=&fname1a;
data _null_; %if %mf_existds(&libref1a..items_links) %then %do;
set &libref1a..items_links; data _null_;
if href=:'/folders/folders' then return; set &libref1a..items_links;
if rel='deleteResource' then if href=:'/folders/folders' then return;
call execute('proc http method="DELETE" url='!!quote("&base_uri"!!trim(href)) if rel='deleteResource' then
!!'; headers "Authorization"="Bearer &&&access_token_var" ' call execute('proc http method="DELETE" url='
!!' "Accept"="*/*";run; /**/'); !!quote("&base_uri"!!trim(href))
run; !!'; headers "Authorization"="Bearer &&&access_token_var" '
!!' "Accept"="*/*";run; /**/');
run;
%end;
%put &sysmacroname: perform the delete operation ; %put &sysmacroname: perform the delete operation ;
%local fname2; %local fname2;
@@ -21094,12 +21109,15 @@ run;
%end; %end;
%else %put &sysmacroname: &path successfully deleted; %else %put &sysmacroname: &path successfully deleted;
/* clear refs */ %if &mdebug=0 %then %do;
filename &fname1 clear; /* clear refs */
filename &fname2 clear; filename &fname1 clear;
libname &libref1 clear; filename &fname2 clear;
libname &libref1 clear;
%end;
%mend mv_deleteviyafolder;/** %mend mv_deleteviyafolder;
/**
@file mv_getclients.sas @file mv_getclients.sas
@brief Get a list of Viya Clients @brief Get a list of Viya Clients
@details First, be sure you have an access token (which requires an app token). @details First, be sure you have an access token (which requires an app token).
@@ -21563,7 +21581,6 @@ libname &libref1 clear;
@li mf_getplatform.sas @li mf_getplatform.sas
@li mf_getuniquefileref.sas @li mf_getuniquefileref.sas
@li mv_getfoldermembers.sas @li mv_getfoldermembers.sas
@li ml_json.sas
**/ **/
@@ -21574,7 +21591,7 @@ libname &libref1 clear;
,grant_type=sas_services ,grant_type=sas_services
,mdebug=0 ,mdebug=0
); );
%local dbg; %local dbg bufsize varcnt fname1 fname2 errmsg;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
%put &sysmacroname entry vars:; %put &sysmacroname entry vars:;
%put _local_; %put _local_;
@@ -21634,7 +21651,6 @@ run;
) )
/* prepare request*/ /* prepare request*/
%local fname1;
%let fname1=%mf_getuniquefileref(); %let fname1=%mf_getuniquefileref();
proc http method='GET' out=&fname1 &oauth_bearer proc http method='GET' out=&fname1 &oauth_bearer
url="&base_uri&joburi"; url="&base_uri&joburi";
@@ -21651,30 +21667,81 @@ run;
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE) ,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
) )
%end; %end;
%local fname2 fname3 fpath1 fpath2 fpath3;
%let fname2=%mf_getuniquefileref();
%let fname3=%mf_getuniquefileref();
%let fpath1=%sysfunc(pathname(&fname1));
%let fpath2=%sysfunc(pathname(&fname2));
%let fpath3=%sysfunc(pathname(&fname3));
/* compile the lua JSON module */ %let fname2=%mf_getuniquefileref();
%ml_json() filename &fname2 temp ;
/* read using LUA - this allows the code to be of any length */
/* cannot use lua IO package as not available in Viya 4 */
/* so use data step to read the JSON until the string `"code":"` is found */
data _null_; data _null_;
file "&fpath3..lua"; file &fname2 recfm=n;
put ' infile &fname1 lrecl=1 recfm=n;
infile = io.open (sas.symget("fpath1"), "r") input sourcechar $ 1. @@;
outfile = io.open (sas.symget("fpath2"), "w") format sourcechar hex2.;
io.input(infile) retain startwrite 0;
local resp=json.decode(io.read()) if startwrite=0 and sourcechar='"' then do;
local job=resp["code"] reentry:
outfile:write(job) input sourcechar $ 1. @@;
io.close(infile) if sourcechar='c' then do;
io.close(outfile) reentry2:
'; input sourcechar $ 1. @@;
if sourcechar='o' then do;
input sourcechar $ 1. @@;
if sourcechar='d' then do;
input sourcechar $ 1. @@;
if sourcechar='e' then do;
input sourcechar $ 1. @@;
if sourcechar='"' then do;
input sourcechar $ 1. @@;
if sourcechar=':' then do;
input sourcechar $ 1. @@;
if sourcechar='"' then do;
putlog 'code found';
startwrite=1;
input sourcechar $ 1. @@;
end;
end;
else if sourcechar='c' then goto reentry2;
end;
end;
else if sourcechar='"' then goto reentry;
end;
else if sourcechar='"' then goto reentry;
end;
else if sourcechar='"' then goto reentry;
end;
else if sourcechar='"' then goto reentry;
end;
/* once the `"code":"` string is found, write until unescaped `"` is found */
if startwrite=1 then do;
if sourcechar='\' then do;
input sourcechar $ 1. @@;
if sourcechar in ('"','\') then put sourcechar char1.;
else if sourcechar='n' then put '0A'x;
else if sourcechar='r' then put '0D'x;
else if sourcechar='t' then put '09'x;
else if sourcechar='u' then do;
length uni $4;
input uni $ 4. @@;
sourcechar=unicode('\u'!!uni);
put sourcechar char1.;
end;
else do;
call symputx('errmsg',"Uncaught escape char: "!!sourcechar,'l');
call symputx('syscc',99);
stop;
end;
end;
else if sourcechar='"' then stop;
else put sourcechar char1.;
end;
run; run;
%inc "&fpath3..lua";
%mp_abort(iftrue=("&syscc"="99")
,mac=mv_getjobcode
,msg=%str(&errmsg)
)
/* export to desired destination */ /* export to desired destination */
%if "&outref"="0" %then %do; %if "&outref"="0" %then %do;
data _null_; data _null_;
@@ -21699,7 +21766,6 @@ run;
/* clear refs */ /* clear refs */
filename &fname1 clear; filename &fname1 clear;
filename &fname2 clear; filename &fname2 clear;
filename &fname3 clear;
%end; %end;
%mend mv_getjobcode; %mend mv_getjobcode;
@@ -21791,7 +21857,8 @@ run;
@li mp_abort.sas @li mp_abort.sas
@li mf_getplatform.sas @li mf_getplatform.sas
@li mf_existfileref.sas @li mf_existfileref.sas
@li ml_json.sas @li mf_getuniquefileref.sas
@li mf_getuniquelibref.sas
**/ **/
@@ -21800,7 +21867,7 @@ run;
,grant_type=sas_services ,grant_type=sas_services
,mdebug=0 ,mdebug=0
); );
%local dbg; %local dbg libref1 libref2 loglocation fname1 fname2;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
%put &sysmacroname entry vars:; %put &sysmacroname entry vars:;
%put _local_; %put _local_;
@@ -21859,8 +21926,8 @@ options noquotelenmax;
%let base_uri=%mf_getplatform(VIYARESTAPI); %let base_uri=%mf_getplatform(VIYARESTAPI);
/* prepare request*/ /* prepare request*/
%local fname1;
%let fname1=%mf_getuniquefileref(); %let fname1=%mf_getuniquefileref();
%let fname2=%mf_getuniquefileref();
proc http method='GET' out=&fname1 &oauth_bearer proc http method='GET' out=&fname1 &oauth_bearer
url="&base_uri&uri"; url="&base_uri&uri";
headers headers
@@ -21880,37 +21947,19 @@ run;
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE) ,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
) )
%end; %end;
%local fname2 fname3 fpath1 fpath2 fpath3;
%let fname2=%mf_getuniquefileref();
%let fname3=%mf_getuniquefileref();
%let fpath1=%sysfunc(pathname(&fname1));
%let fpath2=%sysfunc(pathname(&fname2));
%let fpath3=%sysfunc(pathname(&fname3));
/* compile the lua JSON module */ %let libref1=%mf_getuniquelibref();
%ml_json() libname &libref1 JSON fileref=&fname1;
/* read using LUA - this allows the code to be of any length */
data _null_; data _null_;
file "&fpath3..lua"; set &libref1..root;
put ' call symputx('loglocation',loglocation,'l');
infile = io.open (sas.symget("fpath1"), "r")
outfile = io.open (sas.symget("fpath2"), "w")
io.input(infile)
local resp=json.decode(io.read())
local logloc=resp["logLocation"]
outfile:write(logloc)
io.close(infile)
io.close(outfile)
';
run; run;
%inc "&fpath3..lua";
/* get log path*/ /* validate log path*/
%let errflg=1; %let errflg=1;
%let errmsg=No entry in &fname2 fileref; %let errmsg=No loglocation entry in &fname1 fileref;
data _null_; data _null_;
infile &fname2; uri=symget('loglocation');
input;
uri=cats(_infile_);
if length(uri)<12 then do; if length(uri)<12 then do;
call symputx('errflg',1); call symputx('errflg',1);
call symputx('errmsg',"URI is invalid (too short) - '&uri'",'l'); call symputx('errmsg',"URI is invalid (too short) - '&uri'",'l');
@@ -21937,7 +21986,7 @@ run;
/* we have a log uri - now fetch the log */ /* we have a log uri - now fetch the log */
%&dbg.put &sysmacroname: querying &base_uri&logloc/content; %&dbg.put &sysmacroname: querying &base_uri&logloc/content;
proc http method='GET' out=&fname1 &oauth_bearer proc http method='GET' out=&fname2 &oauth_bearer
url="&base_uri&logloc/content?limit=10000"; url="&base_uri&logloc/content?limit=10000";
headers headers
%if &grant_type=authorization_code %then %do; %if &grant_type=authorization_code %then %do;
@@ -21948,14 +21997,14 @@ run;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
%put &sysmacroname: fetching log content from &base_uri&logloc/content; %put &sysmacroname: fetching log content from &base_uri&logloc/content;
data _null_;infile &fname1;input;putlog _infile_;run; data _null_;infile &fname2;input;putlog _infile_;run;
%end; %end;
%if &SYS_PROCHTTP_STATUS_CODE=400 %then %do; %if &SYS_PROCHTTP_STATUS_CODE=400 %then %do;
/* fetch log from parent session */ /* fetch log from parent session */
%let logloc=%substr(&logloc,1,%index(&logloc,%str(/jobs/))-1); %let logloc=%substr(&logloc,1,%index(&logloc,%str(/jobs/))-1);
%&dbg.put &sysmacroname: Now querying &base_uri&logloc/log/content; %&dbg.put &sysmacroname: Now querying &base_uri&logloc/log/content;
proc http method='GET' out=&fname1 &oauth_bearer proc http method='GET' out=&fname2 &oauth_bearer
url="&base_uri&logloc/log/content?limit=10000"; url="&base_uri&logloc/log/content?limit=10000";
headers headers
%if &grant_type=authorization_code %then %do; %if &grant_type=authorization_code %then %do;
@@ -21965,47 +22014,32 @@ run;
run; run;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
%put &sysmacroname: fetching log content from &base_uri&logloc/log/content; %put &sysmacroname: fetching log content from &base_uri&logloc/log/content;
data _null_;infile &fname1;input;putlog _infile_;run; data _null_;infile &fname2;input;putlog _infile_;run;
%end; %end;
%end; %end;
%if &SYS_PROCHTTP_STATUS_CODE ne 200 and &SYS_PROCHTTP_STATUS_CODE ne 201 %if &SYS_PROCHTTP_STATUS_CODE ne 200 and &SYS_PROCHTTP_STATUS_CODE ne 201
%then %do; %then %do;
%if &mdebug ne 1 %then %do; /* have already output above */ %if &mdebug ne 1 %then %do; /* have already output above */
data _null_;infile &fname1;input;putlog _infile_;run; data _null_;infile &fname2;input;putlog _infile_;run;
%end; %end;
%mp_abort(mac=&sysmacroname %mp_abort(mac=&sysmacroname
,msg=%str(logfetch: &SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE) ,msg=%str(logfetch: &SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
) )
%end; %end;
data _null_;
file "&fpath3..lua";
put '
infile = io.open (sas.symget("fpath1"), "r")
outfile = io.open (sas.symget("fpath2"), "w")
io.input(infile)
local resp=json.decode(io.read())
for i, v in pairs(resp["items"]) do
outfile:write(v.line,"\n")
end
io.close(infile)
io.close(outfile)
';
run;
%inc "&fpath3..lua";
/* write log out to the specified fileref */ %let libref2=%mf_getuniquelibref();
libname &libref2 JSON fileref=&fname2;
data _null_; data _null_;
infile &fname2 end=last;
file &outref mod; file &outref mod;
if _n_=1 then do; if _n_=1 then do;
put "/** SASJS Viya Job Log Extract start: &uri **/"; put "/** SASJS Viya Job Log Extract start: &uri **/";
end; end;
input; set &libref2..items end=last;
put _infile_;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
putlog _infile_; putlog line;
%end; %end;
put line;
if last then do; if last then do;
put "/** SASJS Viya Job Log Extract end: &uri **/"; put "/** SASJS Viya Job Log Extract end: &uri **/";
end; end;
@@ -22014,7 +22048,8 @@ run;
%if &mdebug=0 %then %do; %if &mdebug=0 %then %do;
filename &fname1 clear; filename &fname1 clear;
filename &fname2 clear; filename &fname2 clear;
filename &fname3 clear; libname &libref1 clear;
libname &libref2 clear;
%end; %end;
%else %do; %else %do;
%put &sysmacroname exit vars:; %put &sysmacroname exit vars:;
@@ -24971,115 +25006,6 @@ endsub;
%end; %end;
%mend mcf_length;/** %mend mcf_length;/**
@file
@brief Provides a replacement for the stpsrv_header function
@details The stpsrv_header is normally a built-in function, used to set the
headers for SAS 9 Stored Processes as documented here:
https://go.documentation.sas.com/doc/en/itechcdc/9.4/stpug/srvhead.htm
The purpose of this custom function is to provide a replacement when running
similar code as a web service against
[sasjs/server](https://github.com/sasjs/server). It operates by creating a
text file with the headers. The location of this text file is determined by
a macro variable (`sasjs_stpsrv_header_loc`) which needs to be injected into
each service by the calling process, eg:
%let sasjs_stpsrv_header_loc = C:/temp/some_uuid/stpsrv_header.txt;
Note - the function works by appending headers to the file. If multiple same-
named headers are provided, they will all be appended - the calling process
needs to pick up the last one. This will mean removing the attribute if the
final record has an empty value.
The function takes the following (positional) parameters:
| PARAMETER | DESCRIPTION |
|------------|-------------|
| name $ | name of the header attribute to create|
| value $ | value of the header attribute|
It returns 0 if successful, or -1 if an error occured.
Usage:
%let sasjs_stpsrv_header_loc=%sysfunc(pathname(work))/stpsrv_header.txt;
%mcf_stpsrv_header(wrap=YES, insert_cmplib=YES)
data _null_;
rc=stpsrv_header('Content-type','application/text');
rc=stpsrv_header('Content-disposition',"attachment; filename=file.txt");
run;
data _null_;
infile "&sasjs_stpsrv_header_loc";
input;
putlog _infile_;
run;
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
@param [out] lib= (work) The output library in which to create the catalog.
@param [out] cat= (sasjs) The output catalog in which to create the package.
@param [out] pkg= (utils) The output package in which to create the function.
Uses a 3 part format: libref.catalog.package
@param [out] insert_cmplib= DEPRECATED - The CMPLIB option is checked and
values inserted only if needed.
<h4> SAS Macros </h4>
@li mcf_init.sas
<h4> Related Programs </h4>
@li mcf_stpsrv_header.test.sas
@li mp_init.sas
**/
%macro mcf_stpsrv_header(wrap=NO
,insert_cmplib=DEPRECATED
,lib=WORK
,cat=SASJS
,pkg=UTILS
)/*/STORE SOURCE*/;
%local i var cmpval found;
%if %mcf_init(stpsrv_header)=1 %then %return;
%if &wrap=YES %then %do;
proc fcmp outlib=&lib..&cat..&pkg;
%end;
function stpsrv_header(name $, value $);
length loc $128 val $512;
loc=symget('sasjs_stpsrv_header_loc');
val=trim(name)!!': '!!value;
length fref $8;
rc=filename(fref,loc);
if (rc ne 0) then return( -1 );
fid = fopen(fref,'a');
if (fid = 0) then return( -1 );
rc=fput(fid, val);
rc=fwrite(fid);
rc=fclose(fid);
rc=filename(fref);
return(0);
endsub;
%if &wrap=YES %then %do;
quit;
%end;
/* insert the CMPLIB if not already there */
%let cmpval=%sysfunc(getoption(cmplib));
%let found=0;
%do i=1 %to %sysfunc(countw(&cmpval,%str( %(%))));
%let var=%scan(&cmpval,&i,%str( %(%)));
%if &var=&lib..&cat %then %let found=1;
%end;
%if &found=0 %then %do;
options insert=(CMPLIB=(&lib..&cat));
%end;
%mend mcf_stpsrv_header;/**
@file @file
@brief Adds a string to a file @brief Adds a string to a file
@details Creates an fcmp function for appending a string to an external file. @details Creates an fcmp function for appending a string to an external file.