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;
77 call symputx(
'input_statement',_infile_);
78 putlog
"&&_webin_name&i input statement: " _infile_;
81 infile &&_webin_fileref&i firstobs=2 dsd termstr=crlf encoding=
'utf-8'
83 input &input_statement;
84 %
if %str(&_debug) ge 131 %then %
do;
85 if _n_<20 then putlog _infile_;
88 %let sasjs_tables=&sasjs_tables &&_webin_name&i;
92%
else %
if &action=OPEN %then %
do;
94 OPTIONS NOBOMFILE lrecl=32767;
97 %mfs_httpheader(Content-type,application/json)
100 data _null_;file &fref encoding=
'utf-8' termstr=lf ;
101 put
'{"SYSDATE" : "' "&SYSDATE" '"';
102 put
',"SYSTIME" : "' "&SYSTIME" '"';
107%
else %
if &action=ARR or &action=OBJ %then %
do;
108 %
if "%substr(&sysver,1,1)"=
"4" or
"%substr(&sysver,1,1)"=
"5" %then %
do;
110 %put &sysmacroname: forcing missing back to NULL as feature not supported;
113 %mp_jsonout(&action,&ds,dslabel=&dslabel,fmt=&fmt,jref=&fref
114 ,engine=DATASTEP,missing=&missing,showmeta=&showmeta,maxobs=&maxobs
117%
else %
if &action=CLOSE %then %
do;
118 %
if %str(&workobs) > 0 %then %
do;
120 data;run;%let tempds=%scan(&syslast,2,.);
121 ods output Members=&tempds;
122 proc datasets library=WORK memtype=data;
123 %local wtcnt;%let wtcnt=0;
126 if not (upcase(name) =:
"DATA");
127 if not (upcase(name)=:
"_DATA_");
129 call symputx(cats(
'wt',i),name,
'l');
130 call symputx(
'wtcnt',i,
'l');
131 data _null_; file &fref mod encoding=
'utf-8' termstr=lf;
135 data _null_; file &fref mod encoding=
'utf-8' termstr=lf;
136 dsid=open(
"WORK.&wt",
'is');
137 nlobs=attrn(dsid,
'NLOBS');
138 nvars=attrn(dsid,
'NVARS');
140 if &i>1 then put
','@;
142 put
'"nlobs":' nlobs;
143 put
',"nvars":' nvars;
144 %mp_jsonout(OBJ,&wt,jref=&fref,dslabel=first10rows,showmeta=Y
147 data _null_; file &fref mod encoding=
'utf-8' termstr=lf;
150 data _null_; file &fref mod encoding=
'utf-8' termstr=lf;
155 data _null_;file &fref mod encoding=
'utf-8' termstr=lf lrecl=32767;
156 length SYSPROCESSNAME syserrortext syswarningtext autoexec $512;
157 put
",""_DEBUG"" : ""&_debug"" ";
158 _PROGRAM=quote(trim(resolve(symget(
'_PROGRAM'))));
159 put
',"_PROGRAM" : ' _PROGRAM ;
160 autoexec=quote(urlencode(trim(getoption(
'autoexec'))));
161 put
',"AUTOEXEC" : ' autoexec;
162 put
",""MF_GETUSER"" : ""%mf_getuser()"" ";
163 put
",""SYSCC"" : ""&syscc"" ";
164 put
",""SYSENCODING"" : ""&sysencoding"" ";
165 syserrortext=cats(symget(
'syserrortext'));
166 if findc(syserrortext,
'"\'!!'0A0D09000E0F010210111A
'x) then do;
167 syserrortext='"'!!trim(
168 prxchange('s/"/\\
"/',-1, /* double quote */
169 prxchange('s/\x0A/\n/',-1, /* new line */
170 prxchange('s/\x0D/\r/',-1, /* carriage return */
171 prxchange('s/\x09/\\t/',-1, /* tab */
172 prxchange('s/\x00/\\u0000/',-1, /* NUL */
173 prxchange('s/\x0E/\\u000E/',-1, /* SS */
174 prxchange('s/\x0F/\\u000F/',-1, /* SF */
175 prxchange('s/\x01/\\u0001/',-1, /* SOH */
176 prxchange('s/\x02/\\u0002/',-1, /* STX */
177 prxchange('s/\x10/\\u0010/',-1, /* DLE */
178 prxchange('s/\x11/\\u0011/',-1, /* DC1 */
179 prxchange('s/\x1A/\\u001A/',-1, /* SUB */
180 prxchange('s/\\/\\\\/',-1,syserrortext)
183 else syserrortext=cats('"',syserrortext,'"');
184 put ',
"SYSERRORTEXT" :
' syserrortext;
185 SYSHOSTINFOLONG=quote(trim(symget('SYSHOSTINFOLONG
')));
186 put ',
"SYSHOSTINFOLONG" :
' SYSHOSTINFOLONG;
187 put ",""SYSHOSTNAME"" : ""&syshostname"" ";
188 put ",""SYSPROCESSID"" : ""&SYSPROCESSID"" ";
189 put ",""SYSPROCESSMODE"" : ""&SYSPROCESSMODE"" ";
190 SYSPROCESSNAME=quote(urlencode(cats(SYSPROCESSNAME)));
191 put ",""SYSPROCESSNAME"" : " SYSPROCESSNAME;
192 put ",""SYSJOBID"" : ""&sysjobid"" ";
193 put ",""SYSSCPL"" : ""&sysscpl"" ";
194 put ",""SYSSITE"" : ""&syssite"" ";
195 put ",""SYSTCPIPHOSTNAME"" : ""&SYSTCPIPHOSTNAME"" ";
196 put ",""SYSUSERID"" : ""&sysuserid"" ";
197 sysvlong=quote(trim(symget('sysvlong
')));
198 put ',
"SYSVLONG" :
' sysvlong;
199 syswarningtext=cats(symget('syswarningtext
'));
200 if findc(syswarningtext,'"\'!!'0A0D09000E0F010210111A'x) then do;
201 syswarningtext='"'!!trim(
202 prxchange('s/
"/\\"/
',-1, /* double quote */
203 prxchange('s/\x0A/\n/
',-1, /* new line */
204 prxchange('s/\x0D/\r/
',-1, /* carriage return */
205 prxchange('s/\x09/\\t/
',-1, /* tab */
206 prxchange('s/\x00/\\u0000/
',-1, /* NUL */
207 prxchange('s/\x0E/\\u000E/
',-1, /* SS */
208 prxchange('s/\x0F/\\u000F/
',-1, /* SF */
209 prxchange('s/\x01/\\u0001/
',-1, /* SOH */
210 prxchange('s/\x02/\\u0002/
',-1, /* STX */
211 prxchange('s/\x10/\\u0010/
',-1, /* DLE */
212 prxchange('s/\x11/\\u0011/
',-1, /* DC1 */
213 prxchange('s/\x1A/\\u001A/
',-1, /* SUB */
214 prxchange('s/\\/\\\\/
',-1,syswarningtext)
217 else syswarningtext=cats('"',syswarningtext,'"');
218 put ',"SYSWARNINGTEXT
" : ' syswarningtext;
219 put ',"END_DTTM
" : "' "%sysfunc(datetime(),E8601DT26.6)" '" ';
221 memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)
";
222 memsize=quote(cats(memsize));
223 put ',"MEMSIZE
" : ' memsize;