diff --git a/all.sas b/all.sas index dbc1cfe..d59d73c 100644 --- a/all.sas +++ b/all.sas @@ -2246,236 +2246,236 @@ Usage: , mode=REGULAR )/*/STORE SOURCE*/; - %global sysprocessmode sysprocessname sasjs_stpsrv_header_loc; - %local fref fid i; +%global sysprocessmode sysprocessname sasjs_stpsrv_header_loc sasjsprocessmode; +%local fref fid i; - %if not(%eval(%unquote(&iftrue))) %then %return; +%if not(%eval(%unquote(&iftrue))) %then %return; - %put NOTE: /// mp_abort macro executing //; - %if %length(&mac)>0 %then %put NOTE- called by &mac; - %put NOTE - &msg; +%put NOTE: /// mp_abort macro executing //; +%if %length(&mac)>0 %then %put NOTE- called by &mac; +%put NOTE - &msg; - %if %symexist(_SYSINCLUDEFILEDEVICE) - /* abort cancel FILE does not restart outside the INCLUDE on Viya 3.5 */ - and %superq(SYSPROCESSNAME) ne %str(Compute Server) +%if %symexist(_SYSINCLUDEFILEDEVICE) +/* abort cancel FILE does not restart outside the INCLUDE on Viya 3.5 */ +and %superq(SYSPROCESSNAME) ne %str(Compute Server) +%then %do; + %if "*&_SYSINCLUDEFILEDEVICE*" ne "**" %then %do; + data &errds; + iftrue='1=1'; + length mac $100 msg $5000; + mac=symget('mac'); + msg=symget('msg'); + run; + data _null_; + abort cancel FILE; + run; + %return; + %end; +%end; + +/* Web App Context */ +%if %symexist(_PROGRAM) + or %superq(SYSPROCESSNAME) = %str(Compute Server) + or &mode=INCLUDE +%then %do; + options obs=max replace mprint; + %if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; - %if "*&_SYSINCLUDEFILEDEVICE*" ne "**" %then %do; - data &errds; - iftrue='1=1'; - length mac $100 msg $5000; - mac=symget('mac'); - msg=symget('msg'); - run; + options nosyntaxcheck; + %end; + + %if &mode=INCLUDE %then %do; + %if %sysfunc(exist(&errds))=1 %then %do; data _null_; - abort cancel FILE; + set &errds; + call symputx('iftrue',iftrue,'l'); + call symputx('mac',mac,'l'); + call symputx('msg',msg,'l'); + putlog (_all_)(=); run; + %if (&iftrue)=0 %then %return; + %end; + %else %do; + %put &sysmacroname: No include errors found; %return; %end; %end; - /* Web App Context */ - %if %symexist(_PROGRAM) - or %superq(SYSPROCESSNAME) = %str(Compute Server) - or &mode=INCLUDE - %then %do; - options obs=max replace mprint; - %if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" - %then %do; - options nosyntaxcheck; - %end; - - %if &mode=INCLUDE %then %do; - %if %sysfunc(exist(&errds))=1 %then %do; - data _null_; - set &errds; - call symputx('iftrue',iftrue,'l'); - call symputx('mac',mac,'l'); - call symputx('msg',msg,'l'); - putlog (_all_)(=); - run; - %if (&iftrue)=0 %then %return; - %end; - %else %do; - %put &sysmacroname: No include errors found; - %return; - %end; - %end; - - /* extract log errs / warns, 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; - %let logline=0; - %if %length(&logloc)>0 %then %do; + /* extract log errs / warns, 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; + %let logline=0; + %if %length(&logloc)>0 %then %do; + 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; putlog _infile_; + input; 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; + stoploop=0; + if _n_ ge &logline-15 and stoploop=0 then do until (i>22); + call symputx('logmsg',catx('\n',symget('logmsg'),_infile_)); input; - i=1; - stoploop=0; - if _n_ ge &logline-15 and stoploop=0 then do until (i>22); - call symputx('logmsg',catx('\n',symget('logmsg'),_infile_)); - input; - i+1; - stoploop=1; - end; - if stoploop=1 then stop; - run; - %end; - %end; - - %if %symexist(SYS_JES_JOB_URI) %then %do; - /* setup webout for Viya */ - options nobomfile; - %if "X&SYS_JES_JOB_URI.X"="XX" %then %do; - filename _webout temp lrecl=999999 mod; - %end; - %else %do; - filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" - name="_webout.json" lrecl=999999 mod; - %end; - %end; - %else %if %sysfunc(filename(fref,&sasjs_stpsrv_header_loc))=0 %then %do; - options nobomfile; - /* set up http header for SASjs Server */ - %let fid=%sysfunc(fopen(&fref,A)); - %if &fid=0 %then %do; - %put %str(ERR)OR: %sysfunc(sysmsg()); - %return; - %end; - %let rc=%sysfunc(fput(&fid,%str(Content-Type: application/json))); - %let rc=%sysfunc(fwrite(&fid)); - %let rc=%sysfunc(fclose(&fid)); - %let rc=%sysfunc(filename(&fref)); - %end; - - /* send response in SASjs JSON format */ - data _null_; - file _webout mod lrecl=32000 encoding='utf-8'; - length msg syswarningtext syserrortext $32767 mode $10 ; - sasdatetime=datetime(); - msg=symget('msg'); - %if &logline>0 %then %do; - msg=cats(msg,'\n\nLog Extract:\n',symget('logmsg')); - %end; - /* escape the escapes */ - msg=tranwrd(msg,'\','\\'); - /* 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=quote(trim(symget('_debug'))); - else debug='""'; - if symget('sasjsprocessmode')='Stored Program' then mode='SASJS'; - if mode ne 'SASJS' then put '>>weboutBEGIN<<'; - put '{"SYSDATE" : "' "&SYSDATE" '"'; - put ',"SYSTIME" : "' "&SYSTIME" '"'; - put ',"sasjsAbort" : [{'; - put ' "MSG":' msg ; - put ' ,"MAC": "' "&mac" '"}]'; - put ",""SYSUSERID"" : ""&sysuserid"" "; - put ',"_DEBUG":' debug ; - if symexist('_metauser') then do; - _METAUSER=quote(trim(symget('_METAUSER'))); - put ",""_METAUSER"": " _METAUSER; - _METAPERSON=quote(trim(symget('_METAPERSON'))); - put ',"_METAPERSON": ' _METAPERSON; - end; - if symexist('SYS_JES_JOB_URI') then do; - SYS_JES_JOB_URI=quote(trim(symget('SYS_JES_JOB_URI'))); - put ',"SYS_JES_JOB_URI": ' SYS_JES_JOB_URI; - end; - _PROGRAM=quote(trim(resolve(symget('_PROGRAM')))); - put ',"_PROGRAM" : ' _PROGRAM ; - put ",""SYSCC"" : ""&syscc"" "; - syserrortext=quote(trim(symget('syserrortext'))); - put ",""SYSERRORTEXT"" : " syserrortext; - put ",""SYSHOSTNAME"" : ""&syshostname"" "; - put ",""SYSJOBID"" : ""&sysjobid"" "; - put ",""SYSSCPL"" : ""&sysscpl"" "; - put ",""SYSSITE"" : ""&syssite"" "; - sysvlong=quote(trim(symget('sysvlong'))); - put ',"SYSVLONG" : ' sysvlong; - syswarningtext=quote(trim(symget('syswarningtext'))); - put ",""SYSWARNINGTEXT"" : " syswarningtext; - put ',"END_DTTM" : "' "%sysfunc(datetime(),E8601DT26.6)" '" '; - put "}" ; - if mode ne 'SASJS' then put '>>weboutEND<<'; - run; - - %put _all_; - - %if "&sysprocessmode " = "SAS Stored Process Server " %then %do; - data _null_; - putlog 'stpsrvset program err and syscc'; - rc=stpsrvset('program error', 0); - call symputx("syscc",0,"g"); + i+1; + stoploop=1; + end; + if stoploop=1 then stop; run; - %if &sysscp=WIN - and "%substr(%str(&sysvlong ),1,8)"="9.04.01M" - and "%substr(%str(&sysvlong ),9,1)">"5" %then %do; - /* skip approach (below) does not work in windows m6+ envs */ - endsas; - %end; - %else %do; - /** - * endsas kills 9.4m3 deployments by orphaning multibridges. - * Abort variants are ungraceful (non zero return code) - * This approach lets SAS run silently until the end :-) - * Caution - fails when called within a %include within a macro - * Use mp_include() to handle this. - */ - filename skip temp; - data _null_; - file skip; - put '%macro skip();'; - comment '%mend skip; -> fix lint '; - put '%macro skippy();'; - comment '%mend skippy; -> fix lint '; - run; - %inc skip; - %end; %end; - %else %if "&sysprocessmode " = "SAS Compute Server " %then %do; - /* endsas kills the session making it harder to fetch results */ - data _null_; - syswarningtext=symget('syswarningtext'); - syserrortext=symget('syserrortext'); - abort_msg=symget('msg'); - syscc=symget('syscc'); - sysuserid=symget('sysuserid'); - iftrue=symget('iftrue'); - put (_all_)(/=); - call symputx('syscc',0); - abort cancel nolist; - run; + %end; + + %if %symexist(SYS_JES_JOB_URI) %then %do; + /* setup webout for Viya */ + options nobomfile; + %if "X&SYS_JES_JOB_URI.X"="XX" %then %do; + filename _webout temp lrecl=999999 mod; %end; %else %do; - %abort cancel; + filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" + name="_webout.json" lrecl=999999 mod; %end; %end; + %else %if %sysfunc(filename(fref,&sasjs_stpsrv_header_loc))=0 %then %do; + options nobomfile; + /* set up http header for SASjs Server */ + %let fid=%sysfunc(fopen(&fref,A)); + %if &fid=0 %then %do; + %put %str(ERR)OR: %sysfunc(sysmsg()); + %return; + %end; + %let rc=%sysfunc(fput(&fid,%str(Content-Type: application/json))); + %let rc=%sysfunc(fwrite(&fid)); + %let rc=%sysfunc(fclose(&fid)); + %let rc=%sysfunc(filename(&fref)); + %end; + + /* send response in SASjs JSON format */ + data _null_; + file _webout mod lrecl=32000 encoding='utf-8'; + length msg syswarningtext syserrortext $32767 mode $10 ; + sasdatetime=datetime(); + msg=symget('msg'); + %if &logline>0 %then %do; + msg=cats(msg,'\n\nLog Extract:\n',symget('logmsg')); + %end; + /* escape the escapes */ + msg=tranwrd(msg,'\','\\'); + /* 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=quote(trim(symget('_debug'))); + else debug='""'; + if symget('sasjsprocessmode')='Stored Program' then mode='SASJS'; + if mode ne 'SASJS' then put '>>weboutBEGIN<<'; + put '{"SYSDATE" : "' "&SYSDATE" '"'; + put ',"SYSTIME" : "' "&SYSTIME" '"'; + put ',"sasjsAbort" : [{'; + put ' "MSG":' msg ; + put ' ,"MAC": "' "&mac" '"}]'; + put ",""SYSUSERID"" : ""&sysuserid"" "; + put ',"_DEBUG":' debug ; + if symexist('_metauser') then do; + _METAUSER=quote(trim(symget('_METAUSER'))); + put ",""_METAUSER"": " _METAUSER; + _METAPERSON=quote(trim(symget('_METAPERSON'))); + put ',"_METAPERSON": ' _METAPERSON; + end; + if symexist('SYS_JES_JOB_URI') then do; + SYS_JES_JOB_URI=quote(trim(symget('SYS_JES_JOB_URI'))); + put ',"SYS_JES_JOB_URI": ' SYS_JES_JOB_URI; + end; + _PROGRAM=quote(trim(resolve(symget('_PROGRAM')))); + put ',"_PROGRAM" : ' _PROGRAM ; + put ",""SYSCC"" : ""&syscc"" "; + syserrortext=quote(trim(symget('syserrortext'))); + put ",""SYSERRORTEXT"" : " syserrortext; + put ",""SYSHOSTNAME"" : ""&syshostname"" "; + put ",""SYSJOBID"" : ""&sysjobid"" "; + put ",""SYSSCPL"" : ""&sysscpl"" "; + put ",""SYSSITE"" : ""&syssite"" "; + sysvlong=quote(trim(symget('sysvlong'))); + put ',"SYSVLONG" : ' sysvlong; + syswarningtext=quote(trim(symget('syswarningtext'))); + put ",""SYSWARNINGTEXT"" : " syswarningtext; + put ',"END_DTTM" : "' "%sysfunc(datetime(),E8601DT26.6)" '" '; + put "}" ; + if mode ne 'SASJS' then put '>>weboutEND<<'; + run; + + %put _all_; + + %if "&sysprocessmode " = "SAS Stored Process Server " %then %do; + data _null_; + putlog 'stpsrvset program err and syscc'; + rc=stpsrvset('program error', 0); + call symputx("syscc",0,"g"); + run; + %if &sysscp=WIN + and "%substr(%str(&sysvlong ),1,8)"="9.04.01M" + and "%substr(%str(&sysvlong ),9,1)">"5" %then %do; + /* skip approach (below) does not work in windows m6+ envs */ + endsas; + %end; + %else %do; + /** + * endsas kills 9.4m3 deployments by orphaning multibridges. + * Abort variants are ungraceful (non zero return code) + * This approach lets SAS run silently until the end :-) + * Caution - fails when called within a %include within a macro + * Use mp_include() to handle this. + */ + filename skip temp; + data _null_; + file skip; + put '%macro skip();'; + comment '%mend skip; -> fix lint '; + put '%macro skippy();'; + comment '%mend skippy; -> fix lint '; + run; + %inc skip; + %end; + %end; + %else %if "&sysprocessmode " = "SAS Compute Server " %then %do; + /* endsas kills the session making it harder to fetch results */ + data _null_; + syswarningtext=symget('syswarningtext'); + syserrortext=symget('syserrortext'); + abort_msg=symget('msg'); + syscc=symget('syscc'); + sysuserid=symget('sysuserid'); + iftrue=symget('iftrue'); + put (_all_)(/=); + call symputx('syscc',0); + abort cancel nolist; + run; + %end; %else %do; - %put _all_; %abort cancel; %end; +%end; +%else %do; + %put _all_; + %abort cancel; +%end; %mend mp_abort; /** @endcond */ diff --git a/base/mp_abort.sas b/base/mp_abort.sas index f8be344..a2cecb2 100644 --- a/base/mp_abort.sas +++ b/base/mp_abort.sas @@ -63,236 +63,236 @@ , mode=REGULAR )/*/STORE SOURCE*/; - %global sysprocessmode sysprocessname sasjs_stpsrv_header_loc; - %local fref fid i; +%global sysprocessmode sysprocessname sasjs_stpsrv_header_loc sasjsprocessmode; +%local fref fid i; - %if not(%eval(%unquote(&iftrue))) %then %return; +%if not(%eval(%unquote(&iftrue))) %then %return; - %put NOTE: /// mp_abort macro executing //; - %if %length(&mac)>0 %then %put NOTE- called by &mac; - %put NOTE - &msg; +%put NOTE: /// mp_abort macro executing //; +%if %length(&mac)>0 %then %put NOTE- called by &mac; +%put NOTE - &msg; - %if %symexist(_SYSINCLUDEFILEDEVICE) - /* abort cancel FILE does not restart outside the INCLUDE on Viya 3.5 */ - and %superq(SYSPROCESSNAME) ne %str(Compute Server) +%if %symexist(_SYSINCLUDEFILEDEVICE) +/* abort cancel FILE does not restart outside the INCLUDE on Viya 3.5 */ +and %superq(SYSPROCESSNAME) ne %str(Compute Server) +%then %do; + %if "*&_SYSINCLUDEFILEDEVICE*" ne "**" %then %do; + data &errds; + iftrue='1=1'; + length mac $100 msg $5000; + mac=symget('mac'); + msg=symget('msg'); + run; + data _null_; + abort cancel FILE; + run; + %return; + %end; +%end; + +/* Web App Context */ +%if %symexist(_PROGRAM) + or %superq(SYSPROCESSNAME) = %str(Compute Server) + or &mode=INCLUDE +%then %do; + options obs=max replace mprint; + %if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; - %if "*&_SYSINCLUDEFILEDEVICE*" ne "**" %then %do; - data &errds; - iftrue='1=1'; - length mac $100 msg $5000; - mac=symget('mac'); - msg=symget('msg'); - run; + options nosyntaxcheck; + %end; + + %if &mode=INCLUDE %then %do; + %if %sysfunc(exist(&errds))=1 %then %do; data _null_; - abort cancel FILE; + set &errds; + call symputx('iftrue',iftrue,'l'); + call symputx('mac',mac,'l'); + call symputx('msg',msg,'l'); + putlog (_all_)(=); run; + %if (&iftrue)=0 %then %return; + %end; + %else %do; + %put &sysmacroname: No include errors found; %return; %end; %end; - /* Web App Context */ - %if %symexist(_PROGRAM) - or %superq(SYSPROCESSNAME) = %str(Compute Server) - or &mode=INCLUDE - %then %do; - options obs=max replace mprint; - %if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" - %then %do; - options nosyntaxcheck; - %end; - - %if &mode=INCLUDE %then %do; - %if %sysfunc(exist(&errds))=1 %then %do; - data _null_; - set &errds; - call symputx('iftrue',iftrue,'l'); - call symputx('mac',mac,'l'); - call symputx('msg',msg,'l'); - putlog (_all_)(=); - run; - %if (&iftrue)=0 %then %return; - %end; - %else %do; - %put &sysmacroname: No include errors found; - %return; - %end; - %end; - - /* extract log errs / warns, 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; - %let logline=0; - %if %length(&logloc)>0 %then %do; + /* extract log errs / warns, 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; + %let logline=0; + %if %length(&logloc)>0 %then %do; + 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; putlog _infile_; + input; 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; + stoploop=0; + if _n_ ge &logline-15 and stoploop=0 then do until (i>22); + call symputx('logmsg',catx('\n',symget('logmsg'),_infile_)); input; - i=1; - stoploop=0; - if _n_ ge &logline-15 and stoploop=0 then do until (i>22); - call symputx('logmsg',catx('\n',symget('logmsg'),_infile_)); - input; - i+1; - stoploop=1; - end; - if stoploop=1 then stop; - run; - %end; - %end; - - %if %symexist(SYS_JES_JOB_URI) %then %do; - /* setup webout for Viya */ - options nobomfile; - %if "X&SYS_JES_JOB_URI.X"="XX" %then %do; - filename _webout temp lrecl=999999 mod; - %end; - %else %do; - filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" - name="_webout.json" lrecl=999999 mod; - %end; - %end; - %else %if %sysfunc(filename(fref,&sasjs_stpsrv_header_loc))=0 %then %do; - options nobomfile; - /* set up http header for SASjs Server */ - %let fid=%sysfunc(fopen(&fref,A)); - %if &fid=0 %then %do; - %put %str(ERR)OR: %sysfunc(sysmsg()); - %return; - %end; - %let rc=%sysfunc(fput(&fid,%str(Content-Type: application/json))); - %let rc=%sysfunc(fwrite(&fid)); - %let rc=%sysfunc(fclose(&fid)); - %let rc=%sysfunc(filename(&fref)); - %end; - - /* send response in SASjs JSON format */ - data _null_; - file _webout mod lrecl=32000 encoding='utf-8'; - length msg syswarningtext syserrortext $32767 mode $10 ; - sasdatetime=datetime(); - msg=symget('msg'); - %if &logline>0 %then %do; - msg=cats(msg,'\n\nLog Extract:\n',symget('logmsg')); - %end; - /* escape the escapes */ - msg=tranwrd(msg,'\','\\'); - /* 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=quote(trim(symget('_debug'))); - else debug='""'; - if symget('sasjsprocessmode')='Stored Program' then mode='SASJS'; - if mode ne 'SASJS' then put '>>weboutBEGIN<<'; - put '{"SYSDATE" : "' "&SYSDATE" '"'; - put ',"SYSTIME" : "' "&SYSTIME" '"'; - put ',"sasjsAbort" : [{'; - put ' "MSG":' msg ; - put ' ,"MAC": "' "&mac" '"}]'; - put ",""SYSUSERID"" : ""&sysuserid"" "; - put ',"_DEBUG":' debug ; - if symexist('_metauser') then do; - _METAUSER=quote(trim(symget('_METAUSER'))); - put ",""_METAUSER"": " _METAUSER; - _METAPERSON=quote(trim(symget('_METAPERSON'))); - put ',"_METAPERSON": ' _METAPERSON; - end; - if symexist('SYS_JES_JOB_URI') then do; - SYS_JES_JOB_URI=quote(trim(symget('SYS_JES_JOB_URI'))); - put ',"SYS_JES_JOB_URI": ' SYS_JES_JOB_URI; - end; - _PROGRAM=quote(trim(resolve(symget('_PROGRAM')))); - put ',"_PROGRAM" : ' _PROGRAM ; - put ",""SYSCC"" : ""&syscc"" "; - syserrortext=quote(trim(symget('syserrortext'))); - put ",""SYSERRORTEXT"" : " syserrortext; - put ",""SYSHOSTNAME"" : ""&syshostname"" "; - put ",""SYSJOBID"" : ""&sysjobid"" "; - put ",""SYSSCPL"" : ""&sysscpl"" "; - put ",""SYSSITE"" : ""&syssite"" "; - sysvlong=quote(trim(symget('sysvlong'))); - put ',"SYSVLONG" : ' sysvlong; - syswarningtext=quote(trim(symget('syswarningtext'))); - put ",""SYSWARNINGTEXT"" : " syswarningtext; - put ',"END_DTTM" : "' "%sysfunc(datetime(),E8601DT26.6)" '" '; - put "}" ; - if mode ne 'SASJS' then put '>>weboutEND<<'; - run; - - %put _all_; - - %if "&sysprocessmode " = "SAS Stored Process Server " %then %do; - data _null_; - putlog 'stpsrvset program err and syscc'; - rc=stpsrvset('program error', 0); - call symputx("syscc",0,"g"); + i+1; + stoploop=1; + end; + if stoploop=1 then stop; run; - %if &sysscp=WIN - and "%substr(%str(&sysvlong ),1,8)"="9.04.01M" - and "%substr(%str(&sysvlong ),9,1)">"5" %then %do; - /* skip approach (below) does not work in windows m6+ envs */ - endsas; - %end; - %else %do; - /** - * endsas kills 9.4m3 deployments by orphaning multibridges. - * Abort variants are ungraceful (non zero return code) - * This approach lets SAS run silently until the end :-) - * Caution - fails when called within a %include within a macro - * Use mp_include() to handle this. - */ - filename skip temp; - data _null_; - file skip; - put '%macro skip();'; - comment '%mend skip; -> fix lint '; - put '%macro skippy();'; - comment '%mend skippy; -> fix lint '; - run; - %inc skip; - %end; %end; - %else %if "&sysprocessmode " = "SAS Compute Server " %then %do; - /* endsas kills the session making it harder to fetch results */ - data _null_; - syswarningtext=symget('syswarningtext'); - syserrortext=symget('syserrortext'); - abort_msg=symget('msg'); - syscc=symget('syscc'); - sysuserid=symget('sysuserid'); - iftrue=symget('iftrue'); - put (_all_)(/=); - call symputx('syscc',0); - abort cancel nolist; - run; + %end; + + %if %symexist(SYS_JES_JOB_URI) %then %do; + /* setup webout for Viya */ + options nobomfile; + %if "X&SYS_JES_JOB_URI.X"="XX" %then %do; + filename _webout temp lrecl=999999 mod; %end; %else %do; - %abort cancel; + filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" + name="_webout.json" lrecl=999999 mod; %end; %end; + %else %if %sysfunc(filename(fref,&sasjs_stpsrv_header_loc))=0 %then %do; + options nobomfile; + /* set up http header for SASjs Server */ + %let fid=%sysfunc(fopen(&fref,A)); + %if &fid=0 %then %do; + %put %str(ERR)OR: %sysfunc(sysmsg()); + %return; + %end; + %let rc=%sysfunc(fput(&fid,%str(Content-Type: application/json))); + %let rc=%sysfunc(fwrite(&fid)); + %let rc=%sysfunc(fclose(&fid)); + %let rc=%sysfunc(filename(&fref)); + %end; + + /* send response in SASjs JSON format */ + data _null_; + file _webout mod lrecl=32000 encoding='utf-8'; + length msg syswarningtext syserrortext $32767 mode $10 ; + sasdatetime=datetime(); + msg=symget('msg'); + %if &logline>0 %then %do; + msg=cats(msg,'\n\nLog Extract:\n',symget('logmsg')); + %end; + /* escape the escapes */ + msg=tranwrd(msg,'\','\\'); + /* 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=quote(trim(symget('_debug'))); + else debug='""'; + if symget('sasjsprocessmode')='Stored Program' then mode='SASJS'; + if mode ne 'SASJS' then put '>>weboutBEGIN<<'; + put '{"SYSDATE" : "' "&SYSDATE" '"'; + put ',"SYSTIME" : "' "&SYSTIME" '"'; + put ',"sasjsAbort" : [{'; + put ' "MSG":' msg ; + put ' ,"MAC": "' "&mac" '"}]'; + put ",""SYSUSERID"" : ""&sysuserid"" "; + put ',"_DEBUG":' debug ; + if symexist('_metauser') then do; + _METAUSER=quote(trim(symget('_METAUSER'))); + put ",""_METAUSER"": " _METAUSER; + _METAPERSON=quote(trim(symget('_METAPERSON'))); + put ',"_METAPERSON": ' _METAPERSON; + end; + if symexist('SYS_JES_JOB_URI') then do; + SYS_JES_JOB_URI=quote(trim(symget('SYS_JES_JOB_URI'))); + put ',"SYS_JES_JOB_URI": ' SYS_JES_JOB_URI; + end; + _PROGRAM=quote(trim(resolve(symget('_PROGRAM')))); + put ',"_PROGRAM" : ' _PROGRAM ; + put ",""SYSCC"" : ""&syscc"" "; + syserrortext=quote(trim(symget('syserrortext'))); + put ",""SYSERRORTEXT"" : " syserrortext; + put ",""SYSHOSTNAME"" : ""&syshostname"" "; + put ",""SYSJOBID"" : ""&sysjobid"" "; + put ",""SYSSCPL"" : ""&sysscpl"" "; + put ",""SYSSITE"" : ""&syssite"" "; + sysvlong=quote(trim(symget('sysvlong'))); + put ',"SYSVLONG" : ' sysvlong; + syswarningtext=quote(trim(symget('syswarningtext'))); + put ",""SYSWARNINGTEXT"" : " syswarningtext; + put ',"END_DTTM" : "' "%sysfunc(datetime(),E8601DT26.6)" '" '; + put "}" ; + if mode ne 'SASJS' then put '>>weboutEND<<'; + run; + + %put _all_; + + %if "&sysprocessmode " = "SAS Stored Process Server " %then %do; + data _null_; + putlog 'stpsrvset program err and syscc'; + rc=stpsrvset('program error', 0); + call symputx("syscc",0,"g"); + run; + %if &sysscp=WIN + and "%substr(%str(&sysvlong ),1,8)"="9.04.01M" + and "%substr(%str(&sysvlong ),9,1)">"5" %then %do; + /* skip approach (below) does not work in windows m6+ envs */ + endsas; + %end; + %else %do; + /** + * endsas kills 9.4m3 deployments by orphaning multibridges. + * Abort variants are ungraceful (non zero return code) + * This approach lets SAS run silently until the end :-) + * Caution - fails when called within a %include within a macro + * Use mp_include() to handle this. + */ + filename skip temp; + data _null_; + file skip; + put '%macro skip();'; + comment '%mend skip; -> fix lint '; + put '%macro skippy();'; + comment '%mend skippy; -> fix lint '; + run; + %inc skip; + %end; + %end; + %else %if "&sysprocessmode " = "SAS Compute Server " %then %do; + /* endsas kills the session making it harder to fetch results */ + data _null_; + syswarningtext=symget('syswarningtext'); + syserrortext=symget('syserrortext'); + abort_msg=symget('msg'); + syscc=symget('syscc'); + sysuserid=symget('sysuserid'); + iftrue=symget('iftrue'); + put (_all_)(/=); + call symputx('syscc',0); + abort cancel nolist; + run; + %end; %else %do; - %put _all_; %abort cancel; %end; +%end; +%else %do; + %put _all_; + %abort cancel; +%end; %mend mp_abort; /** @endcond */