diff --git a/all.sas b/all.sas
index 8bd834e..14b8295 100644
--- a/all.sas
+++ b/all.sas
@@ -39,7 +39,7 @@ options noquotelenmax;
@version 9.2
@author Allan Bowe
-**/
+**/ /** @cond */
%macro mf_abort(mac=mf_abort.sas, type=, msg=, iftrue=%str(1=1)
)/*/STORE SOURCE*/;
@@ -157,7 +157,8 @@ options noquotelenmax;
%abort cancel;
%end;
%mend;
-/**
+
+/** @endcond *//**
@file mf_existds.sas
@brief Checks whether a dataset OR a view exists.
@details Can be used in open code, eg as follows:
@@ -183,7 +184,7 @@ options noquotelenmax;
%else 1;
%mend;/**
- @file mf_existfeature.sas
+ @file
@brief Checks whether a feature exists
@details Check to see if a feature is supported in your environment.
Run without arguments to see a list of detectable features.
@@ -191,10 +192,10 @@ options noquotelenmax;
actual feature detection, as that is tricky / impossible to do
without generating errors in most cases.
- %put %mf_existfeature(PROCLUA);
+ %put %mf_existfeature(PROCLUA);
@param feature the feature to detect. Leave blank to list all in log.
-
+
@return output returns 1 or 0 (or -1 if not found)
Dependencies
@@ -203,7 +204,7 @@ options noquotelenmax;
@version 8
@author Allan Bowe
-**/
+**/ /** @cond */
%macro mf_existfeature(feature
)/*/STORE SOURCE*/;
@@ -223,7 +224,9 @@ options noquotelenmax;
-1
%put &sysmacroname: &feature not found;
%end;
-%mend;/**
+%mend;
+
+/** @endcond *//**
@file
@brief Checks if a variable exists in a data set.
@details Returns 0 if the variable does NOT exist, and return the position of
@@ -236,7 +239,7 @@ options noquotelenmax;
@param var (positional) - variable name
@version 9.2
@author Allan Bowe
-**/
+**/ /** @cond */
%macro mf_existvar(libds /* 2 part dataset name */
, var /* variable name */
@@ -254,7 +257,9 @@ options noquotelenmax;
%let rc=%sysfunc(close(&dsid));
%end;
-%mend;/**
+%mend;
+
+/** @endcond *//**
@file
@brief Checks if a set of variables ALL exist in a data set.
@details Returns 0 if ANY of the variables do not exist, or 1 if they ALL do.
@@ -399,7 +404,7 @@ options noquotelenmax;
@version 9.2
@author Allan Bowe
-**/
+**/ /** @cond */
%macro mf_getengine(libref
)/*/STORE SOURCE*/;
@@ -419,7 +424,9 @@ options noquotelenmax;
&engine
-%mend;/**
+%mend;
+
+/** @endcond *//**
@file
@brief Returns the size of a file in bytes.
@details Provide full path/filename.extension to the file, eg:
@@ -646,17 +653,18 @@ options noquotelenmax;
/**
@file
@brief Assigns and returns an unused fileref
- @details Use as follows:
+ @details
+ Use as follows:
- %let fileref1=%mf_getuniquefileref();
- %let fileref2=%mf_getuniquefileref();
- %put &fileref1 &fileref2;
+ %let fileref1=%mf_getuniquefileref();
+ %let fileref2=%mf_getuniquefileref();
+ %put &fileref1 &fileref2;
which returns:
> mcref0 mcref1
- @prefix= first part of fileref. Remember that filerefs can only be 8
+ @param prefix= first part of fileref. Remember that filerefs can only be 8
characters, so a 7 letter prefix would mean that `maxtries` should be 10.
@param maxtries= the last part of the libref. Provide an integer value.
@@ -694,7 +702,7 @@ options noquotelenmax;
> mclib3
- @prefix= first part of libref. Remember that librefs can only be 8 characters,
+ @param prefix= first part of libref. Remember that librefs can only be 8 characters,
so a 7 letter prefix would mean that maxtries should be 10.
@param maxtries= the last part of the libref. Provide an integer value.
@@ -6041,15 +6049,15 @@ run;
Usage:
- %mm_createlibrary(
- libname=My New Library
- ,libref=mynewlib
- ,libdesc=Super &
- ,engine=BASE
- ,tree=/User Folders/sasdemo
- ,servercontext=SASApp
- ,directory=/tmp/tests
- ,mDebug=1)
+ %mm_createlibrary(
+ libname=My New Library
+ ,libref=mynewlib
+ ,libdesc=Super &
+ ,engine=BASE
+ ,tree=/User Folders/sasdemo
+ ,servercontext=SASApp
+ ,directory=/tmp/tests
+ ,mDebug=1)
Dependencies
@li mf_verifymacvars.sas
@@ -8670,8 +8678,8 @@ filename __outdoc clear;
combine with the tree= parameter.
@param outds= the dataset to create that contains the list of stps.
@param mDebug= set to 1 to show debug messages in the log
- @showDesc= provide a non blank value to return stored process descriptions
- @showUsageVersion= provide a non blank value to return the UsageVersion. This
+ @param showDesc= provide a non blank value to return stored process descriptions
+ @param showUsageVersion= provide a non blank value to return the UsageVersion. This
is either 1000000 (type 1, 9.2) or 2000000 (type2, 9.3 onwards).
@returns outds dataset containing the following columns
@@ -9151,7 +9159,7 @@ libname _XML_ clear;
/**
@file
@brief Retrieves properties of the SAS web app server
- @details
+ @details
Usage:
%mm_getwebappsrvprops(outds= some_ds)
@@ -9171,8 +9179,7 @@ libname _XML_ clear;
libname __shake clear;
@version 9.4
- @author Allan Bowe
- @source https://github.com/sasjs/core
+ @author Allan Bowe https://github.com/sasjs/core
**/
@@ -11755,7 +11762,7 @@ libname &libref1 clear;
%let &access_token_var=;
%end;
%put &sysmacroname: grant_type=&grant_type;
-%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
+%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services
)
,mac=&sysmacroname
@@ -11798,10 +11805,16 @@ options noquotelenmax;
/*data _null_;infile &fname1;input;putlog _infile_;run;*/
libname &libref1 JSON fileref=&fname1;
/* now get the followon link to list members */
+ %local href;
+ %let href=0;
data _null_;
set &libref1..links;
if rel='members' then call symputx('href',quote("&base_uri"!!trim(href)),'l');
run;
+ %if &href=0 %then %do;
+ %put NOTE:;%put NOTE- No members found in &root!!;%put NOTE-;
+ %return;
+ %end;
%local fname2 libref2;
%let fname2=%mf_getuniquefileref();
%let libref2=%mf_getuniquelibref();
@@ -12268,6 +12281,146 @@ run;
filename &fname1 clear;
libname &libref1 clear;
+%mend;/**
+ @file
+ @brief Executes a SAS Viya Job
+ @details Triggers a SAS Viya Job, with optional URL parameters, using
+ the JES web app.
+
+ First, compile the macros:
+
+ filename mc url
+ "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
+ %inc mc;
+
+ Then, execute the job!
+
+ %mv_jobexecute(path=/Public/folder
+ ,name=somejob
+ )
+
+
+ @param access_token_var= The global macro variable to contain the access token
+ @param grant_type= valid values:
+ * password
+ * authorization_code
+ * detect - will check if access_token exists, if not will use sas_services if
+ a SASStudioV session else authorization_code. Default option.
+ * sas_services - will use oauth_bearer=sas_services
+
+ @param path= The SAS Drive path to the job being executed
+ @param name= The name of the job to execute
+ @param params= A macro quoted string to append to the URL
+ @param contextName= Context name with which to run the job.
+ Default = `SAS Job Execution compute context`
+
+
+ @version VIYA V.03.04
+ @author Allan Bowe, source: https://github.com/sasjs/core
+
+ Dependencies
+ @li mp_abort.sas
+ @li mf_getplatform.sas
+ @li mf_getuniquefileref.sas
+ @li mv_getfoldermembers.sas
+
+**/
+
+%macro mv_jobexecute(path=0
+ ,name=0
+ ,contextName=SAS Job Execution compute context
+ ,access_token_var=ACCESS_TOKEN
+ ,grant_type=sas_services
+ );
+%local oauth_bearer;
+%if &grant_type=detect %then %do;
+ %if %symexist(&access_token_var) %then %let grant_type=authorization_code;
+ %else %let grant_type=sas_services;
+%end;
+%if &grant_type=sas_services %then %do;
+ %let oauth_bearer=oauth_bearer=sas_services;
+ %let &access_token_var=;
+%end;
+%put &sysmacroname: grant_type=&grant_type;
+%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
+ and &grant_type ne sas_services
+ )
+ ,mac=&sysmacroname
+ ,msg=%str(Invalid value for grant_type: &grant_type)
+)
+
+%mp_abort(iftrue=("&path"="0")
+ ,mac=&sysmacroname
+ ,msg=%str(Path not provided)
+)
+%mp_abort(iftrue=("&name"="0")
+ ,mac=&sysmacroname
+ ,msg=%str(Job Name not provided)
+)
+
+options noquotelenmax;
+
+%local base_uri; /* location of rest apis */
+%let base_uri=%mf_getplatform(VIYARESTAPI);
+
+data;run;
+%local foldermembers;
+%let foldermembers=&syslast;
+%mv_getfoldermembers(root=&path
+ ,access_token_var=&access_token_var
+ ,grant_type=&grant_type
+ ,outds=&foldermembers
+)
+
+%local joburi;
+%let joburi=0;
+data _null_;
+ set &foldermembers;
+ if name="&name" and uri=:'/jobDefinitions/definitions'
+ then call symputx('joburi',uri);
+run;
+
+%mp_abort(iftrue=("&joburi"="0")
+ ,mac=&sysmacroname
+ ,msg=%str(Job &path/&name not found)
+)
+
+/* prepare request*/
+%local fname0 fname1;
+%let fname0=%mf_getuniquefileref();
+%let fname1=%mf_getuniquefileref();
+
+data _null_;
+ file &fname0;
+ put '{"jobDefinitionUri": "'@@;
+ put "&joburi"@@;
+ put '","arguments":{"_contextName":"'@@;
+ put "&contextName"@@;
+ put '"}}';
+run;
+
+proc http method='POST' in=&fname0 out=&fname1 &oauth_bearer
+ url="&base_uri/jobExecution/jobs";
+ headers "Content-Type"="application/vnd.sas.job.execution.job.request+json"
+ "Accept"="application/vnd.sas.job.execution.job+json"
+ %if &grant_type=authorization_code %then %do;
+ "Authorization"="Bearer &&&access_token_var"
+ %end;
+ ;
+run;
+/*data _null_;infile &fname1;input;putlog _infile_;run;*/
+
+%mp_abort(iftrue=(
+ &SYS_PROCHTTP_STATUS_CODE ne 200 and &SYS_PROCHTTP_STATUS_CODE ne 201
+ )
+ ,mac=&sysmacroname
+ ,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
+)
+
+/* clear refs */
+filename &fname0 clear;
+filename &fname1 clear;
+
%mend;/**
@file mv_registerclient.sas
@brief Register Client and Secret (admin task)