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;
81 call symputx(
'input_statement'
82 ,prxchange(
's/:\$(?=[0-9 ])/:\$char/i',-1,_infile_)
84 putlog
"&&_webin_name&i input statement: " _infile_;
87 infile &&_webin_fileref&i firstobs=2 dsd termstr=crlf encoding=
'utf-8';
88 input &input_statement;
89 %
if %str(&_debug) ge 131 %then %
do;
90 if _n_<20 then putlog _infile_;
93 %let sasjs_tables=&sasjs_tables &&_webin_name&i;
97%
else %
if &action=OPEN %then %
do;
106 set sashelp.vextfl(where=(fileref=
"_WEBOUT"));
107 if xengine=
'STREAM' then
do;
108 rc=stpsrv_header(
'Content-type',
"text/html; encoding=utf-8");
113 data _null_;file &fref encoding=
'utf-8';
114 %
if %str(&_debug) ge 131 %then %
do;
115 put
'>>weboutBEGIN<<';
117 put
'{"SYSDATE" : "' "&SYSDATE" '"';
118 put
',"SYSTIME" : "' "&SYSTIME" '"';
123%
else %
if &action=ARR or &action=OBJ %then %
do;
124 %mp_jsonout(&action,&ds,dslabel=&dslabel,fmt=&fmt,jref=&fref
125 ,engine=&jsonengine,missing=&missing,showmeta=&showmeta,maxobs=&maxobs
128%
else %
if &action=CLOSE %then %
do;
130 filename _sjsref temp lrecl=131068;
131 %
if %str(&workobs) > 0 %then %
do;
133 data;run;%let tempds=%scan(&syslast,2,.);
134 ods output Members=&tempds;
135 proc datasets library=WORK memtype=data;
136 %local wtcnt;%let wtcnt=0;
139 if not (upcase(name) =:
"DATA");
141 call symputx(cats(
'wt',i),name,
'l');
142 call symputx(
'wtcnt',i,
'l');
143 data _null_; file _sjsref mod encoding=
'utf-8';
147 data _null_; file _sjsref mod encoding=
'utf-8';
148 dsid=open(
"WORK.&wt",
'is');
149 nlobs=attrn(dsid,
'NLOBS');
150 nvars=attrn(dsid,
'NVARS');
152 if &i>1 then put
','@;
154 put
'"nlobs":' nlobs;
155 put
',"nvars":' nvars;
156 %mp_jsonout(OBJ,&wt,jref=_sjsref,dslabel=first10rows,showmeta=Y
159 data _null_; file _sjsref mod encoding=
'utf-8';
162 data _null_; file _sjsref mod encoding=
'utf-8';
167 data _null_;file _sjsref mod encoding=
'utf-8';
168 length SYSPROCESSNAME syserrortext syswarningtext autoexec $512;
169 put
",""_DEBUG"" : ""&_debug"" ";
170 _METAUSER=quote(trim(symget(
'_METAUSER')));
171 put
",""_METAUSER"": " _METAUSER;
172 _METAPERSON=quote(trim(symget(
'_METAPERSON')));
173 put
',"_METAPERSON": ' _METAPERSON;
174 _PROGRAM=quote(trim(resolve(symget(
'_PROGRAM'))));
175 put
',"_PROGRAM" : ' _PROGRAM ;
176 autoexec=quote(urlencode(trim(getoption(
'autoexec'))));
177 put
',"AUTOEXEC" : ' autoexec;
178 put
",""MF_GETUSER"" : ""%mf_getuser()"" ";
179 put
",""SYSCC"" : ""&syscc"" ";
180 put
",""SYSENCODING"" : ""&sysencoding"" ";
181 syserrortext=cats(symget(
'syserrortext'));
182 if findc(syserrortext,
'"\'!!'0A0D09000E0F010210111A
'x) then do;
183 syserrortext='"'!!trim(
184 prxchange('s/"/\\
"/',-1, /* double quote */
185 prxchange('s/\x0A/\n/',-1, /* new line */
186 prxchange('s/\x0D/\r/',-1, /* carriage return */
187 prxchange('s/\x09/\\t/',-1, /* tab */
188 prxchange('s/\x00/\\u0000/',-1, /* NUL */
189 prxchange('s/\x0E/\\u000E/',-1, /* SS */
190 prxchange('s/\x0F/\\u000F/',-1, /* SF */
191 prxchange('s/\x01/\\u0001/',-1, /* SOH */
192 prxchange('s/\x02/\\u0002/',-1, /* STX */
193 prxchange('s/\x10/\\u0010/',-1, /* DLE */
194 prxchange('s/\x11/\\u0011/',-1, /* DC1 */
195 prxchange('s/\x1A/\\u001A/',-1, /* SUB */
196 prxchange('s/\\/\\\\/',-1,syserrortext)
199 else syserrortext=cats('"',syserrortext,'"');
200 put ',
"SYSERRORTEXT" :
' syserrortext;
201 put ",""SYSHOSTNAME"" : ""&syshostname"" ";
202 put ",""SYSPROCESSID"" : ""&SYSPROCESSID"" ";
203 put ",""SYSPROCESSMODE"" : ""&SYSPROCESSMODE"" ";
204 SYSPROCESSNAME=quote(urlencode(cats(SYSPROCESSNAME)));
205 put ",""SYSPROCESSNAME"" : " SYSPROCESSNAME;
206 put ",""SYSJOBID"" : ""&sysjobid"" ";
207 put ",""SYSSCPL"" : ""&sysscpl"" ";
208 put ",""SYSSITE"" : ""&syssite"" ";
209 put ",""SYSUSERID"" : ""&sysuserid"" ";
210 sysvlong=quote(trim(symget('sysvlong
')));
211 put ',
"SYSVLONG" :
' sysvlong;
212 syswarningtext=cats(symget('syswarningtext
'));
213 if findc(syswarningtext,'"\'!!'0A0D09000E0F010210111A'x) then do;
214 syswarningtext='"'!!trim(
215 prxchange('s/
"/\\"/
',-1, /* double quote */
216 prxchange('s/\x0A/\n/
',-1, /* new line */
217 prxchange('s/\x0D/\r/
',-1, /* carriage return */
218 prxchange('s/\x09/\\t/
',-1, /* tab */
219 prxchange('s/\x00/\\u0000/
',-1, /* NUL */
220 prxchange('s/\x0E/\\u000E/
',-1, /* SS */
221 prxchange('s/\x0F/\\u000F/
',-1, /* SF */
222 prxchange('s/\x01/\\u0001/
',-1, /* SOH */
223 prxchange('s/\x02/\\u0002/
',-1, /* STX */
224 prxchange('s/\x10/\\u0010/
',-1, /* DLE */
225 prxchange('s/\x11/\\u0011/
',-1, /* DC1 */
226 prxchange('s/\x1A/\\u001A/
',-1, /* SUB */
227 prxchange('s/\\/\\\\/
',-1,syswarningtext)
230 else syswarningtext=cats('"',syswarningtext,'"');
231 put ',"SYSWARNINGTEXT
" : ' syswarningtext;
232 put ',"END_DTTM
" : "' "%sysfunc(datetime(),E8601DT26.6)" '" ';
234 memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)
";
235 memsize=quote(cats(memsize));
236 put ',"MEMSIZE
" : ' memsize;
238 %if %str(&_debug) ge 131 %then %do;
242 /* now write to _webout 1 char at a time */
244 infile _sjsref lrecl=1 recfm=n;
245 file &fref mod lrecl=1 recfm=n;
246 input sourcechar $char1. @@;
247 format sourcechar hex2.;
248 put sourcechar char1. @@;
250 filename _sjsref clear;