64%macro mp_abort(mac=mp_abort.sas, msg=, iftrue=%str(1=1)
65 , errds=work.mp_abort_errds
71%
if not(%eval(%unquote(&iftrue))) %then %
return;
74%
if %length(&mac)>0 %then %put NOTE- called by &mac;
77%
if %symexist(_SYSINCLUDEFILEDEVICE)
79and %superq(SYSPROCESSNAME) ne %str(Compute Server)
81 %
if "*&_SYSINCLUDEFILEDEVICE*" ne
"**" %then %
do;
84 length mac $100 msg $5000;
96%
if %symexist(_PROGRAM)
97 or %superq(SYSPROCESSNAME) = %str(Compute Server)
100 options obs=max replace mprint;
101 %
if "%substr(&sysver,1,1)" ne
"4" and
"%substr(&sysver,1,1)" ne
"5"
103 options nosyntaxcheck;
106 %
if &mode=INCLUDE %then %
do;
107 %
if %sysfunc(exist(&errds))=1 %then %
do;
110 call symputx(
'iftrue',iftrue,
'l');
111 call symputx(
'mac',mac,
'l');
112 call symputx(
'msg',msg,
'l');
115 %
if (&iftrue)=0 %then %
return;
118 %put &sysmacroname: No include errors found;
124 %local logloc logline;
126 %
if %symexist(SYSPRINTTOLOG) %then %let logloc=&SYSPRINTTOLOG;
127 %
else %let logloc=%qsysfunc(getoption(LOG));
128 proc printto log=log;run;
130 %
if %length(&logloc)>0 %then %
do;
132 infile &logloc lrecl=5000;
133 input; putlog _infile_;
137 _infile_=:
"%str(WARN)ING" or _infile_=:
"%str(ERR)OR"
140 call symputx(
'logline',_n_);
145 %
if &logline>0 %then %
do;
147 infile &logloc lrecl=5000;
151 if _n_ ge &logline-15 and stoploop=0 then
do until (i>22);
152 call symputx(
'logmsg',catx(
'\n',symget(
'logmsg'),_infile_));
157 if stoploop=1 then stop;
162 %
if %symexist(SYS_JES_JOB_URI) %then %
do;
165 %
if "X&SYS_JES_JOB_URI.X"=
"XX" %then %
do;
166 filename _webout temp lrecl=999999 mod;
169 filename _webout filesrvc parenturi=
"&SYS_JES_JOB_URI"
170 name=
"_webout.json" lrecl=999999 mod;
173 %
else %
if %symexist(_sasjs_webout_headers) %then %
do;
178 %
if %sysfunc(filename(fref,&_sasjs_webout_headers))=0 %then %
do;
181 %let fid=%sysfunc(fopen(&fref,A));
182 %
if &fid=0 %then %
do;
183 %put %str(ERR)OR: %sysfunc(sysmsg());
186 %let rc=%sysfunc(fput(&fid,%str(Content-Type: application/json)));
187 %let rc=%sysfunc(fwrite(&fid));
188 %let rc=%sysfunc(fclose(&fid));
189 %let rc=%sysfunc(filename(&fref));
195 file _webout mod lrecl=32000 encoding=
'utf-8';
196 length msg syswarningtext syserrortext $32767 mode $10 ;
197 sasdatetime=datetime();
199 %
if &logline>0 %then %
do;
200 msg=cats(msg,
'\n\nLog Extract:\n',symget(
'logmsg'));
203 msg=tranwrd(msg,
'\',
'\\');
205 msg=tranwrd(msg,
'"',
'\"');
207 msg=compress(msg,,
'kw');
209 msg=cats(
'"',msg,
'"');
210 if symexist(
'_debug') then debug=quote(trim(symget('_debug')));
212 if symget('_sasjs_processmode')='Stored Program' then mode='SASJS';
213 if mode ne 'SASJS' then put '>>weboutBEGIN<<';
214 put '{
"SYSDATE" :
"' "&SYSDATE
" '"';
215 put ',
"SYSTIME" :
"' "&SYSTIME
" '"';
216 put ',
"sasjsAbort" : [{
';
218 put ' ,
"MAC":
"' "&mac
" '"}]
';
219 put ",""SYSUSERID"" : ""&sysuserid"" ";
220 put ',
"_DEBUG":
' debug ;
221 if symexist('_metauser
') then do;
222 _METAUSER=quote(trim(symget('_METAUSER
')));
223 put ',
"_METAUSER":
' _METAUSER;
225 /* _METAPERSON is not always set when _METAUSER is (e.g. Viya JES
226 sessions provide only _METAUSER) - guard it separately or SYMGET
227 raises "Invalid argument" and pollutes SYSERRORTEXT inside the
228 very abort JSON we are writing here. */
229 if symexist('_metaperson
') then do;
230 _METAPERSON=quote(trim(symget('_METAPERSON
')));
231 put ',
"_METAPERSON":
' _METAPERSON;
233 if symexist('SYS_JES_JOB_URI
') then do;
234 SYS_JES_JOB_URI=quote(trim(symget('SYS_JES_JOB_URI
')));
235 put ',
"SYS_JES_JOB_URI":
' SYS_JES_JOB_URI;
237 _PROGRAM=quote(trim(resolve(symget('_PROGRAM
'))));
238 put ',
"_PROGRAM" :
' _PROGRAM ;
239 put ",""SYSCC"" : ""&syscc"" ";
240 syserrortext=cats(symget('syserrortext
'));
241 if findc(syserrortext,'"\'!!'0A0D09000E0F010210111A'x) then do;
242 syserrortext='"'!!trim(
243 prxchange('s/
"/\\"/
',-1, /* double quote */
244 prxchange('s/\x0A/\n/
',-1, /* new line */
245 prxchange('s/\x0D/\r/
',-1, /* carriage return */
246 prxchange('s/\x09/\\t/
',-1, /* tab */
247 prxchange('s/\x00/\\u0000/
',-1, /* NUL */
248 prxchange('s/\x0E/\\u000E/
',-1, /* SS */
249 prxchange('s/\x0F/\\u000F/
',-1, /* SF */
250 prxchange('s/\x01/\\u0001/
',-1, /* SOH */
251 prxchange('s/\x02/\\u0002/
',-1, /* STX */
252 prxchange('s/\x10/\\u0010/
',-1, /* DLE */
253 prxchange('s/\x11/\\u0011/
',-1, /* DC1 */
254 prxchange('s/\x1A/\\u001A/
',-1, /* SUB */
255 prxchange('s/\\/\\\\/
',-1,syserrortext)
258 else syserrortext=cats('"',syserrortext,'"');
259 put ',"SYSERRORTEXT
" : ' syserrortext;
260 put ",
""SYSHOSTNAME
"" :
""&syshostname
"" ";
261 put ",
""SYSJOBID
"" :
""&sysjobid
"" ";
262 put ",
""SYSSCPL
"" :
""&sysscpl
"" ";
263 put ",
""SYSSITE
"" :
""&syssite
"" ";
264 sysvlong=quote(trim(symget('sysvlong')));
265 put ',"SYSVLONG
" : ' sysvlong;
266 syswarningtext=cats(symget('syswarningtext'));
267 if findc(syswarningtext,'"\
'!!'0A0D09000E0F010210111A
'x) then do;
268 syswarningtext='"'!!trim(
269 prxchange('s/"/\\
"/',-1, /* double quote */
270 prxchange('s/\x0A/\n/',-1, /* new line */
271 prxchange('s/\x0D/\r/',-1, /* carriage return */
272 prxchange('s/\x09/\\t/',-1, /* tab */
273 prxchange('s/\x00/\\u0000/',-1, /* NUL */
274 prxchange('s/\x0E/\\u000E/',-1, /* SS */
275 prxchange('s/\x0F/\\u000F/',-1, /* SF */
276 prxchange('s/\x01/\\u0001/',-1, /* SOH */
277 prxchange('s/\x02/\\u0002/',-1, /* STX */
278 prxchange('s/\x10/\\u0010/',-1, /* DLE */
279 prxchange('s/\x11/\\u0011/',-1, /* DC1 */
280 prxchange('s/\x1A/\\u001A/',-1, /* SUB */
281 prxchange('s/\\/\\\\/',-1,syswarningtext)
284 else syswarningtext=cats('"',syswarningtext,'"');
285 put ",""SYSWARNINGTEXT"" : " syswarningtext;
286 put ',
"END_DTTM" :
"' "%sysfunc(datetime(),E8601DT26.6)
" '" ';
288 if mode ne 'SASJS
' then put '>>weboutEND<<
';
293 %if "&sysprocessmode " = "SAS Stored Process Server " %then %do;
295 putlog 'stpsrvset program err and syscc
';
296 rc=stpsrvset('program error
', 0);
297 call symputx("syscc",0,"g");
300 and 1=0 /* deprecating this logic until we figure out a consistent abort */
301 and "%substr(%str(&sysvlong ),1,8)"="9.04.01M"
302 and "%substr(%str(&sysvlong ),9,1)">"5" %then %do;
303 /* skip approach (below) does not work in windows m6+ envs */
317 put '%macro skip();
';
318 comment '%mend skip; -> fix lint
';
319 put '%macro skippy();
';
320 comment '%mend skippy; -> fix lint
';
325 %else %if "&sysprocessmode " = "SAS Compute Server " %then %do;
326 /* endsas kills the session making it harder to fetch results */
328 syswarningtext=symget('syswarningtext
');
329 syserrortext=symget('syserrortext
');
330 abort_msg=symget('msg
');
331 syscc=symget('syscc
');
332 sysuserid=symget('sysuserid
');
333 iftrue=symget('iftrue
');
335 call symputx('syscc
',0);