diff --git a/all.sas b/all.sas
index 5ab16db..95f3118 100644
--- a/all.sas
+++ b/all.sas
@@ -1808,6 +1808,7 @@ Usage:
SAS Macros
@li mf_existds.sas
@li mf_existvarlist.sas
+ @li mf_getvarlist.sas
@li mf_wordsinstr1butnotstr2.sas
@li mp_abort.sas
@@ -3334,18 +3335,18 @@ data &outds;
run;
+data _null_;
+ set &outds;
+ call symputx('REASON_CD',reason_cd,'l');
+ stop;
+run;
+
+%mp_abort(iftrue=(&abort=YES)
+ mac=&sysmacroname,
+ msg=%str(Filter issues in &inds, first was &reason_cd, details in &outds)
+)
+
%if %mf_nobs(&outds)>0 %then %do;
- %if &abort=YES %then %do;
- data _null_;
- set &outds;
- call symputx('REASON_CD',reason_cd,'l');
- stop;
- run;
- %mp_abort(
- mac=&sysmacroname,
- msg=%str(Filter issues in &inds, first was &reason_cd, details in &outds)
- )
- %end;
%let syscc=1008;
%return;
%end;
@@ -5787,8 +5788,20 @@ proc sql
%let contentype=%upcase(&contenttype);
%local platform; %let platform=%mf_getplatform();
+
+/**
+ * check engine type to avoid the below err message:
+ * > Function is only valid for filerefs using the CACHE access method.
+ */
+%local streamweb;
+%let streamweb=0;
+data _null_;
+ set sashelp.vextfl(where=(upcase(fileref)="_WEBOUT"));
+ if xengine='STREAM' then call symputx('streamweb',1,'l');
+run;
+
%if &contentype=ZIP %then %do;
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/zip');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
@@ -5802,7 +5815,7 @@ proc sql
%end;
%else %if &contentype=EXCEL %then %do;
/* suitable for XLS format */
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/vnd.ms-excel');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
@@ -5815,7 +5828,7 @@ proc sql
%end;
%end;
%else %if &contentype=XLSX %then %do;
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
@@ -5830,7 +5843,7 @@ proc sql
%end;
%end;
%else %if &contentype=TEXT %then %do;
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/text');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
@@ -5843,7 +5856,7 @@ proc sql
%end;
%end;
%else %if &contentype=CSV %then %do;
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/csv');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
@@ -5873,7 +5886,8 @@ proc sql
%mp_binarycopy(inloc="&inloc",outref=_webout)
%end;
-%mend;/**
+%mend;
+/**
@file
@brief Runs arbitrary code for a specified amount of time
@details Executes a series of procs and data steps to enable performance
@@ -5964,6 +5978,117 @@ quit;
libname &lib clear;
+%mend;/**
+ @file mp_testservice.sas
+ @brief Will execute a test against a SASjs web service on SAS 9 or Viya
+ @details Prepares the input files and retrieves the resulting datasets from
+ the response JSON.
+
+ %mp_testjob(
+ duration=60*5
+ )
+
+ Note - the _webout fileref should NOT be assigned prior to running this macro.
+
+ @param [in] program The _PROGRAM endpoint to test
+ @param [in] inputfiles= A list of space seperated fileref:filename pairs as
+ follows:
+ inputfiles=inref:filename inref2:filename2
+ @param [in] debug= (log) Provide the _debug value
+ @param [out] outlib= (0) Output libref to contain the final tables. Set to
+ 0 if the service output is not in JSON format.
+ @param [out] outref= (0) Output fileref to create, to contain the full _webout
+ response.
+
+ SAS Macros
+ @li mf_getuniquefileref.sas
+ @li mf_getuniquename.sas
+
+ @version 9.4
+ @author Allan Bowe
+
+**/
+
+%macro mp_testservice(program,
+ inputfiles=,
+ debug=log,
+ outlib=0,
+ outref=0
+)/*/STORE SOURCE*/;
+
+/* parse the input files */
+%local webcount i var;
+%let webcount=%sysfunc(countw(&inputfiles));
+%do i=1 %to &webcount;
+ %let var=%scan(&inputfiles,&i,%str( ));
+ %local webfref&i webname&i;
+ %let webref&i=%scan(&var,1,%str(:));
+ %let webname&i=%scan(&var,2,%str(:));
+%end;
+
+%local fref1 ;
+%let fref1=%mf_getuniquefileref();
+filename _webout "%sysfunc(pathname(work))/%mf_getuniquename().txt";
+
+%local platform;
+%let platform=%mf_getplatform();
+%if &platform=SASMETA %then %do;
+ proc stp program="&program"
+ %do i=1 %to &webcount;
+ %if &webcount=1 %then %do;
+ _webin_fileref="&&webref&i"
+ _webin_name="&&webname&i"
+ %end;
+ %else %do;
+ _webin_fileref&i="&&webref&i"
+ _webin_name&i="&&webname&i"
+ %end;
+ %end;
+ _webin_file_count="&webcount"
+ _debug="&debug";
+ outputfile=_webout;
+ run;
+
+ data _null_;
+ infile _webout;
+ file &fref1;
+ input;
+ length line $10000;
+ if index(_infile_,'>>weboutBEGIN<<') then do;
+ line=tranwrd(_infile_,'>>weboutBEGIN<<','');
+ put line;
+ end;
+ else if index(_infile_,'>>weboutEND<<') then do;
+ line=tranwrd(_infile_,'>>weboutEND<<','');
+ put line;
+ stop;
+ end;
+ else put _infile_;
+ run;
+ data _null_;
+ infile &fref1;
+ input;
+ put _infile_;
+ run;
+ %if &outlib ne 0 %then %do;
+ libname &outlib json (&fref1);
+ %end;
+ %if &outref ne 0 %then %do;
+ filename &outref temp;
+ %mp_binarycopy(inref=_webout,outref=&outref)
+ %end;
+ filename _webout clear;
+
+%end;
+%else %if &platform=SASVIYA %then %do;
+
+%end;
+%else %do;
+ %put %str(ERR)OR: Unrecognised platform: &platform;
+%end;
+
+filename _webout clear;
+
%mend;/**
@file mp_testwritespeedlibrary.sas
@brief Tests the write speed of a new table in a SAS library
diff --git a/base/mp_assertcols.sas b/base/mp_assertcols.sas
index 6298b27..8ebd3d6 100644
--- a/base/mp_assertcols.sas
+++ b/base/mp_assertcols.sas
@@ -25,6 +25,7 @@
SAS Macros
@li mf_existds.sas
@li mf_existvarlist.sas
+ @li mf_getvarlist.sas
@li mf_wordsinstr1butnotstr2.sas
@li mp_abort.sas
diff --git a/base/mp_filtercheck.sas b/base/mp_filtercheck.sas
index 28d2873..f74320f 100644
--- a/base/mp_filtercheck.sas
+++ b/base/mp_filtercheck.sas
@@ -141,18 +141,18 @@ data &outds;
run;
+data _null_;
+ set &outds;
+ call symputx('REASON_CD',reason_cd,'l');
+ stop;
+run;
+
+%mp_abort(iftrue=(&abort=YES)
+ mac=&sysmacroname,
+ msg=%str(Filter issues in &inds, first was &reason_cd, details in &outds)
+)
+
%if %mf_nobs(&outds)>0 %then %do;
- %if &abort=YES %then %do;
- data _null_;
- set &outds;
- call symputx('REASON_CD',reason_cd,'l');
- stop;
- run;
- %mp_abort(
- mac=&sysmacroname,
- msg=%str(Filter issues in &inds, first was &reason_cd, details in &outds)
- )
- %end;
%let syscc=1008;
%return;
%end;
diff --git a/base/mp_streamfile.sas b/base/mp_streamfile.sas
index 9484d1c..5a96897 100644
--- a/base/mp_streamfile.sas
+++ b/base/mp_streamfile.sas
@@ -36,8 +36,20 @@
%let contentype=%upcase(&contenttype);
%local platform; %let platform=%mf_getplatform();
+
+/**
+ * check engine type to avoid the below err message:
+ * > Function is only valid for filerefs using the CACHE access method.
+ */
+%local streamweb;
+%let streamweb=0;
+data _null_;
+ set sashelp.vextfl(where=(upcase(fileref)="_WEBOUT"));
+ if xengine='STREAM' then call symputx('streamweb',1,'l');
+run;
+
%if &contentype=ZIP %then %do;
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/zip');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
@@ -51,7 +63,7 @@
%end;
%else %if &contentype=EXCEL %then %do;
/* suitable for XLS format */
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/vnd.ms-excel');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
@@ -64,7 +76,7 @@
%end;
%end;
%else %if &contentype=XLSX %then %do;
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
@@ -79,7 +91,7 @@
%end;
%end;
%else %if &contentype=TEXT %then %do;
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/text');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
@@ -92,7 +104,7 @@
%end;
%end;
%else %if &contentype=CSV %then %do;
- %if &platform=SASMETA %then %do;
+ %if &platform=SASMETA and &streamweb=1 %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/csv');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
@@ -122,4 +134,4 @@
%mp_binarycopy(inloc="&inloc",outref=_webout)
%end;
-%mend;
\ No newline at end of file
+%mend;