From 582ec0a1f94906bc5b47b5a542576415b5735171 Mon Sep 17 00:00:00 2001 From: munja Date: Tue, 15 Mar 2022 13:46:31 +0000 Subject: [PATCH 1/2] feat: enabling delete file for sasjs/server --- base/mf_existfeature.sas | 13 ++--- base/mp_abort.sas | 4 +- server/ms_deletefile.sas | 35 +++++++++++++ server/ms_getfile.sas | 2 +- tests/crossplatform/mp_loadformat.test.sas | 9 ++++ tests/serveronly/ms_deletefile.test.sas | 61 ++++++++++++++++++++++ 6 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 server/ms_deletefile.sas create mode 100644 tests/serveronly/ms_deletefile.test.sas diff --git a/base/mf_existfeature.sas b/base/mf_existfeature.sas index ecca91a..739b5e7 100644 --- a/base/mf_existfeature.sas +++ b/base/mf_existfeature.sas @@ -9,19 +9,17 @@ %put %mf_existfeature(PROCLUA); - @param feature the feature to detect. Leave blank to list all in log. + @param [in] feature The feature to detect. @return output returns 1 or 0 (or -1 if not found)

SAS Macros

@li mf_getplatform.sas - @version 8 @author Allan Bowe **/ /** @cond */ - %macro mf_existfeature(feature )/*/STORE SOURCE*/; %let feature=%upcase(&feature); @@ -29,7 +27,11 @@ %let platform=%mf_getplatform(); %if &feature= %then %do; - %put Supported features: PROCLUA; + %put No feature was requested for detection; + %end; + %else %if &feature=COLCONSTRAINTS %then %do; + %if %substr(&sysver,1,1)=4 %then 0; + %else 1; %end; %else %if &feature=PROCLUA %then %do; /* https://blogs.sas.com/content/sasdummy/2015/08/03/using-lua-within-your-sas-programs */ @@ -43,5 +45,4 @@ %put &sysmacroname: &feature not found; %end; %mend mf_existfeature; - -/** @endcond */ \ No newline at end of file +/** @endcond */ diff --git a/base/mp_abort.sas b/base/mp_abort.sas index 127fbab..745d952 100644 --- a/base/mp_abort.sas +++ b/base/mp_abort.sas @@ -85,7 +85,7 @@ %end; /* Stored Process Server web app context */ - %if %symexist(_metaperson) + %if %symexist(_metaport) or "&SYSPROCESSNAME "="Compute Server " or &mode=INCLUDE %then %do; @@ -260,4 +260,4 @@ %end; %mend mp_abort; -/** @endcond */ \ No newline at end of file +/** @endcond */ diff --git a/server/ms_deletefile.sas b/server/ms_deletefile.sas new file mode 100644 index 0000000..bf6f15c --- /dev/null +++ b/server/ms_deletefile.sas @@ -0,0 +1,35 @@ +/** + @file + @brief Deletes a file from SASjs Drive + @details Deletes a file from SASjs Drive, if it exists. + + Example: + + filename stpcode temp; + data _null_; + file stpcode; + put '%put hello world;'; + run; + %ms_createfile(/some/stored/program.sas, inref=stpcode) + + %ms_deletefile(/some/stored/program.sas) + + @param [in] driveloc The full path to the file in SASjs Drive + @param [in] mdebug= (0) Set to 1 to enable DEBUG messages + + +**/ + +%macro ms_deletefile(driveloc + ,mdebug=0 + ); + +proc http method='DELETE' + url="&_sasjs_apiserverurl/SASjsApi/drive/file?_filePath=&driveloc"; +%if &mdebug=1 %then %do; + debug level=2; +%end; +run; + + +%mend ms_deletefile; diff --git a/server/ms_getfile.sas b/server/ms_getfile.sas index 8041641..49d0c12 100644 --- a/server/ms_getfile.sas +++ b/server/ms_getfile.sas @@ -22,7 +22,7 @@ filename &outref temp; proc http method='GET' out=&outref - url="&_sasjs_apiserverurl/SASjsApi/drive/file?filePath=&driveloc"; + url="&_sasjs_apiserverurl/SASjsApi/drive/file?_filePath=&driveloc"; %if &mdebug=1 %then %do; debug level=2; %end; diff --git a/tests/crossplatform/mp_loadformat.test.sas b/tests/crossplatform/mp_loadformat.test.sas index 0bde24d..9c9be6d 100644 --- a/tests/crossplatform/mp_loadformat.test.sas +++ b/tests/crossplatform/mp_loadformat.test.sas @@ -82,3 +82,12 @@ run; desc=Test 1 - audit table updated, outds=work.test_results ) +data work.difftest; + set perm.audit; + where is_diff=1; +run; +%mp_assert( + iftrue=(%mf_nobs(work.difftest)>0), + desc=Test 1 - diffs were found, + outds=work.test_results +) diff --git a/tests/serveronly/ms_deletefile.test.sas b/tests/serveronly/ms_deletefile.test.sas new file mode 100644 index 0000000..3a1b2e9 --- /dev/null +++ b/tests/serveronly/ms_deletefile.test.sas @@ -0,0 +1,61 @@ +/** + @file + @brief Testing ms_deletefile.sas macro + +

SAS Macros

+ @li ms_createfile.sas + @li ms_deletefile.sas + @li ms_getfile.sas + @li mp_assert.sas + @li mp_assertscope.sas + +**/ + + +/* first make a remote file */ +filename stpcode temp; +%let fname=%mf_getuniquename(); +data _null_; + file stpcode; + put "data &fname;run;"; +run; +%ms_createfile(/sasjs/tests/&fname..sas + ,inref=stpcode + ,mdebug=1 +) + +%ms_getfile(/sasjs/tests/&fname..sas,outref=testref) + +%let test1=0; +data _null_; + infile testref; + input; + call symputx('test1',_infile_); +run; + +%mp_assert( + iftrue=("&test1"="data &fname;run;"), + desc=Make sure the file was created, + outds=work.test_results +) + +%mp_assertscope(SNAPSHOT) +%ms_deletefile(/sasjs/tests/&fname..sas,mdebug=1) +%mp_assertscope(COMPARE) + +%ms_getfile(/sasjs/tests/&fname..sas,outref=testref2) + +%let test2=0; +data _null_; + infile testref2; + input; + call symputx('test2',_infile_); +run; + +%mp_assert( + iftrue=("&test2"="%str(Err)or: File does not exist."), + desc=Make sure the file was deleted, + outds=work.test_results +) + + From d7e2ff8ac9b25e76886afba287650668d80e5146 Mon Sep 17 00:00:00 2001 From: munja Date: Tue, 15 Mar 2022 15:20:25 +0000 Subject: [PATCH 2/2] fix: diffs for format loads not showing in audit table --- all.sas | 64 ++++++++++++++++++++++++++++++++++-------- base/mp_loadformat.sas | 8 ++++-- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/all.sas b/all.sas index 4c262e7..624a4ed 100644 --- a/all.sas +++ b/all.sas @@ -167,19 +167,17 @@ options noquotelenmax; %put %mf_existfeature(PROCLUA); - @param feature the feature to detect. Leave blank to list all in log. + @param [in] feature The feature to detect. @return output returns 1 or 0 (or -1 if not found)

SAS Macros

@li mf_getplatform.sas - @version 8 @author Allan Bowe **/ /** @cond */ - %macro mf_existfeature(feature )/*/STORE SOURCE*/; %let feature=%upcase(&feature); @@ -187,7 +185,11 @@ options noquotelenmax; %let platform=%mf_getplatform(); %if &feature= %then %do; - %put Supported features: PROCLUA; + %put No feature was requested for detection; + %end; + %else %if &feature=COLCONSTRAINTS %then %do; + %if %substr(&sysver,1,1)=4 %then 0; + %else 1; %end; %else %if &feature=PROCLUA %then %do; /* https://blogs.sas.com/content/sasdummy/2015/08/03/using-lua-within-your-sas-programs */ @@ -201,8 +203,8 @@ options noquotelenmax; %put &sysmacroname: &feature not found; %end; %mend mf_existfeature; - -/** @endcond *//** +/** @endcond */ +/** @file @brief Checks whether a fileref exists @details You can probably do without this macro as it is just a one liner. @@ -2192,7 +2194,7 @@ Usage: %end; /* Stored Process Server web app context */ - %if %symexist(_metaperson) + %if %symexist(_metaport) or "&SYSPROCESSNAME "="Compute Server " or &mode=INCLUDE %then %do; @@ -2367,7 +2369,8 @@ Usage: %end; %mend mp_abort; -/** @endcond *//** +/** @endcond */ +/** @file @brief Append (concatenate) two or more files. @details Will append one more more `appendrefs` (filerefs) to a `baseref`. @@ -8768,7 +8771,7 @@ run; * First, extract only relevant formats from the catalog */ proc sql noprint; -select distinct fmtname into: fmtlist separated by ' ' from &libds; +select distinct upcase(fmtname) into: fmtlist separated by ' ' from &libds; %mp_cntlout(libcat=&libcat,fmtlist=&fmtlist,cntlout=&base_fmts) @@ -8778,8 +8781,11 @@ select distinct fmtname into: fmtlist separated by ' ' from &libds; */ %mddl_sas_cntlout(libds=&template) data &inlibds; + length &delete_col $3; if 0 then set &template; set &libds; + if &delete_col='' then &delete_col='No'; + fmtname=upcase(fmtname); if missing(type) then do; if substr(fmtname,1,1)='$' then type='C'; else type='N'; @@ -8790,7 +8796,6 @@ data &inlibds; end; run; - /** * Identify new records */ @@ -8897,7 +8902,7 @@ options ibufsize=&ibufsize; %end; %mp_storediffs(&libcat-FC - ,&inlibds + ,&base_fmts ,FMTNAME START ,delds=&outds_del ,modds=&outds_mod @@ -18922,6 +18927,41 @@ run; ) %mend ms_createfile; +/** + @file + @brief Deletes a file from SASjs Drive + @details Deletes a file from SASjs Drive, if it exists. + + Example: + + filename stpcode temp; + data _null_; + file stpcode; + put '%put hello world;'; + run; + %ms_createfile(/some/stored/program.sas, inref=stpcode) + + %ms_deletefile(/some/stored/program.sas) + + @param [in] driveloc The full path to the file in SASjs Drive + @param [in] mdebug= (0) Set to 1 to enable DEBUG messages + + +**/ + +%macro ms_deletefile(driveloc + ,mdebug=0 + ); + +proc http method='DELETE' + url="&_sasjs_apiserverurl/SASjsApi/drive/file?_filePath=&driveloc"; +%if &mdebug=1 %then %do; + debug level=2; +%end; +run; + + +%mend ms_deletefile; /** @file @brief Gets a file from SASjs Drive @@ -18946,7 +18986,7 @@ run; filename &outref temp; proc http method='GET' out=&outref - url="&_sasjs_apiserverurl/SASjsApi/drive/file?filePath=&driveloc"; + url="&_sasjs_apiserverurl/SASjsApi/drive/file?_filePath=&driveloc"; %if &mdebug=1 %then %do; debug level=2; %end; diff --git a/base/mp_loadformat.sas b/base/mp_loadformat.sas index e1e32eb..44f4371 100644 --- a/base/mp_loadformat.sas +++ b/base/mp_loadformat.sas @@ -134,7 +134,7 @@ run; * First, extract only relevant formats from the catalog */ proc sql noprint; -select distinct fmtname into: fmtlist separated by ' ' from &libds; +select distinct upcase(fmtname) into: fmtlist separated by ' ' from &libds; %mp_cntlout(libcat=&libcat,fmtlist=&fmtlist,cntlout=&base_fmts) @@ -144,8 +144,11 @@ select distinct fmtname into: fmtlist separated by ' ' from &libds; */ %mddl_sas_cntlout(libds=&template) data &inlibds; + length &delete_col $3; if 0 then set &template; set &libds; + if &delete_col='' then &delete_col='No'; + fmtname=upcase(fmtname); if missing(type) then do; if substr(fmtname,1,1)='$' then type='C'; else type='N'; @@ -156,7 +159,6 @@ data &inlibds; end; run; - /** * Identify new records */ @@ -263,7 +265,7 @@ options ibufsize=&ibufsize; %end; %mp_storediffs(&libcat-FC - ,&inlibds + ,&base_fmts ,FMTNAME START ,delds=&outds_del ,modds=&outds_mod