diff --git a/all.sas b/all.sas
index 63c563a..b8d1524 100644
--- a/all.sas
+++ b/all.sas
@@ -5374,6 +5374,60 @@ alter table &libds modify &var char(&len);
%mend;
/**
+ @file
+ @brief Validates a filter clause
+ @details Validates a filter to avoid SQL injection. Works by removing string
+ literals, then ensuring that none of the following characters remain: &,%,;
+
+
+
+ %mp_setkeyvalue(someindex,22,type=N)
+ %mp_setkeyvalue(somenewindex,somevalue)
+
+
SAS Macros
+ @li mf_existds.sas
+
+ @param key Provide a key on which to perform the lookup
+ @param value Provide a value
+ @param type= either C or N will populate valc and valn respectively. C is
+ default.
+ @param libds= define the target table to hold the parameters
+
+ @version 9.2
+ @author Allan Bowe
+ @source https://github.com/sasjs/core
+
+**/
+
+%macro mp_setkeyvalue(key,value,type=C,libds=work.mp_setkeyvalue
+)/*/STORE SOURCE*/;
+
+ %if not (%mf_existds(&libds)) %then %do;
+ data &libds (index=(key/unique));
+ length key $64 valc $2048 valn 8 type $1;
+ call missing(of _all_);
+ stop;
+ run;
+ %end;
+
+ proc sql;
+ delete from &libds
+ where key=symget('key');
+ insert into &libds
+ set key=symget('key')
+ %if &type=C %then %do;
+ ,valc=symget('value')
+ ,type='C'
+ %end;
+ %else %do;
+ ,valn=symgetn('value')
+ ,type='N'
+ %end;
+ ;
+
+ quit;
+
+%mend;/**
@file
@brief Creates a zip file
@details For DIRECTORY usage, will ignore subfolders. For DATASET usage,
@@ -11752,9 +11806,10 @@ run;
needs to be attached to the beginning of the service
@param code= Fileref(s) of the actual code to be added
@param access_token_var= The global macro variable to contain the access token
- @param grant_type= valid values are "password" or "authorization_code" (unquoted).
- The default is authorization_code.
- @param replace= select NO to avoid replacing any existing service in that location
+ @param grant_type= valid values are "password" or "authorization_code"
+ (unquoted). The default is authorization_code.
+ @param replace= select NO to avoid replacing any existing service in that
+ location
@param adapter= the macro uses the sasjs adapter by default. To use another
adapter, add a (different) fileref here.
@param contextname= Choose a specific context on which to run the Job. Leave
@@ -11851,7 +11906,8 @@ libname &libref1 JSON fileref=&fname1;
data _null_;
set &libref1..links;
- if rel='members' then call symputx('membercheck',quote("&base_uri"!!trim(href)),'l');
+ if rel='members' then
+ call symputx('membercheck',quote("&base_uri"!!trim(href)),'l');
else if rel='self' then call symputx('parentFolderUri',href,'l');
run;
data _null_;
@@ -12298,6 +12354,14 @@ run;
rc =fput(fileid,'\');rc =fwrite(fileid);
rc =fput(fileid,'\');rc =fwrite(fileid);
end;
+ else if rec='01'x then do; /* Unprintable */
+ rc =fput(fileid,'\');rc =fwrite(fileid);
+ rc =fput(fileid,'u');rc =fwrite(fileid);
+ rc =fput(fileid,'0');rc =fwrite(fileid);
+ rc =fput(fileid,'0');rc =fwrite(fileid);
+ rc =fput(fileid,'0');rc =fwrite(fileid);
+ rc =fput(fileid,'1');rc =fwrite(fileid);
+ end;
else do;
rc =fput(fileid,rec);
rc =fwrite(fileid);