From 8ffd06343a339f649713053ca3077193219f63ff Mon Sep 17 00:00:00 2001 From: munja Date: Fri, 11 Mar 2022 15:03:59 +0000 Subject: [PATCH] feat: adding new mf_deletefile macro (and test) Also, update to mm_spkexport macro --- all.sas | 49 +++++++++++++++++++--- base/mf_deletefile.sas | 31 ++++++++++++++ meta/mm_spkexport.sas | 18 +++++--- tests/crossplatform/mf_deletefile.test.sas | 28 +++++++++++++ 4 files changed, 116 insertions(+), 10 deletions(-) create mode 100644 base/mf_deletefile.sas create mode 100644 tests/crossplatform/mf_deletefile.test.sas diff --git a/all.sas b/all.sas index c935ab8..4c262e7 100644 --- a/all.sas +++ b/all.sas @@ -95,6 +95,37 @@ options noquotelenmax; %mend mf_dedup; +/** + @file + @brief Deletes a physical file, if it exists + @details Usage: + + %mf_writefile(&sasjswork/myfile.txt,l1=some content) + + %mf_deletefile(&sasjswork/myfile.txt) + + %mf_deletefile(&sasjswork/myfile.txt) + + + @param filepath Full path to the target file + + @returns The return code from the fdelete() invocation + +

Related Macros

+ @li mf_deletefile.test.sas + @li mf_writefile.sas + + @version 9.2 + @author Allan Bowe +**/ + +%macro mf_deletefile(file +)/*/STORE SOURCE*/; + %local rc fref; + %let rc= %sysfunc(filename(fref,&file)); + %if %sysfunc(fdelete(&fref)) ne 0 %then %put %sysfunc(sysmsg()); + %let rc= %sysfunc(filename(fref)); +%mend mf_deletefile; /** @file mf_existds.sas @brief Checks whether a dataset OR a view exists. @@ -17781,7 +17812,7 @@ filename __shake clear; %let platform_object_path=%mf_loc(POF); %let ds=%mf_getuniquename(prefix=spkexportable); -%mm_tree(root=%str(&metaloc) ,types=EXPORTABLE ,outds=&ds) +%mm_tree(root=%str(&metaloc),types=EXPORTABLE ,outds=&ds) %if %mf_isblank(&outref)=1 %then %let outref=%mf_getuniquefileref(); @@ -17790,19 +17821,27 @@ data _null_; file &outref lrecl=32767; length str $32767; if _n_=1 then do; + put "# Script generated by &sysuserid on %sysfunc(datetime(),datetime19.)"; put "cd ""&platform_object_path"" \"; put "; ./ExportPackage -host &host -port &port -user &mmxuser \"; - put " -disableX11 -password &mmxpass \" + put " -disableX11 -password &mmxpass \"; put " -package ""&cmdoutloc/&cmdoutname..spk"" \"; end; /* exclude particular patterns from the exported SPK */ %if "&excludevars" ne "0" %then %do; - /* ignore top level folder else all subcontent will be exported regardless */ - if _n_>1; %do i=1 %to %sysfunc(countw(&excludevars)); %let var=%scan(&excludevars,&i); - if index(path,symget("&var")) ne 0; + if _n_=1 then do; + length excludestr&i $1000; + retain excludestr&i; + excludestr&i=symget("&var"); + putlog excludestr&i=; + putlog path=; + end; + if index(path,cats(excludestr&i))=0 and index(name,cats(excludestr&i))=0; %end; + /* ignore top level folder else all subcontent will be exported regardless */ + if _n_>1; %end; str=' -objects '!!cats('"',path,'/',name,"(",publictype,')" \'); put str; diff --git a/base/mf_deletefile.sas b/base/mf_deletefile.sas new file mode 100644 index 0000000..355a581 --- /dev/null +++ b/base/mf_deletefile.sas @@ -0,0 +1,31 @@ +/** + @file + @brief Deletes a physical file, if it exists + @details Usage: + + %mf_writefile(&sasjswork/myfile.txt,l1=some content) + + %mf_deletefile(&sasjswork/myfile.txt) + + %mf_deletefile(&sasjswork/myfile.txt) + + + @param filepath Full path to the target file + + @returns The return code from the fdelete() invocation + +

Related Macros

+ @li mf_deletefile.test.sas + @li mf_writefile.sas + + @version 9.2 + @author Allan Bowe +**/ + +%macro mf_deletefile(file +)/*/STORE SOURCE*/; + %local rc fref; + %let rc= %sysfunc(filename(fref,&file)); + %if %sysfunc(fdelete(&fref)) ne 0 %then %put %sysfunc(sysmsg()); + %let rc= %sysfunc(filename(fref)); +%mend mf_deletefile; diff --git a/meta/mm_spkexport.sas b/meta/mm_spkexport.sas index 7eea1e3..f5d0b2b 100644 --- a/meta/mm_spkexport.sas +++ b/meta/mm_spkexport.sas @@ -102,7 +102,7 @@ %let platform_object_path=%mf_loc(POF); %let ds=%mf_getuniquename(prefix=spkexportable); -%mm_tree(root=%str(&metaloc) ,types=EXPORTABLE ,outds=&ds) +%mm_tree(root=%str(&metaloc),types=EXPORTABLE ,outds=&ds) %if %mf_isblank(&outref)=1 %then %let outref=%mf_getuniquefileref(); @@ -111,19 +111,27 @@ data _null_; file &outref lrecl=32767; length str $32767; if _n_=1 then do; + put "# Script generated by &sysuserid on %sysfunc(datetime(),datetime19.)"; put "cd ""&platform_object_path"" \"; put "; ./ExportPackage -host &host -port &port -user &mmxuser \"; - put " -disableX11 -password &mmxpass \" + put " -disableX11 -password &mmxpass \"; put " -package ""&cmdoutloc/&cmdoutname..spk"" \"; end; /* exclude particular patterns from the exported SPK */ %if "&excludevars" ne "0" %then %do; - /* ignore top level folder else all subcontent will be exported regardless */ - if _n_>1; %do i=1 %to %sysfunc(countw(&excludevars)); %let var=%scan(&excludevars,&i); - if index(path,symget("&var")) ne 0; + if _n_=1 then do; + length excludestr&i $1000; + retain excludestr&i; + excludestr&i=symget("&var"); + putlog excludestr&i=; + putlog path=; + end; + if index(path,cats(excludestr&i))=0 and index(name,cats(excludestr&i))=0; %end; + /* ignore top level folder else all subcontent will be exported regardless */ + if _n_>1; %end; str=' -objects '!!cats('"',path,'/',name,"(",publictype,')" \'); put str; diff --git a/tests/crossplatform/mf_deletefile.test.sas b/tests/crossplatform/mf_deletefile.test.sas new file mode 100644 index 0000000..29eb114 --- /dev/null +++ b/tests/crossplatform/mf_deletefile.test.sas @@ -0,0 +1,28 @@ +/** + @file + @brief Testing mf_deletefile.sas macro + +

SAS Macros

+ @li mf_deletefile.sas + @li mp_assert.sas + @li mp_assertscope.sas + +**/ + +%let test1file=&sasjswork/myfile1.txt; + +%mf_writefile(&test1file,l1=some content) + +%mp_assert( + iftrue=(%sysfunc(fileexist(&test1file))=1), + desc=Check &test1file exists +) + +%mp_assertscope(SNAPSHOT) +%mf_deletefile(&test1file) +%mp_assertscope(COMPARE) + +%mp_assert( + iftrue=(%sysfunc(fileexist(&test1file))=0), + desc=Check &test1file no longer exists +)