54%macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=N,missing=NULL
55 ,showmeta=N,maxobs=MAX,workobs=0
57%global _webin_file_count _webin_fileref1 _webin_name1 _program _debug
59%local i tempds jsonengine;
62%
if "%upcase(&SYSENCODING)" ne
"UTF-8" %then %let jsonengine=PROCJSON;
63%
else %let jsonengine=DATASTEP;
66%
if &action=FETCH %then %
do;
67 %
if %str(&_debug) ge 131 %then %
do;
68 options mprint notes mprintnest;
70 %let _webin_file_count=%eval(&_webin_file_count+0);
72 %
do i=1 %to &_webin_file_count;
73 %
if &_webin_file_count=1 %then %
do;
74 %let _webin_fileref1=&_webin_fileref;
75 %let _webin_name1=&_webin_name;
78 infile &&_webin_fileref&i termstr=crlf;
80 call symputx(
'input_statement',_infile_);
81 putlog
"&&_webin_name&i input statement: " _infile_;
84 infile &&_webin_fileref&i firstobs=2 dsd termstr=crlf encoding=
'utf-8';
85 input &input_statement;
86 %
if %str(&_debug) ge 131 %then %
do;
87 if _n_<20 then putlog _infile_;
90 %let sasjs_tables=&sasjs_tables &&_webin_name&i;
94%
else %
if &action=OPEN %then %
do;
103 set sashelp.vextfl(where=(fileref=
"_WEBOUT"));
104 if xengine=
'STREAM' then
do;
105 rc=stpsrv_header(
'Content-type',
"text/html; encoding=utf-8");
110 data _null_;file &fref encoding=
'utf-8';
111 %
if %str(&_debug) ge 131 %then %
do;
112 put
'>>weboutBEGIN<<';
114 put
'{"SYSDATE" : "' "&SYSDATE" '"';
115 put
',"SYSTIME" : "' "&SYSTIME" '"';
120%
else %
if &action=ARR or &action=OBJ %then %
do;
121 %mp_jsonout(&action,&ds,dslabel=&dslabel,fmt=&fmt,jref=&fref
122 ,engine=&jsonengine,missing=&missing,showmeta=&showmeta,maxobs=&maxobs
125%
else %
if &action=CLOSE %then %
do;
127 filename _sjsref temp lrecl=131068;
128 %
if %str(&workobs) > 0 %then %
do;
130 data;run;%let tempds=%scan(&syslast,2,.);
131 ods output Members=&tempds;
132 proc datasets library=WORK memtype=data;
133 %local wtcnt;%let wtcnt=0;
136 if not (upcase(name) =:
"DATA");
138 call symputx(cats(
'wt',i),name,
'l');
139 call symputx(
'wtcnt',i,
'l');
140 data _null_; file _sjsref mod encoding=
'utf-8';
144 data _null_; file _sjsref mod encoding=
'utf-8';
145 dsid=open(
"WORK.&wt",
'is');
146 nlobs=attrn(dsid,
'NLOBS');
147 nvars=attrn(dsid,
'NVARS');
149 if &i>1 then put
','@;
151 put
'"nlobs":' nlobs;
152 put
',"nvars":' nvars;
153 %mp_jsonout(OBJ,&wt,jref=_sjsref,dslabel=first10rows,showmeta=Y
156 data _null_; file _sjsref mod encoding=
'utf-8';
159 data _null_; file _sjsref mod encoding=
'utf-8';
164 data _null_;file _sjsref mod encoding=
'utf-8';
165 length SYSPROCESSNAME syserrortext syswarningtext autoexec $512;
166 put
",""_DEBUG"" : ""&_debug"" ";
167 _METAUSER=quote(trim(symget(
'_METAUSER')));
168 put
",""_METAUSER"": " _METAUSER;
169 _METAPERSON=quote(trim(symget(
'_METAPERSON')));
170 put
',"_METAPERSON": ' _METAPERSON;
171 _PROGRAM=quote(trim(resolve(symget(
'_PROGRAM'))));
172 put
',"_PROGRAM" : ' _PROGRAM ;
173 autoexec=quote(urlencode(trim(getoption(
'autoexec'))));
174 put
',"AUTOEXEC" : ' autoexec;
175 put
",""MF_GETUSER"" : ""%mf_getuser()"" ";
176 put
",""SYSCC"" : ""&syscc"" ";
177 put
",""SYSENCODING"" : ""&sysencoding"" ";
178 syserrortext=cats(symget(
'syserrortext'));
179 if findc(syserrortext,
'"\'!!'0A0D09000E0F010210111A
'x) then do;
180 syserrortext='"'!!trim(
181 prxchange('s/"/\\
"/',-1, /* double quote */
182 prxchange('s/\x0A/\n/',-1, /* new line */
183 prxchange('s/\x0D/\r/',-1, /* carriage return */
184 prxchange('s/\x09/\\t/',-1, /* tab */
185 prxchange('s/\x00/\\u0000/',-1, /* NUL */
186 prxchange('s/\x0E/\\u000E/',-1, /* SS */
187 prxchange('s/\x0F/\\u000F/',-1, /* SF */
188 prxchange('s/\x01/\\u0001/',-1, /* SOH */
189 prxchange('s/\x02/\\u0002/',-1, /* STX */
190 prxchange('s/\x10/\\u0010/',-1, /* DLE */
191 prxchange('s/\x11/\\u0011/',-1, /* DC1 */
192 prxchange('s/\x1A/\\u001A/',-1, /* SUB */
193 prxchange('s/\\/\\\\/',-1,syserrortext)
196 else syserrortext=cats('"',syserrortext,'"');
197 put ',
"SYSERRORTEXT" :
' syserrortext;
198 put ",""SYSHOSTNAME"" : ""&syshostname"" ";
199 put ",""SYSPROCESSID"" : ""&SYSPROCESSID"" ";
200 put ",""SYSPROCESSMODE"" : ""&SYSPROCESSMODE"" ";
201 SYSPROCESSNAME=quote(urlencode(cats(SYSPROCESSNAME)));
202 put ",""SYSPROCESSNAME"" : " SYSPROCESSNAME;
203 put ",""SYSJOBID"" : ""&sysjobid"" ";
204 put ",""SYSSCPL"" : ""&sysscpl"" ";
205 put ",""SYSSITE"" : ""&syssite"" ";
206 put ",""SYSUSERID"" : ""&sysuserid"" ";
207 sysvlong=quote(trim(symget('sysvlong
')));
208 put ',
"SYSVLONG" :
' sysvlong;
209 syswarningtext=cats(symget('syswarningtext
'));
210 if findc(syswarningtext,'"\'!!'0A0D09000E0F010210111A'x) then do;
211 syswarningtext='"'!!trim(
212 prxchange('s/
"/\\"/
',-1, /* double quote */
213 prxchange('s/\x0A/\n/
',-1, /* new line */
214 prxchange('s/\x0D/\r/
',-1, /* carriage return */
215 prxchange('s/\x09/\\t/
',-1, /* tab */
216 prxchange('s/\x00/\\u0000/
',-1, /* NUL */
217 prxchange('s/\x0E/\\u000E/
',-1, /* SS */
218 prxchange('s/\x0F/\\u000F/
',-1, /* SF */
219 prxchange('s/\x01/\\u0001/
',-1, /* SOH */
220 prxchange('s/\x02/\\u0002/
',-1, /* STX */
221 prxchange('s/\x10/\\u0010/
',-1, /* DLE */
222 prxchange('s/\x11/\\u0011/
',-1, /* DC1 */
223 prxchange('s/\x1A/\\u001A/
',-1, /* SUB */
224 prxchange('s/\\/\\\\/
',-1,syswarningtext)
227 else syswarningtext=cats('"',syswarningtext,'"');
228 put ',"SYSWARNINGTEXT
" : ' syswarningtext;
229 put ',"END_DTTM
" : "' "%sysfunc(datetime(),E8601DT26.6)" '" ';
231 memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)
";
232 memsize=quote(cats(memsize));
233 put ',"MEMSIZE
" : ' memsize;
235 %if %str(&_debug) ge 131 %then %do;
239 /* now write to _webout 1 char at a time */
241 infile _sjsref lrecl=1 recfm=n;
242 file &fref mod lrecl=1 recfm=n;
243 input sourcechar $char1. @@;
244 format sourcechar hex2.;
245 put sourcechar char1. @@;
247 filename _sjsref clear;