54%macro ms_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
61%let action=%upcase(&action);
63%
if &action=FETCH %then %
do;
64 %
if %str(&_debug) ge 131 %then %
do;
65 options mprint notes mprintnest;
67 %let _webin_file_count=%eval(&_webin_file_count+0);
69 %
do i=1 %to &_webin_file_count;
70 %
if &_webin_file_count=1 %then %
do;
71 %let _webin_fileref1=&_webin_fileref;
72 %let _webin_name1=&_webin_name;
75 infile &&_webin_fileref&i termstr=crlf lrecl=32767;
78 call symputx(
'input_statement'
79 ,prxchange(
's/:\$(?=[0-9 ])/:\$char/i',-1,_infile_)
81 putlog
"&&_webin_name&i input statement: " _infile_;
84 infile &&_webin_fileref&i firstobs=2 dsd termstr=crlf encoding=
'utf-8'
86 input &input_statement;
87 %
if %str(&_debug) ge 131 %then %
do;
88 if _n_<20 then putlog _infile_;
91 %let sasjs_tables=&sasjs_tables &&_webin_name&i;
95%
else %
if &action=OPEN %then %
do;
97 OPTIONS NOBOMFILE lrecl=32767;
100 %mfs_httpheader(Content-type,application/json)
103 data _null_;file &fref encoding=
'utf-8' termstr=lf ;
104 put
'{"SYSDATE" : "' "&SYSDATE" '"';
105 put
',"SYSTIME" : "' "&SYSTIME" '"';
110%
else %
if &action=ARR or &action=OBJ %then %
do;
111 %
if "%substr(&sysver,1,1)"=
"4" or
"%substr(&sysver,1,1)"=
"5" %then %
do;
113 %put &sysmacroname: forcing missing back to NULL as feature not supported;
116 %mp_jsonout(&action,&ds,dslabel=&dslabel,fmt=&fmt,jref=&fref
117 ,engine=DATASTEP,missing=&missing,showmeta=&showmeta,maxobs=&maxobs
120%
else %
if &action=CLOSE %then %
do;
121 %
if %str(&workobs) > 0 %then %
do;
123 data;run;%let tempds=%scan(&syslast,2,.);
124 ods output Members=&tempds;
125 proc datasets library=WORK memtype=data;
126 %local wtcnt;%let wtcnt=0;
129 if not (upcase(name) =:
"DATA");
130 if not (upcase(name)=:
"_DATA_");
132 call symputx(cats(
'wt',i),name,
'l');
133 call symputx(
'wtcnt',i,
'l');
134 data _null_; file &fref mod encoding=
'utf-8' termstr=lf;
138 data _null_; file &fref mod encoding=
'utf-8' termstr=lf;
139 dsid=open(
"WORK.&wt",
'is');
140 nlobs=attrn(dsid,
'NLOBS');
141 nvars=attrn(dsid,
'NVARS');
143 if &i>1 then put
','@;
145 put
'"nlobs":' nlobs;
146 put
',"nvars":' nvars;
147 %mp_jsonout(OBJ,&wt,jref=&fref,dslabel=first10rows,showmeta=Y
150 data _null_; file &fref mod encoding=
'utf-8' termstr=lf;
153 data _null_; file &fref mod encoding=
'utf-8' termstr=lf;
158 data _null_;file &fref mod encoding=
'utf-8' termstr=lf lrecl=32767;
159 length SYSPROCESSNAME syserrortext syswarningtext autoexec $512;
160 put
",""_DEBUG"" : ""&_debug"" ";
161 _PROGRAM=quote(trim(resolve(symget(
'_PROGRAM'))));
162 put
',"_PROGRAM" : ' _PROGRAM ;
163 autoexec=quote(urlencode(trim(getoption(
'autoexec'))));
164 put
',"AUTOEXEC" : ' autoexec;
165 put
",""MF_GETUSER"" : ""%mf_getuser()"" ";
166 put
",""SYSCC"" : ""&syscc"" ";
167 put
",""SYSENCODING"" : ""&sysencoding"" ";
168 syserrortext=cats(symget(
'syserrortext'));
169 if findc(syserrortext,
'"\'!!'0A0D09000E0F010210111A
'x) then do;
170 syserrortext='"'!!trim(
171 prxchange('s/"/\\
"/',-1, /* double quote */
172 prxchange('s/\x0A/\n/',-1, /* new line */
173 prxchange('s/\x0D/\r/',-1, /* carriage return */
174 prxchange('s/\x09/\\t/',-1, /* tab */
175 prxchange('s/\x00/\\u0000/',-1, /* NUL */
176 prxchange('s/\x0E/\\u000E/',-1, /* SS */
177 prxchange('s/\x0F/\\u000F/',-1, /* SF */
178 prxchange('s/\x01/\\u0001/',-1, /* SOH */
179 prxchange('s/\x02/\\u0002/',-1, /* STX */
180 prxchange('s/\x10/\\u0010/',-1, /* DLE */
181 prxchange('s/\x11/\\u0011/',-1, /* DC1 */
182 prxchange('s/\x1A/\\u001A/',-1, /* SUB */
183 prxchange('s/\\/\\\\/',-1,syserrortext)
186 else syserrortext=cats('"',syserrortext,'"');
187 put ',
"SYSERRORTEXT" :
' syserrortext;
188 SYSHOSTINFOLONG=quote(trim(symget('SYSHOSTINFOLONG
')));
189 put ',
"SYSHOSTINFOLONG" :
' SYSHOSTINFOLONG;
190 put ",""SYSHOSTNAME"" : ""&syshostname"" ";
191 put ",""SYSPROCESSID"" : ""&SYSPROCESSID"" ";
192 put ",""SYSPROCESSMODE"" : ""&SYSPROCESSMODE"" ";
193 SYSPROCESSNAME=quote(urlencode(cats(SYSPROCESSNAME)));
194 put ",""SYSPROCESSNAME"" : " SYSPROCESSNAME;
195 put ",""SYSJOBID"" : ""&sysjobid"" ";
196 put ",""SYSSCPL"" : ""&sysscpl"" ";
197 put ",""SYSSITE"" : ""&syssite"" ";
198 put ",""SYSTCPIPHOSTNAME"" : ""&SYSTCPIPHOSTNAME"" ";
199 put ",""SYSUSERID"" : ""&sysuserid"" ";
200 sysvlong=quote(trim(symget('sysvlong
')));
201 put ',
"SYSVLONG" :
' sysvlong;
202 syswarningtext=cats(symget('syswarningtext
'));
203 if findc(syswarningtext,'"\'!!'0A0D09000E0F010210111A'x) then do;
204 syswarningtext='"'!!trim(
205 prxchange('s/
"/\\"/
',-1, /* double quote */
206 prxchange('s/\x0A/\n/
',-1, /* new line */
207 prxchange('s/\x0D/\r/
',-1, /* carriage return */
208 prxchange('s/\x09/\\t/
',-1, /* tab */
209 prxchange('s/\x00/\\u0000/
',-1, /* NUL */
210 prxchange('s/\x0E/\\u000E/
',-1, /* SS */
211 prxchange('s/\x0F/\\u000F/
',-1, /* SF */
212 prxchange('s/\x01/\\u0001/
',-1, /* SOH */
213 prxchange('s/\x02/\\u0002/
',-1, /* STX */
214 prxchange('s/\x10/\\u0010/
',-1, /* DLE */
215 prxchange('s/\x11/\\u0011/
',-1, /* DC1 */
216 prxchange('s/\x1A/\\u001A/
',-1, /* SUB */
217 prxchange('s/\\/\\\\/
',-1,syswarningtext)
220 else syswarningtext=cats('"',syswarningtext,'"');
221 put ',"SYSWARNINGTEXT
" : ' syswarningtext;
222 put ',"END_DTTM
" : "' "%sysfunc(datetime(),E8601DT26.6)" '" ';
224 memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)
";
225 memsize=quote(cats(memsize));
226 put ',"MEMSIZE
" : ' memsize;