mirror of
https://github.com/sasjs/core.git
synced 2026-01-06 00:50:05 +00:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
60d23dd618 | ||
|
|
d2764c3cd1 | ||
|
|
f9f4355143 | ||
|
|
18bc6c889d | ||
|
|
42a16ef496 | ||
|
|
8178b801fb | ||
|
|
ce331a23c8 | ||
|
|
1cc9213467 | ||
|
|
aabbf4d0f9 | ||
|
|
2bea8be70d | ||
|
|
9b2368443e |
394
all.sas
394
all.sas
@@ -18,19 +18,18 @@
|
|||||||
options noquotelenmax;
|
options noquotelenmax;
|
||||||
/**
|
/**
|
||||||
@file
|
@file
|
||||||
@brief to be deprecated
|
@brief Abort, ungracefully
|
||||||
@details We will deprecate this macro in 2022
|
@details Will abort with a straightforward %abort if the condition is true.
|
||||||
|
|
||||||
As you can see, it's not a macro function.
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_abort.sas
|
||||||
Use mp_abort.sas instead.
|
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
@cond
|
@cond
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mf_abort(mac=mf_abort.sas, type=, msg=, iftrue=%str(1=1)
|
%macro mf_abort(mac=mf_abort.sas, type=deprecated, msg=, iftrue=%str(1=1)
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
%if not(%eval(%unquote(&iftrue))) %then %return;
|
%if not(%eval(%unquote(&iftrue))) %then %return;
|
||||||
@@ -39,117 +38,9 @@ options noquotelenmax;
|
|||||||
%if %length(&mac)>0 %then %put NOTE- called by &mac;
|
%if %length(&mac)>0 %then %put NOTE- called by &mac;
|
||||||
%put NOTE - &msg;
|
%put NOTE - &msg;
|
||||||
|
|
||||||
/* Stored Process Server web app context */
|
%abort;
|
||||||
%if %symexist(_metaperson) or "&SYSPROCESSNAME"="Compute Server" %then %do;
|
|
||||||
options obs=max replace nosyntaxcheck mprint;
|
|
||||||
/* extract log err / warn, if exist */
|
|
||||||
%local logloc logline;
|
|
||||||
%global logmsg; /* capture global messages */
|
|
||||||
%if %symexist(SYSPRINTTOLOG) %then %let logloc=&SYSPRINTTOLOG;
|
|
||||||
%else %let logloc=%qsysfunc(getoption(LOG));
|
|
||||||
proc printto log=log;run;
|
|
||||||
%if %length(&logloc)>0 %then %do;
|
|
||||||
%let logline=0;
|
|
||||||
data _null_;
|
|
||||||
infile &logloc lrecl=5000;
|
|
||||||
input; putlog _infile_;
|
|
||||||
i=1;
|
|
||||||
retain logonce 0;
|
|
||||||
if (
|
|
||||||
_infile_=:"%str(WARN)ING" or _infile_=:"%str(ERR)OR"
|
|
||||||
) and logonce=0
|
|
||||||
then do;
|
|
||||||
call symputx('logline',_n_);
|
|
||||||
logonce+1;
|
|
||||||
end;
|
|
||||||
run;
|
|
||||||
/* capture log including lines BEFORE the err */
|
|
||||||
%if &logline>0 %then %do;
|
|
||||||
data _null_;
|
|
||||||
infile &logloc lrecl=5000;
|
|
||||||
input;
|
|
||||||
i=1;
|
|
||||||
stoploop=0;
|
|
||||||
if _n_ ge &logline-5 and stoploop=0 then do until (i>12);
|
|
||||||
call symputx('logmsg',catx('\n',symget('logmsg'),_infile_));
|
|
||||||
input;
|
|
||||||
i+1;
|
|
||||||
stoploop=1;
|
|
||||||
end;
|
|
||||||
if stoploop=1 then stop;
|
|
||||||
run;
|
|
||||||
%end;
|
|
||||||
%end;
|
|
||||||
|
|
||||||
/* send response in SASjs JSON format */
|
%mend mf_abort;
|
||||||
data _null_;
|
|
||||||
file _webout mod lrecl=32000;
|
|
||||||
length msg $32767;
|
|
||||||
sasdatetime=datetime();
|
|
||||||
msg=cats(symget('msg'),'\n\nLog Extract:\n',symget('logmsg'));
|
|
||||||
/* escape the quotes */
|
|
||||||
msg=tranwrd(msg,'"','\"');
|
|
||||||
/* ditch the CRLFs as chrome complains */
|
|
||||||
msg=compress(msg,,'kw');
|
|
||||||
/* quote without quoting the quotes (which are escaped instead) */
|
|
||||||
msg=cats('"',msg,'"');
|
|
||||||
if symexist('_debug') then debug=symget('_debug');
|
|
||||||
if debug ge 131 then put '>>weboutBEGIN<<';
|
|
||||||
put '{"START_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '"';
|
|
||||||
put ',"sasjsAbort" : [{';
|
|
||||||
put ' "MSG":' msg ;
|
|
||||||
put ' ,"MAC": "' "&mac" '"}]';
|
|
||||||
put ",""SYSUSERID"" : ""&sysuserid"" ";
|
|
||||||
if symexist('_metauser') then do;
|
|
||||||
_METAUSER=quote(trim(symget('_METAUSER')));
|
|
||||||
put ",""_METAUSER"": " _METAUSER;
|
|
||||||
_METAPERSON=quote(trim(symget('_METAPERSON')));
|
|
||||||
put ',"_METAPERSON": ' _METAPERSON;
|
|
||||||
end;
|
|
||||||
_PROGRAM=quote(trim(resolve(symget('_PROGRAM'))));
|
|
||||||
put ',"_PROGRAM" : ' _PROGRAM ;
|
|
||||||
put ",""SYSCC"" : ""&syscc"" ";
|
|
||||||
put ",""SYSERRORTEXT"" : ""&syserrortext"" ";
|
|
||||||
put ",""SYSJOBID"" : ""&sysjobid"" ";
|
|
||||||
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
|
||||||
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
|
||||||
put "}" @;
|
|
||||||
%if &_debug ge 131 %then %do;
|
|
||||||
put '>>weboutEND<<';
|
|
||||||
%end;
|
|
||||||
run;
|
|
||||||
%let syscc=0;
|
|
||||||
%if %symexist(SYS_JES_JOB_URI) %then %do;
|
|
||||||
/* refer web service output to file service in one hit */
|
|
||||||
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
|
|
||||||
name="_webout.json";
|
|
||||||
%let rc=%sysfunc(fcopy(_web,_webout));
|
|
||||||
%end;
|
|
||||||
%else %do;
|
|
||||||
data _null_;
|
|
||||||
if symexist('sysprocessmode')
|
|
||||||
then if symget("sysprocessmode")="SAS Stored Process Server"
|
|
||||||
then rc=stpsrvset('program error', 0);
|
|
||||||
run;
|
|
||||||
%end;
|
|
||||||
/**
|
|
||||||
* endsas is reliable but kills some deployments.
|
|
||||||
* Abort variants are ungraceful (non zero return code)
|
|
||||||
* This approach lets SAS run silently until the end :-)
|
|
||||||
*/
|
|
||||||
%put _all_;
|
|
||||||
filename skip temp;
|
|
||||||
data _null_;
|
|
||||||
file skip;
|
|
||||||
put '%macro skip(); %macro skippy();';
|
|
||||||
run;
|
|
||||||
%inc skip;
|
|
||||||
%end;
|
|
||||||
%else %do;
|
|
||||||
%put _all_;
|
|
||||||
%abort cancel;
|
|
||||||
%end;
|
|
||||||
%mend;
|
|
||||||
|
|
||||||
/** @endcond *//**
|
/** @endcond *//**
|
||||||
@file mf_existds.sas
|
@file mf_existds.sas
|
||||||
@@ -5149,7 +5040,8 @@ create table &outds (rename=(
|
|||||||
%let fmtds=%scan(&syslast,2,.);
|
%let fmtds=%scan(&syslast,2,.);
|
||||||
/* prepare formats and varnames */
|
/* prepare formats and varnames */
|
||||||
data _null_;
|
data _null_;
|
||||||
set &fmtds end=last;
|
if _n_=1 then call symputx('nobs',nobs,'l');
|
||||||
|
set &fmtds end=last nobs=nobs;
|
||||||
name=upcase(name);
|
name=upcase(name);
|
||||||
/* fix formats */
|
/* fix formats */
|
||||||
if type=2 or type=6 then do;
|
if type=2 or type=6 then do;
|
||||||
@@ -5175,7 +5067,6 @@ create table &outds (rename=(
|
|||||||
call symputx(cats('len',_n_),newlen,'l');
|
call symputx(cats('len',_n_),newlen,'l');
|
||||||
call symputx(cats('fmt',_n_),fmt,'l');
|
call symputx(cats('fmt',_n_),fmt,'l');
|
||||||
call symputx(cats('type',_n_),type,'l');
|
call symputx(cats('type',_n_),type,'l');
|
||||||
if last then call symputx('nobs',_n_,'l');
|
|
||||||
run;
|
run;
|
||||||
data &fmtds;
|
data &fmtds;
|
||||||
/* rename on entry */
|
/* rename on entry */
|
||||||
@@ -8901,7 +8792,7 @@ Usage:
|
|||||||
%webout(OBJ,example2) * Object format, easier to work with ;
|
%webout(OBJ,example2) * Object format, easier to work with ;
|
||||||
%webout(CLOSE)
|
%webout(CLOSE)
|
||||||
;;;;
|
;;;;
|
||||||
%mm_createwebservice(path=/Public/app/common,name=appInit)
|
%mm_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001)
|
||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mm_createstp.sas
|
@li mm_createstp.sas
|
||||||
@@ -8916,12 +8807,15 @@ Usage:
|
|||||||
@param desc= The description of the service (optional)
|
@param desc= The description of the service (optional)
|
||||||
@param precode= Space separated list of filerefs, pointing to the code that
|
@param precode= Space separated list of filerefs, pointing to the code that
|
||||||
needs to be attached to the beginning of the service (optional)
|
needs to be attached to the beginning of the service (optional)
|
||||||
@param code= Space seperated fileref(s) of the actual code to be added
|
@param code=(ft15f001) Space seperated fileref(s) of the actual code to be
|
||||||
@param server= The server which will run the STP. Server name or uri is fine.
|
added
|
||||||
@param mDebug= set to 1 to show debug messages in the log
|
@param server=(SASApp) The server which will run the STP. Server name or uri
|
||||||
@param replace= select YES to replace any existing service in that location
|
is fine.
|
||||||
@param adapter= the macro uses the sasjs adapter by default. To use another
|
@param mDebug=(0) set to 1 to show debug messages in the log
|
||||||
adapter, add a (different) fileref here.
|
@param replace=(YES) select NO to avoid replacing an existing service in that
|
||||||
|
location
|
||||||
|
@param adapter=(sasjs) the macro uses the sasjs adapter by default. To use
|
||||||
|
another adapter, add a (different) fileref here.
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
@@ -8931,11 +8825,11 @@ Usage:
|
|||||||
%macro mm_createwebservice(path=
|
%macro mm_createwebservice(path=
|
||||||
,name=initService
|
,name=initService
|
||||||
,precode=
|
,precode=
|
||||||
,code=
|
,code=ft15f001
|
||||||
,desc=This stp was created automagically by the mm_createwebservice macro
|
,desc=This stp was created automagically by the mm_createwebservice macro
|
||||||
,mDebug=0
|
,mDebug=0
|
||||||
,server=SASApp
|
,server=SASApp
|
||||||
,replace=NO
|
,replace=YES
|
||||||
,adapter=sasjs
|
,adapter=sasjs
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
@@ -9010,7 +8904,8 @@ data _null_;
|
|||||||
put ' %let fmtds=%scan(&syslast,2,.); ';
|
put ' %let fmtds=%scan(&syslast,2,.); ';
|
||||||
put ' /* prepare formats and varnames */ ';
|
put ' /* prepare formats and varnames */ ';
|
||||||
put ' data _null_; ';
|
put ' data _null_; ';
|
||||||
put ' set &fmtds end=last; ';
|
put ' if _n_=1 then call symputx(''nobs'',nobs,''l''); ';
|
||||||
|
put ' set &fmtds end=last nobs=nobs; ';
|
||||||
put ' name=upcase(name); ';
|
put ' name=upcase(name); ';
|
||||||
put ' /* fix formats */ ';
|
put ' /* fix formats */ ';
|
||||||
put ' if type=2 or type=6 then do; ';
|
put ' if type=2 or type=6 then do; ';
|
||||||
@@ -9036,7 +8931,6 @@ data _null_;
|
|||||||
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
||||||
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
||||||
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
||||||
put ' if last then call symputx(''nobs'',_n_,''l''); ';
|
|
||||||
put ' run; ';
|
put ' run; ';
|
||||||
put ' data &fmtds; ';
|
put ' data &fmtds; ';
|
||||||
put ' /* rename on entry */ ';
|
put ' /* rename on entry */ ';
|
||||||
@@ -9347,7 +9241,7 @@ run;
|
|||||||
%put &url?_PROGRAM=&path/&name;
|
%put &url?_PROGRAM=&path/&name;
|
||||||
%put ;%put ;%put ;%put ;%put ;%put ;
|
%put ;%put ;%put ;%put ;%put ;%put ;
|
||||||
|
|
||||||
%mend;
|
%mend mm_createwebservice;
|
||||||
/**
|
/**
|
||||||
@file mm_deletedocument.sas
|
@file mm_deletedocument.sas
|
||||||
@brief Deletes a Document using path as reference
|
@brief Deletes a Document using path as reference
|
||||||
@@ -12887,19 +12781,211 @@ run;
|
|||||||
%inc &fref1;
|
%inc &fref1;
|
||||||
|
|
||||||
%mend;/**
|
%mend;/**
|
||||||
|
@file
|
||||||
|
@brief Checks whether a file exists in SAS Drive
|
||||||
|
@details Returns 1 if the file exists, and 0 if it doesn't. Works by
|
||||||
|
attempting to assign a fileref with the filesrvc engine. If not found, the
|
||||||
|
syscc is automatically set to a non zero value - so in this case it is reset.
|
||||||
|
To avoid hiding issues, there is therefore a test at the start to ensure the
|
||||||
|
syscc is zero.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%put %mfv_existfile(/does/exist.txt);
|
||||||
|
%put %mfv_existfile(/does/not/exist.txt);
|
||||||
|
|
||||||
|
@param filepath The full path to the file on SAS drive (eg /Public/myfile.txt)
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_abort.sas
|
||||||
|
@li mf_getuniquefileref.sas
|
||||||
|
|
||||||
|
@version 3.5
|
||||||
|
@author [Allan Bowe](https://www.linkedin.com/in/allanbowe/)
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mfv_existfile(filepath
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%mf_abort(
|
||||||
|
iftrue=(&syscc ne 0),
|
||||||
|
msg=Cannot enter mfv_existfile.sas with syscc=&syscc
|
||||||
|
)
|
||||||
|
|
||||||
|
%local fref rc path name;
|
||||||
|
%let fref=%mf_getuniquefileref();
|
||||||
|
%let name=%scan(&filepath,-1,/);
|
||||||
|
%let path=%substr(&filepath,1,%length(&filepath)-%length(&name)-1);
|
||||||
|
|
||||||
|
%if %sysfunc(filename(fref,,filesrvc,folderPath="&path" filename="&name"))=0
|
||||||
|
%then %do;
|
||||||
|
%sysfunc(fexist(&fref))
|
||||||
|
%let rc=%sysfunc(filename(fref));
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
0
|
||||||
|
%let syscc=0;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mfv_existfile;/**
|
||||||
|
@file
|
||||||
|
@brief Checks whether a folder exists in SAS Drive
|
||||||
|
@details Returns 1 if the folder exists, and 0 if it doesn't. Works by
|
||||||
|
attempting to assign a fileref with the filesrvc engine. If not found, the
|
||||||
|
syscc is automatically set to a non zero value - so in this case it is reset.
|
||||||
|
To avoid hiding issues, there is therefore a test at the start to ensure the
|
||||||
|
syscc is zero.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%put %mfv_existfolder(/does/exist);
|
||||||
|
%put %mfv_existfolder(/does/not/exist);
|
||||||
|
|
||||||
|
@param path The path to the folder on SAS drive
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_abort.sas
|
||||||
|
@li mf_getuniquefileref.sas
|
||||||
|
|
||||||
|
@version 3.5
|
||||||
|
@author [Allan Bowe](https://www.linkedin.com/in/allanbowe/)
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mfv_existfolder(path
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%mf_abort(
|
||||||
|
iftrue=(&syscc ne 0),
|
||||||
|
msg=Cannot enter mfv_existfolder.sas with syscc=&syscc
|
||||||
|
)
|
||||||
|
|
||||||
|
%local fref rc;
|
||||||
|
%let fref=%mf_getuniquefileref();
|
||||||
|
|
||||||
|
%if %sysfunc(filename(fref,,filesrvc,folderPath="&path"))=0 %then %do;
|
||||||
|
1
|
||||||
|
%let rc=%sysfunc(filename(fref));
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
0
|
||||||
|
%let syscc=0;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mfv_existfolder;/**
|
||||||
|
@file
|
||||||
|
@brief Creates a file in SAS Drive
|
||||||
|
@details Creates a file in SAS Drive and adds the appropriate content type.
|
||||||
|
If the parent folder does not exist, it is created.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
filename myfile temp;
|
||||||
|
data _null_;
|
||||||
|
file myfile;
|
||||||
|
put 'something';
|
||||||
|
run;
|
||||||
|
%mv_createfile(path=/Public/temp,name=newfile.txt,inref=myfile)
|
||||||
|
|
||||||
|
|
||||||
|
@param [in] path= The parent folder in which to create the file
|
||||||
|
@param [in] name= The name of the file to be created
|
||||||
|
@param [in] inref= The fileref pointing to the file to be uploaded
|
||||||
|
@param [in] access_token_var= The global macro variable to contain the access
|
||||||
|
token, if using authorization_code grant type.
|
||||||
|
@param [in] grant_type= (sas_services) Valid values are:
|
||||||
|
@li password
|
||||||
|
@li authorization_code
|
||||||
|
@li sas_services
|
||||||
|
|
||||||
|
@param [in] mdebug= (0) Set to 1 to enable DEBUG messages
|
||||||
|
|
||||||
|
@version VIYA V.03.05
|
||||||
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_getuniquefileref.sas
|
||||||
|
@li mf_isblank.sas
|
||||||
|
@li mp_abort.sas
|
||||||
|
@li mp_binarycopy.sas
|
||||||
|
@li mv_createfolder.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mv_createfile(path=
|
||||||
|
,name=
|
||||||
|
,inref=
|
||||||
|
,access_token_var=ACCESS_TOKEN
|
||||||
|
,grant_type=sas_services
|
||||||
|
,mdebug=0
|
||||||
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
|
%local oauth_bearer;
|
||||||
|
%if &grant_type=detect %then %do;
|
||||||
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
|
%else %let grant_type=sas_services;
|
||||||
|
%end;
|
||||||
|
%if &grant_type=sas_services %then %do;
|
||||||
|
%let oauth_bearer=oauth_bearer=sas_services;
|
||||||
|
%let &access_token_var=;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
|
||||||
|
and &grant_type ne sas_services
|
||||||
|
)
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(Invalid value for grant_type: &grant_type)
|
||||||
|
)
|
||||||
|
|
||||||
|
%mp_abort(iftrue=(%mf_isblank(&path)=1 or %length(&path)=1)
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(path value must be provided)
|
||||||
|
)
|
||||||
|
%mp_abort(iftrue=(%mf_isblank(&name)=1 or %length(&name)=1)
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(name value with length >1 must be provided)
|
||||||
|
)
|
||||||
|
|
||||||
|
/* create folder if it does not already exist */
|
||||||
|
%mv_createfolder(path=&path
|
||||||
|
,access_token_var=&access_token_var
|
||||||
|
,grant_type=&grant_type
|
||||||
|
,mdebug=&mdebug
|
||||||
|
)
|
||||||
|
|
||||||
|
/* create file with relevant options */
|
||||||
|
%local fref;
|
||||||
|
%let fref=%mf_getuniquefileref();
|
||||||
|
filename &fref filesrvc folderPath="&path" filename="&name";
|
||||||
|
|
||||||
|
%mp_binarycopy(inref=&inref, outref=&fref)
|
||||||
|
|
||||||
|
filename &fref clear;
|
||||||
|
|
||||||
|
%mend mv_createfile;/**
|
||||||
@file mv_createfolder.sas
|
@file mv_createfolder.sas
|
||||||
@brief Creates a viya folder if that folder does not already exist
|
@brief Creates a viya folder if that folder does not already exist
|
||||||
@details Expects oauth token in a global macro variable (default
|
@details Creates a viya folder by checking if each parent folder exists, and
|
||||||
ACCESS_TOKEN).
|
recursively creating children if needed.
|
||||||
|
Usage:
|
||||||
|
|
||||||
%mv_createfolder(path=/Public)
|
%mv_createfolder(path=/Public)
|
||||||
|
|
||||||
|
|
||||||
@param path= The full path of the folder to be created
|
@param [in] path= The full path of the folder to be created
|
||||||
@param access_token_var= The global macro variable to contain the access token
|
@param [in] access_token_var= The global macro variable to contain the access
|
||||||
@param grant_type= (authorization_code) Valid values are "password" or
|
token, if using authorization_code grant type.
|
||||||
"authorization_code" (unquoted).
|
@param [in] grant_type= (sas_services) Valid values are:
|
||||||
|
@li password
|
||||||
|
@li authorization_code
|
||||||
|
@li sas_services
|
||||||
|
|
||||||
|
@param [in] mdebug=(0) set to 1 to enable DEBUG messages
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe, source: https://github.com/sasjs/core
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@@ -12910,21 +12996,36 @@ run;
|
|||||||
@li mf_getuniquelibref.sas
|
@li mf_getuniquelibref.sas
|
||||||
@li mf_isblank.sas
|
@li mf_isblank.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
|
@li mfv_existfolder.sas
|
||||||
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mv_createfolder(path=
|
%macro mv_createfolder(path=
|
||||||
,access_token_var=ACCESS_TOKEN
|
,access_token_var=ACCESS_TOKEN
|
||||||
,grant_type=sas_services
|
,grant_type=sas_services
|
||||||
|
,mdebug=0
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
|
%if %mfv_existfolder(&path)=1 %then %do;
|
||||||
|
%put &sysmacroname: &path already exists;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
%else %let grant_type=sas_services;
|
%else %let grant_type=sas_services;
|
||||||
%end;
|
%end;
|
||||||
%if &grant_type=sas_services %then %do;
|
%if &grant_type=sas_services %then %do;
|
||||||
%let oauth_bearer=oauth_bearer=sas_services;
|
%let oauth_bearer=oauth_bearer=sas_services;
|
||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
|
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
|
||||||
@@ -12979,6 +13080,15 @@ options noquotelenmax;
|
|||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
||||||
)
|
)
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname following check to see if &newpath exists:;
|
||||||
|
%put _local_;
|
||||||
|
data _null_;
|
||||||
|
set &fname1;
|
||||||
|
input;
|
||||||
|
putlog _infile_;
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
%if &SYS_PROCHTTP_STATUS_CODE=200 %then %do;
|
%if &SYS_PROCHTTP_STATUS_CODE=200 %then %do;
|
||||||
%*put &sysmacroname &newpath exists so grab the follow on link ;
|
%*put &sysmacroname &newpath exists so grab the follow on link ;
|
||||||
data _null_;
|
data _null_;
|
||||||
@@ -13028,8 +13138,10 @@ options noquotelenmax;
|
|||||||
%put &sysmacroname &newpath now created. Grabbing the follow on link ;
|
%put &sysmacroname &newpath now created. Grabbing the follow on link ;
|
||||||
data _null_;
|
data _null_;
|
||||||
set &libref2..links;
|
set &libref2..links;
|
||||||
if rel='createChild' then
|
if rel='createChild' then do;
|
||||||
call symputx('href',quote(cats("&base_uri",href)),'l');
|
call symputx('href',quote(cats("&base_uri",href)),'l');
|
||||||
|
&dbg put (_all_)(=);
|
||||||
|
end;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
libname &libref2 clear;
|
libname &libref2 clear;
|
||||||
@@ -13629,7 +13741,8 @@ data _null_;
|
|||||||
put ' %let fmtds=%scan(&syslast,2,.); ';
|
put ' %let fmtds=%scan(&syslast,2,.); ';
|
||||||
put ' /* prepare formats and varnames */ ';
|
put ' /* prepare formats and varnames */ ';
|
||||||
put ' data _null_; ';
|
put ' data _null_; ';
|
||||||
put ' set &fmtds end=last; ';
|
put ' if _n_=1 then call symputx(''nobs'',nobs,''l''); ';
|
||||||
|
put ' set &fmtds end=last nobs=nobs; ';
|
||||||
put ' name=upcase(name); ';
|
put ' name=upcase(name); ';
|
||||||
put ' /* fix formats */ ';
|
put ' /* fix formats */ ';
|
||||||
put ' if type=2 or type=6 then do; ';
|
put ' if type=2 or type=6 then do; ';
|
||||||
@@ -13655,7 +13768,6 @@ data _null_;
|
|||||||
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
||||||
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
||||||
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
||||||
put ' if last then call symputx(''nobs'',_n_,''l''); ';
|
|
||||||
put ' run; ';
|
put ' run; ';
|
||||||
put ' data &fmtds; ';
|
put ' data &fmtds; ';
|
||||||
put ' /* rename on entry */ ';
|
put ' /* rename on entry */ ';
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
/**
|
/**
|
||||||
@file
|
@file
|
||||||
@brief to be deprecated
|
@brief Abort, ungracefully
|
||||||
@details We will deprecate this macro in 2022
|
@details Will abort with a straightforward %abort if the condition is true.
|
||||||
|
|
||||||
As you can see, it's not a macro function.
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_abort.sas
|
||||||
Use mp_abort.sas instead.
|
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
@cond
|
@cond
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mf_abort(mac=mf_abort.sas, type=, msg=, iftrue=%str(1=1)
|
%macro mf_abort(mac=mf_abort.sas, type=deprecated, msg=, iftrue=%str(1=1)
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
%if not(%eval(%unquote(&iftrue))) %then %return;
|
%if not(%eval(%unquote(&iftrue))) %then %return;
|
||||||
@@ -21,116 +20,8 @@
|
|||||||
%if %length(&mac)>0 %then %put NOTE- called by &mac;
|
%if %length(&mac)>0 %then %put NOTE- called by &mac;
|
||||||
%put NOTE - &msg;
|
%put NOTE - &msg;
|
||||||
|
|
||||||
/* Stored Process Server web app context */
|
%abort;
|
||||||
%if %symexist(_metaperson) or "&SYSPROCESSNAME"="Compute Server" %then %do;
|
|
||||||
options obs=max replace nosyntaxcheck mprint;
|
|
||||||
/* extract log err / warn, if exist */
|
|
||||||
%local logloc logline;
|
|
||||||
%global logmsg; /* capture global messages */
|
|
||||||
%if %symexist(SYSPRINTTOLOG) %then %let logloc=&SYSPRINTTOLOG;
|
|
||||||
%else %let logloc=%qsysfunc(getoption(LOG));
|
|
||||||
proc printto log=log;run;
|
|
||||||
%if %length(&logloc)>0 %then %do;
|
|
||||||
%let logline=0;
|
|
||||||
data _null_;
|
|
||||||
infile &logloc lrecl=5000;
|
|
||||||
input; putlog _infile_;
|
|
||||||
i=1;
|
|
||||||
retain logonce 0;
|
|
||||||
if (
|
|
||||||
_infile_=:"%str(WARN)ING" or _infile_=:"%str(ERR)OR"
|
|
||||||
) and logonce=0
|
|
||||||
then do;
|
|
||||||
call symputx('logline',_n_);
|
|
||||||
logonce+1;
|
|
||||||
end;
|
|
||||||
run;
|
|
||||||
/* capture log including lines BEFORE the err */
|
|
||||||
%if &logline>0 %then %do;
|
|
||||||
data _null_;
|
|
||||||
infile &logloc lrecl=5000;
|
|
||||||
input;
|
|
||||||
i=1;
|
|
||||||
stoploop=0;
|
|
||||||
if _n_ ge &logline-5 and stoploop=0 then do until (i>12);
|
|
||||||
call symputx('logmsg',catx('\n',symget('logmsg'),_infile_));
|
|
||||||
input;
|
|
||||||
i+1;
|
|
||||||
stoploop=1;
|
|
||||||
end;
|
|
||||||
if stoploop=1 then stop;
|
|
||||||
run;
|
|
||||||
%end;
|
|
||||||
%end;
|
|
||||||
|
|
||||||
/* send response in SASjs JSON format */
|
%mend mf_abort;
|
||||||
data _null_;
|
|
||||||
file _webout mod lrecl=32000;
|
|
||||||
length msg $32767;
|
|
||||||
sasdatetime=datetime();
|
|
||||||
msg=cats(symget('msg'),'\n\nLog Extract:\n',symget('logmsg'));
|
|
||||||
/* escape the quotes */
|
|
||||||
msg=tranwrd(msg,'"','\"');
|
|
||||||
/* ditch the CRLFs as chrome complains */
|
|
||||||
msg=compress(msg,,'kw');
|
|
||||||
/* quote without quoting the quotes (which are escaped instead) */
|
|
||||||
msg=cats('"',msg,'"');
|
|
||||||
if symexist('_debug') then debug=symget('_debug');
|
|
||||||
if debug ge 131 then put '>>weboutBEGIN<<';
|
|
||||||
put '{"START_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '"';
|
|
||||||
put ',"sasjsAbort" : [{';
|
|
||||||
put ' "MSG":' msg ;
|
|
||||||
put ' ,"MAC": "' "&mac" '"}]';
|
|
||||||
put ",""SYSUSERID"" : ""&sysuserid"" ";
|
|
||||||
if symexist('_metauser') then do;
|
|
||||||
_METAUSER=quote(trim(symget('_METAUSER')));
|
|
||||||
put ",""_METAUSER"": " _METAUSER;
|
|
||||||
_METAPERSON=quote(trim(symget('_METAPERSON')));
|
|
||||||
put ',"_METAPERSON": ' _METAPERSON;
|
|
||||||
end;
|
|
||||||
_PROGRAM=quote(trim(resolve(symget('_PROGRAM'))));
|
|
||||||
put ',"_PROGRAM" : ' _PROGRAM ;
|
|
||||||
put ",""SYSCC"" : ""&syscc"" ";
|
|
||||||
put ",""SYSERRORTEXT"" : ""&syserrortext"" ";
|
|
||||||
put ",""SYSJOBID"" : ""&sysjobid"" ";
|
|
||||||
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
|
||||||
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
|
||||||
put "}" @;
|
|
||||||
%if &_debug ge 131 %then %do;
|
|
||||||
put '>>weboutEND<<';
|
|
||||||
%end;
|
|
||||||
run;
|
|
||||||
%let syscc=0;
|
|
||||||
%if %symexist(SYS_JES_JOB_URI) %then %do;
|
|
||||||
/* refer web service output to file service in one hit */
|
|
||||||
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
|
|
||||||
name="_webout.json";
|
|
||||||
%let rc=%sysfunc(fcopy(_web,_webout));
|
|
||||||
%end;
|
|
||||||
%else %do;
|
|
||||||
data _null_;
|
|
||||||
if symexist('sysprocessmode')
|
|
||||||
then if symget("sysprocessmode")="SAS Stored Process Server"
|
|
||||||
then rc=stpsrvset('program error', 0);
|
|
||||||
run;
|
|
||||||
%end;
|
|
||||||
/**
|
|
||||||
* endsas is reliable but kills some deployments.
|
|
||||||
* Abort variants are ungraceful (non zero return code)
|
|
||||||
* This approach lets SAS run silently until the end :-)
|
|
||||||
*/
|
|
||||||
%put _all_;
|
|
||||||
filename skip temp;
|
|
||||||
data _null_;
|
|
||||||
file skip;
|
|
||||||
put '%macro skip(); %macro skippy();';
|
|
||||||
run;
|
|
||||||
%inc skip;
|
|
||||||
%end;
|
|
||||||
%else %do;
|
|
||||||
%put _all_;
|
|
||||||
%abort cancel;
|
|
||||||
%end;
|
|
||||||
%mend;
|
|
||||||
|
|
||||||
/** @endcond */
|
/** @endcond */
|
||||||
@@ -102,7 +102,8 @@
|
|||||||
%let fmtds=%scan(&syslast,2,.);
|
%let fmtds=%scan(&syslast,2,.);
|
||||||
/* prepare formats and varnames */
|
/* prepare formats and varnames */
|
||||||
data _null_;
|
data _null_;
|
||||||
set &fmtds end=last;
|
if _n_=1 then call symputx('nobs',nobs,'l');
|
||||||
|
set &fmtds end=last nobs=nobs;
|
||||||
name=upcase(name);
|
name=upcase(name);
|
||||||
/* fix formats */
|
/* fix formats */
|
||||||
if type=2 or type=6 then do;
|
if type=2 or type=6 then do;
|
||||||
@@ -128,7 +129,6 @@
|
|||||||
call symputx(cats('len',_n_),newlen,'l');
|
call symputx(cats('len',_n_),newlen,'l');
|
||||||
call symputx(cats('fmt',_n_),fmt,'l');
|
call symputx(cats('fmt',_n_),fmt,'l');
|
||||||
call symputx(cats('type',_n_),type,'l');
|
call symputx(cats('type',_n_),type,'l');
|
||||||
if last then call symputx('nobs',_n_,'l');
|
|
||||||
run;
|
run;
|
||||||
data &fmtds;
|
data &fmtds;
|
||||||
/* rename on entry */
|
/* rename on entry */
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Usage:
|
|||||||
%webout(OBJ,example2) * Object format, easier to work with ;
|
%webout(OBJ,example2) * Object format, easier to work with ;
|
||||||
%webout(CLOSE)
|
%webout(CLOSE)
|
||||||
;;;;
|
;;;;
|
||||||
%mm_createwebservice(path=/Public/app/common,name=appInit)
|
%mm_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001)
|
||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mm_createstp.sas
|
@li mm_createstp.sas
|
||||||
@@ -37,12 +37,15 @@ Usage:
|
|||||||
@param desc= The description of the service (optional)
|
@param desc= The description of the service (optional)
|
||||||
@param precode= Space separated list of filerefs, pointing to the code that
|
@param precode= Space separated list of filerefs, pointing to the code that
|
||||||
needs to be attached to the beginning of the service (optional)
|
needs to be attached to the beginning of the service (optional)
|
||||||
@param code= Space seperated fileref(s) of the actual code to be added
|
@param code=(ft15f001) Space seperated fileref(s) of the actual code to be
|
||||||
@param server= The server which will run the STP. Server name or uri is fine.
|
added
|
||||||
@param mDebug= set to 1 to show debug messages in the log
|
@param server=(SASApp) The server which will run the STP. Server name or uri
|
||||||
@param replace= select YES to replace any existing service in that location
|
is fine.
|
||||||
@param adapter= the macro uses the sasjs adapter by default. To use another
|
@param mDebug=(0) set to 1 to show debug messages in the log
|
||||||
adapter, add a (different) fileref here.
|
@param replace=(YES) select NO to avoid replacing an existing service in that
|
||||||
|
location
|
||||||
|
@param adapter=(sasjs) the macro uses the sasjs adapter by default. To use
|
||||||
|
another adapter, add a (different) fileref here.
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
@@ -52,11 +55,11 @@ Usage:
|
|||||||
%macro mm_createwebservice(path=
|
%macro mm_createwebservice(path=
|
||||||
,name=initService
|
,name=initService
|
||||||
,precode=
|
,precode=
|
||||||
,code=
|
,code=ft15f001
|
||||||
,desc=This stp was created automagically by the mm_createwebservice macro
|
,desc=This stp was created automagically by the mm_createwebservice macro
|
||||||
,mDebug=0
|
,mDebug=0
|
||||||
,server=SASApp
|
,server=SASApp
|
||||||
,replace=NO
|
,replace=YES
|
||||||
,adapter=sasjs
|
,adapter=sasjs
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
@@ -131,7 +134,8 @@ data _null_;
|
|||||||
put ' %let fmtds=%scan(&syslast,2,.); ';
|
put ' %let fmtds=%scan(&syslast,2,.); ';
|
||||||
put ' /* prepare formats and varnames */ ';
|
put ' /* prepare formats and varnames */ ';
|
||||||
put ' data _null_; ';
|
put ' data _null_; ';
|
||||||
put ' set &fmtds end=last; ';
|
put ' if _n_=1 then call symputx(''nobs'',nobs,''l''); ';
|
||||||
|
put ' set &fmtds end=last nobs=nobs; ';
|
||||||
put ' name=upcase(name); ';
|
put ' name=upcase(name); ';
|
||||||
put ' /* fix formats */ ';
|
put ' /* fix formats */ ';
|
||||||
put ' if type=2 or type=6 then do; ';
|
put ' if type=2 or type=6 then do; ';
|
||||||
@@ -157,7 +161,6 @@ data _null_;
|
|||||||
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
||||||
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
||||||
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
||||||
put ' if last then call symputx(''nobs'',_n_,''l''); ';
|
|
||||||
put ' run; ';
|
put ' run; ';
|
||||||
put ' data &fmtds; ';
|
put ' data &fmtds; ';
|
||||||
put ' /* rename on entry */ ';
|
put ' /* rename on entry */ ';
|
||||||
@@ -468,4 +471,4 @@ run;
|
|||||||
%put &url?_PROGRAM=&path/&name;
|
%put &url?_PROGRAM=&path/&name;
|
||||||
%put ;%put ;%put ;%put ;%put ;%put ;
|
%put ;%put ;%put ;%put ;%put ;%put ;
|
||||||
|
|
||||||
%mend;
|
%mend mm_createwebservice;
|
||||||
|
|||||||
34
tests/viya/mfv_existfile.test.sas
Normal file
34
tests/viya/mfv_existfile.test.sas
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mfv_existfile macro function
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_uid.sas
|
||||||
|
@li mfv_existfile.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
@li mv_createfile.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
options mprint sgen;
|
||||||
|
|
||||||
|
%let file=%mf_uid();
|
||||||
|
|
||||||
|
/* create a folder */
|
||||||
|
filename somefile temp;
|
||||||
|
data _null_;
|
||||||
|
file somefile;
|
||||||
|
put 'hello testings';
|
||||||
|
run;
|
||||||
|
%mv_createfile(path=&mcTestAppLoc/temp, name=&file..txt,inref=somefile)
|
||||||
|
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%mfv_existfile(&mcTestAppLoc/temp/&file..txt)=1),
|
||||||
|
desc=Check if created file exists
|
||||||
|
)
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%mfv_existfile(&mcTestAppLoc/temp/%mf_uid().txt)=0),
|
||||||
|
desc=Check if non created file does not exist
|
||||||
|
)
|
||||||
29
tests/viya/mfv_existfolder.test.sas
Normal file
29
tests/viya/mfv_existfolder.test.sas
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mfv_existfolder macro function
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_uid.sas
|
||||||
|
@li mfv_existfolder.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
@li mv_createfolder.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
options mprint sgen;
|
||||||
|
|
||||||
|
%let folder=%mf_uid();
|
||||||
|
|
||||||
|
/* create a folder */
|
||||||
|
%mv_createfolder(path=&mcTestAppLoc/temp/&folder)
|
||||||
|
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%mfv_existfolder(&mcTestAppLoc/temp/&folder)=1),
|
||||||
|
desc=Check if created folder exists
|
||||||
|
)
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%mfv_existfolder(&mcTestAppLoc/temp/&folder/%mf_uid()/noway)=0),
|
||||||
|
desc=Check if non created folder does not exist
|
||||||
|
)
|
||||||
42
tests/viya/mv_createfile.test.sas
Normal file
42
tests/viya/mv_createfile.test.sas
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mv_createfile macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_uid.sas
|
||||||
|
@li mfv_existfile.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
@li mv_createfile.sas
|
||||||
|
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
options mprint;
|
||||||
|
|
||||||
|
%let file=%mf_uid();
|
||||||
|
|
||||||
|
%put TEST 1 - basic file upload ;
|
||||||
|
filename somefile temp;
|
||||||
|
data _null_;
|
||||||
|
file somefile;
|
||||||
|
put 'hello testings';
|
||||||
|
run;
|
||||||
|
%mv_createfile(path=&mcTestAppLoc/temp, name=&file..txt,inref=somefile)
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%mfv_existfile(&mcTestAppLoc/temp/&file..txt)=1),
|
||||||
|
desc=Check if created file exists
|
||||||
|
)
|
||||||
|
|
||||||
|
%put TEST 2 - dataset upload ;
|
||||||
|
data temp;
|
||||||
|
x=1;
|
||||||
|
run;
|
||||||
|
filename ds "%sysfunc(pathname(work))/temp.sas7bdat";
|
||||||
|
|
||||||
|
%mv_createfile(path=&mcTestAppLoc/temp, name=&file..sas7bdat,inref=ds)
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%mfv_existfile(&mcTestAppLoc/temp/&file..sas7bdat)=1),
|
||||||
|
desc=Check if created dataset exists
|
||||||
|
)
|
||||||
@@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
options mprint notes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test Case 1
|
* Test Case 1
|
||||||
*/
|
*/
|
||||||
|
|||||||
48
viya/mfv_existfile.sas
Normal file
48
viya/mfv_existfile.sas
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Checks whether a file exists in SAS Drive
|
||||||
|
@details Returns 1 if the file exists, and 0 if it doesn't. Works by
|
||||||
|
attempting to assign a fileref with the filesrvc engine. If not found, the
|
||||||
|
syscc is automatically set to a non zero value - so in this case it is reset.
|
||||||
|
To avoid hiding issues, there is therefore a test at the start to ensure the
|
||||||
|
syscc is zero.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%put %mfv_existfile(/does/exist.txt);
|
||||||
|
%put %mfv_existfile(/does/not/exist.txt);
|
||||||
|
|
||||||
|
@param filepath The full path to the file on SAS drive (eg /Public/myfile.txt)
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_abort.sas
|
||||||
|
@li mf_getuniquefileref.sas
|
||||||
|
|
||||||
|
@version 3.5
|
||||||
|
@author [Allan Bowe](https://www.linkedin.com/in/allanbowe/)
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mfv_existfile(filepath
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%mf_abort(
|
||||||
|
iftrue=(&syscc ne 0),
|
||||||
|
msg=Cannot enter mfv_existfile.sas with syscc=&syscc
|
||||||
|
)
|
||||||
|
|
||||||
|
%local fref rc path name;
|
||||||
|
%let fref=%mf_getuniquefileref();
|
||||||
|
%let name=%scan(&filepath,-1,/);
|
||||||
|
%let path=%substr(&filepath,1,%length(&filepath)-%length(&name)-1);
|
||||||
|
|
||||||
|
%if %sysfunc(filename(fref,,filesrvc,folderPath="&path" filename="&name"))=0
|
||||||
|
%then %do;
|
||||||
|
%sysfunc(fexist(&fref))
|
||||||
|
%let rc=%sysfunc(filename(fref));
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
0
|
||||||
|
%let syscc=0;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mfv_existfile;
|
||||||
45
viya/mfv_existfolder.sas
Normal file
45
viya/mfv_existfolder.sas
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Checks whether a folder exists in SAS Drive
|
||||||
|
@details Returns 1 if the folder exists, and 0 if it doesn't. Works by
|
||||||
|
attempting to assign a fileref with the filesrvc engine. If not found, the
|
||||||
|
syscc is automatically set to a non zero value - so in this case it is reset.
|
||||||
|
To avoid hiding issues, there is therefore a test at the start to ensure the
|
||||||
|
syscc is zero.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%put %mfv_existfolder(/does/exist);
|
||||||
|
%put %mfv_existfolder(/does/not/exist);
|
||||||
|
|
||||||
|
@param path The path to the folder on SAS drive
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_abort.sas
|
||||||
|
@li mf_getuniquefileref.sas
|
||||||
|
|
||||||
|
@version 3.5
|
||||||
|
@author [Allan Bowe](https://www.linkedin.com/in/allanbowe/)
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mfv_existfolder(path
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%mf_abort(
|
||||||
|
iftrue=(&syscc ne 0),
|
||||||
|
msg=Cannot enter mfv_existfolder.sas with syscc=&syscc
|
||||||
|
)
|
||||||
|
|
||||||
|
%local fref rc;
|
||||||
|
%let fref=%mf_getuniquefileref();
|
||||||
|
|
||||||
|
%if %sysfunc(filename(fref,,filesrvc,folderPath="&path"))=0 %then %do;
|
||||||
|
1
|
||||||
|
%let rc=%sysfunc(filename(fref));
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
0
|
||||||
|
%let syscc=0;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mfv_existfolder;
|
||||||
97
viya/mv_createfile.sas
Normal file
97
viya/mv_createfile.sas
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Creates a file in SAS Drive
|
||||||
|
@details Creates a file in SAS Drive and adds the appropriate content type.
|
||||||
|
If the parent folder does not exist, it is created.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
filename myfile temp;
|
||||||
|
data _null_;
|
||||||
|
file myfile;
|
||||||
|
put 'something';
|
||||||
|
run;
|
||||||
|
%mv_createfile(path=/Public/temp,name=newfile.txt,inref=myfile)
|
||||||
|
|
||||||
|
|
||||||
|
@param [in] path= The parent folder in which to create the file
|
||||||
|
@param [in] name= The name of the file to be created
|
||||||
|
@param [in] inref= The fileref pointing to the file to be uploaded
|
||||||
|
@param [in] access_token_var= The global macro variable to contain the access
|
||||||
|
token, if using authorization_code grant type.
|
||||||
|
@param [in] grant_type= (sas_services) Valid values are:
|
||||||
|
@li password
|
||||||
|
@li authorization_code
|
||||||
|
@li sas_services
|
||||||
|
|
||||||
|
@param [in] mdebug= (0) Set to 1 to enable DEBUG messages
|
||||||
|
|
||||||
|
@version VIYA V.03.05
|
||||||
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_getuniquefileref.sas
|
||||||
|
@li mf_isblank.sas
|
||||||
|
@li mp_abort.sas
|
||||||
|
@li mp_binarycopy.sas
|
||||||
|
@li mv_createfolder.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mv_createfile(path=
|
||||||
|
,name=
|
||||||
|
,inref=
|
||||||
|
,access_token_var=ACCESS_TOKEN
|
||||||
|
,grant_type=sas_services
|
||||||
|
,mdebug=0
|
||||||
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
|
%local oauth_bearer;
|
||||||
|
%if &grant_type=detect %then %do;
|
||||||
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
|
%else %let grant_type=sas_services;
|
||||||
|
%end;
|
||||||
|
%if &grant_type=sas_services %then %do;
|
||||||
|
%let oauth_bearer=oauth_bearer=sas_services;
|
||||||
|
%let &access_token_var=;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
|
||||||
|
and &grant_type ne sas_services
|
||||||
|
)
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(Invalid value for grant_type: &grant_type)
|
||||||
|
)
|
||||||
|
|
||||||
|
%mp_abort(iftrue=(%mf_isblank(&path)=1 or %length(&path)=1)
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(path value must be provided)
|
||||||
|
)
|
||||||
|
%mp_abort(iftrue=(%mf_isblank(&name)=1 or %length(&name)=1)
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(name value with length >1 must be provided)
|
||||||
|
)
|
||||||
|
|
||||||
|
/* create folder if it does not already exist */
|
||||||
|
%mv_createfolder(path=&path
|
||||||
|
,access_token_var=&access_token_var
|
||||||
|
,grant_type=&grant_type
|
||||||
|
,mdebug=&mdebug
|
||||||
|
)
|
||||||
|
|
||||||
|
/* create file with relevant options */
|
||||||
|
%local fref;
|
||||||
|
%let fref=%mf_getuniquefileref();
|
||||||
|
filename &fref filesrvc folderPath="&path" filename="&name";
|
||||||
|
|
||||||
|
%mp_binarycopy(inref=&inref, outref=&fref)
|
||||||
|
|
||||||
|
filename &fref clear;
|
||||||
|
|
||||||
|
%mend mv_createfile;
|
||||||
@@ -1,17 +1,22 @@
|
|||||||
/**
|
/**
|
||||||
@file mv_createfolder.sas
|
@file mv_createfolder.sas
|
||||||
@brief Creates a viya folder if that folder does not already exist
|
@brief Creates a viya folder if that folder does not already exist
|
||||||
@details Expects oauth token in a global macro variable (default
|
@details Creates a viya folder by checking if each parent folder exists, and
|
||||||
ACCESS_TOKEN).
|
recursively creating children if needed.
|
||||||
|
Usage:
|
||||||
|
|
||||||
%mv_createfolder(path=/Public)
|
%mv_createfolder(path=/Public)
|
||||||
|
|
||||||
|
|
||||||
@param path= The full path of the folder to be created
|
@param [in] path= The full path of the folder to be created
|
||||||
@param access_token_var= The global macro variable to contain the access token
|
@param [in] access_token_var= The global macro variable to contain the access
|
||||||
@param grant_type= (authorization_code) Valid values are "password" or
|
token, if using authorization_code grant type.
|
||||||
"authorization_code" (unquoted).
|
@param [in] grant_type= (sas_services) Valid values are:
|
||||||
|
@li password
|
||||||
|
@li authorization_code
|
||||||
|
@li sas_services
|
||||||
|
|
||||||
|
@param [in] mdebug=(0) set to 1 to enable DEBUG messages
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe, source: https://github.com/sasjs/core
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@@ -22,21 +27,36 @@
|
|||||||
@li mf_getuniquelibref.sas
|
@li mf_getuniquelibref.sas
|
||||||
@li mf_isblank.sas
|
@li mf_isblank.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
|
@li mfv_existfolder.sas
|
||||||
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mv_createfolder(path=
|
%macro mv_createfolder(path=
|
||||||
,access_token_var=ACCESS_TOKEN
|
,access_token_var=ACCESS_TOKEN
|
||||||
,grant_type=sas_services
|
,grant_type=sas_services
|
||||||
|
,mdebug=0
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
|
%if %mfv_existfolder(&path)=1 %then %do;
|
||||||
|
%put &sysmacroname: &path already exists;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
%else %let grant_type=sas_services;
|
%else %let grant_type=sas_services;
|
||||||
%end;
|
%end;
|
||||||
%if &grant_type=sas_services %then %do;
|
%if &grant_type=sas_services %then %do;
|
||||||
%let oauth_bearer=oauth_bearer=sas_services;
|
%let oauth_bearer=oauth_bearer=sas_services;
|
||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
|
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
|
||||||
@@ -91,6 +111,15 @@ options noquotelenmax;
|
|||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
||||||
)
|
)
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname following check to see if &newpath exists:;
|
||||||
|
%put _local_;
|
||||||
|
data _null_;
|
||||||
|
set &fname1;
|
||||||
|
input;
|
||||||
|
putlog _infile_;
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
%if &SYS_PROCHTTP_STATUS_CODE=200 %then %do;
|
%if &SYS_PROCHTTP_STATUS_CODE=200 %then %do;
|
||||||
%*put &sysmacroname &newpath exists so grab the follow on link ;
|
%*put &sysmacroname &newpath exists so grab the follow on link ;
|
||||||
data _null_;
|
data _null_;
|
||||||
@@ -140,8 +169,10 @@ options noquotelenmax;
|
|||||||
%put &sysmacroname &newpath now created. Grabbing the follow on link ;
|
%put &sysmacroname &newpath now created. Grabbing the follow on link ;
|
||||||
data _null_;
|
data _null_;
|
||||||
set &libref2..links;
|
set &libref2..links;
|
||||||
if rel='createChild' then
|
if rel='createChild' then do;
|
||||||
call symputx('href',quote(cats("&base_uri",href)),'l');
|
call symputx('href',quote(cats("&base_uri",href)),'l');
|
||||||
|
&dbg put (_all_)(=);
|
||||||
|
end;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
libname &libref2 clear;
|
libname &libref2 clear;
|
||||||
|
|||||||
@@ -282,7 +282,8 @@ data _null_;
|
|||||||
put ' %let fmtds=%scan(&syslast,2,.); ';
|
put ' %let fmtds=%scan(&syslast,2,.); ';
|
||||||
put ' /* prepare formats and varnames */ ';
|
put ' /* prepare formats and varnames */ ';
|
||||||
put ' data _null_; ';
|
put ' data _null_; ';
|
||||||
put ' set &fmtds end=last; ';
|
put ' if _n_=1 then call symputx(''nobs'',nobs,''l''); ';
|
||||||
|
put ' set &fmtds end=last nobs=nobs; ';
|
||||||
put ' name=upcase(name); ';
|
put ' name=upcase(name); ';
|
||||||
put ' /* fix formats */ ';
|
put ' /* fix formats */ ';
|
||||||
put ' if type=2 or type=6 then do; ';
|
put ' if type=2 or type=6 then do; ';
|
||||||
@@ -308,7 +309,6 @@ data _null_;
|
|||||||
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
||||||
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
||||||
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
||||||
put ' if last then call symputx(''nobs'',_n_,''l''); ';
|
|
||||||
put ' run; ';
|
put ' run; ';
|
||||||
put ' data &fmtds; ';
|
put ' data &fmtds; ';
|
||||||
put ' /* rename on entry */ ';
|
put ' /* rename on entry */ ';
|
||||||
|
|||||||
Reference in New Issue
Block a user