mirror of
https://github.com/sasjs/core.git
synced 2026-01-10 18:50:04 +00:00
Merge pull request #198 from sasjs/server
feat: enabling delete file for sasjs/server
This commit is contained in:
64
all.sas
64
all.sas
@@ -167,19 +167,17 @@ options noquotelenmax;
|
|||||||
|
|
||||||
%put %mf_existfeature(PROCLUA);
|
%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)
|
@return output returns 1 or 0 (or -1 if not found)
|
||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
|
|
||||||
|
|
||||||
@version 8
|
@version 8
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
**/
|
**/
|
||||||
/** @cond */
|
/** @cond */
|
||||||
|
|
||||||
%macro mf_existfeature(feature
|
%macro mf_existfeature(feature
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
%let feature=%upcase(&feature);
|
%let feature=%upcase(&feature);
|
||||||
@@ -187,7 +185,11 @@ options noquotelenmax;
|
|||||||
%let platform=%mf_getplatform();
|
%let platform=%mf_getplatform();
|
||||||
|
|
||||||
%if &feature= %then %do;
|
%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;
|
%end;
|
||||||
%else %if &feature=PROCLUA %then %do;
|
%else %if &feature=PROCLUA %then %do;
|
||||||
/* https://blogs.sas.com/content/sasdummy/2015/08/03/using-lua-within-your-sas-programs */
|
/* 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;
|
%put &sysmacroname: &feature not found;
|
||||||
%end;
|
%end;
|
||||||
%mend mf_existfeature;
|
%mend mf_existfeature;
|
||||||
|
/** @endcond */
|
||||||
/** @endcond *//**
|
/**
|
||||||
@file
|
@file
|
||||||
@brief Checks whether a fileref exists
|
@brief Checks whether a fileref exists
|
||||||
@details You can probably do without this macro as it is just a one liner.
|
@details You can probably do without this macro as it is just a one liner.
|
||||||
@@ -2192,7 +2194,7 @@ Usage:
|
|||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* Stored Process Server web app context */
|
/* Stored Process Server web app context */
|
||||||
%if %symexist(_metaperson)
|
%if %symexist(_metaport)
|
||||||
or "&SYSPROCESSNAME "="Compute Server "
|
or "&SYSPROCESSNAME "="Compute Server "
|
||||||
or &mode=INCLUDE
|
or &mode=INCLUDE
|
||||||
%then %do;
|
%then %do;
|
||||||
@@ -2367,7 +2369,8 @@ Usage:
|
|||||||
%end;
|
%end;
|
||||||
%mend mp_abort;
|
%mend mp_abort;
|
||||||
|
|
||||||
/** @endcond *//**
|
/** @endcond */
|
||||||
|
/**
|
||||||
@file
|
@file
|
||||||
@brief Append (concatenate) two or more files.
|
@brief Append (concatenate) two or more files.
|
||||||
@details Will append one more more `appendrefs` (filerefs) to a `baseref`.
|
@details Will append one more more `appendrefs` (filerefs) to a `baseref`.
|
||||||
@@ -8768,7 +8771,7 @@ run;
|
|||||||
* First, extract only relevant formats from the catalog
|
* First, extract only relevant formats from the catalog
|
||||||
*/
|
*/
|
||||||
proc sql noprint;
|
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)
|
%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)
|
%mddl_sas_cntlout(libds=&template)
|
||||||
data &inlibds;
|
data &inlibds;
|
||||||
|
length &delete_col $3;
|
||||||
if 0 then set &template;
|
if 0 then set &template;
|
||||||
set &libds;
|
set &libds;
|
||||||
|
if &delete_col='' then &delete_col='No';
|
||||||
|
fmtname=upcase(fmtname);
|
||||||
if missing(type) then do;
|
if missing(type) then do;
|
||||||
if substr(fmtname,1,1)='$' then type='C';
|
if substr(fmtname,1,1)='$' then type='C';
|
||||||
else type='N';
|
else type='N';
|
||||||
@@ -8790,7 +8796,6 @@ data &inlibds;
|
|||||||
end;
|
end;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Identify new records
|
* Identify new records
|
||||||
*/
|
*/
|
||||||
@@ -8897,7 +8902,7 @@ options ibufsize=&ibufsize;
|
|||||||
%end;
|
%end;
|
||||||
|
|
||||||
%mp_storediffs(&libcat-FC
|
%mp_storediffs(&libcat-FC
|
||||||
,&inlibds
|
,&base_fmts
|
||||||
,FMTNAME START
|
,FMTNAME START
|
||||||
,delds=&outds_del
|
,delds=&outds_del
|
||||||
,modds=&outds_mod
|
,modds=&outds_mod
|
||||||
@@ -18922,6 +18927,41 @@ run;
|
|||||||
)
|
)
|
||||||
|
|
||||||
%mend ms_createfile;
|
%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
|
@file
|
||||||
@brief Gets a file from SASjs Drive
|
@brief Gets a file from SASjs Drive
|
||||||
@@ -18946,7 +18986,7 @@ run;
|
|||||||
filename &outref temp;
|
filename &outref temp;
|
||||||
|
|
||||||
proc http method='GET' out=&outref
|
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;
|
%if &mdebug=1 %then %do;
|
||||||
debug level=2;
|
debug level=2;
|
||||||
%end;
|
%end;
|
||||||
|
|||||||
@@ -9,19 +9,17 @@
|
|||||||
|
|
||||||
%put %mf_existfeature(PROCLUA);
|
%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)
|
@return output returns 1 or 0 (or -1 if not found)
|
||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
|
|
||||||
|
|
||||||
@version 8
|
@version 8
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
**/
|
**/
|
||||||
/** @cond */
|
/** @cond */
|
||||||
|
|
||||||
%macro mf_existfeature(feature
|
%macro mf_existfeature(feature
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
%let feature=%upcase(&feature);
|
%let feature=%upcase(&feature);
|
||||||
@@ -29,7 +27,11 @@
|
|||||||
%let platform=%mf_getplatform();
|
%let platform=%mf_getplatform();
|
||||||
|
|
||||||
%if &feature= %then %do;
|
%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;
|
%end;
|
||||||
%else %if &feature=PROCLUA %then %do;
|
%else %if &feature=PROCLUA %then %do;
|
||||||
/* https://blogs.sas.com/content/sasdummy/2015/08/03/using-lua-within-your-sas-programs */
|
/* https://blogs.sas.com/content/sasdummy/2015/08/03/using-lua-within-your-sas-programs */
|
||||||
@@ -43,5 +45,4 @@
|
|||||||
%put &sysmacroname: &feature not found;
|
%put &sysmacroname: &feature not found;
|
||||||
%end;
|
%end;
|
||||||
%mend mf_existfeature;
|
%mend mf_existfeature;
|
||||||
|
/** @endcond */
|
||||||
/** @endcond */
|
|
||||||
|
|||||||
@@ -85,7 +85,7 @@
|
|||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* Stored Process Server web app context */
|
/* Stored Process Server web app context */
|
||||||
%if %symexist(_metaperson)
|
%if %symexist(_metaport)
|
||||||
or "&SYSPROCESSNAME "="Compute Server "
|
or "&SYSPROCESSNAME "="Compute Server "
|
||||||
or &mode=INCLUDE
|
or &mode=INCLUDE
|
||||||
%then %do;
|
%then %do;
|
||||||
@@ -260,4 +260,4 @@
|
|||||||
%end;
|
%end;
|
||||||
%mend mp_abort;
|
%mend mp_abort;
|
||||||
|
|
||||||
/** @endcond */
|
/** @endcond */
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ run;
|
|||||||
* First, extract only relevant formats from the catalog
|
* First, extract only relevant formats from the catalog
|
||||||
*/
|
*/
|
||||||
proc sql noprint;
|
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)
|
%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)
|
%mddl_sas_cntlout(libds=&template)
|
||||||
data &inlibds;
|
data &inlibds;
|
||||||
|
length &delete_col $3;
|
||||||
if 0 then set &template;
|
if 0 then set &template;
|
||||||
set &libds;
|
set &libds;
|
||||||
|
if &delete_col='' then &delete_col='No';
|
||||||
|
fmtname=upcase(fmtname);
|
||||||
if missing(type) then do;
|
if missing(type) then do;
|
||||||
if substr(fmtname,1,1)='$' then type='C';
|
if substr(fmtname,1,1)='$' then type='C';
|
||||||
else type='N';
|
else type='N';
|
||||||
@@ -156,7 +159,6 @@ data &inlibds;
|
|||||||
end;
|
end;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Identify new records
|
* Identify new records
|
||||||
*/
|
*/
|
||||||
@@ -263,7 +265,7 @@ options ibufsize=&ibufsize;
|
|||||||
%end;
|
%end;
|
||||||
|
|
||||||
%mp_storediffs(&libcat-FC
|
%mp_storediffs(&libcat-FC
|
||||||
,&inlibds
|
,&base_fmts
|
||||||
,FMTNAME START
|
,FMTNAME START
|
||||||
,delds=&outds_del
|
,delds=&outds_del
|
||||||
,modds=&outds_mod
|
,modds=&outds_mod
|
||||||
|
|||||||
35
server/ms_deletefile.sas
Normal file
35
server/ms_deletefile.sas
Normal file
@@ -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;
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
filename &outref temp;
|
filename &outref temp;
|
||||||
|
|
||||||
proc http method='GET' out=&outref
|
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;
|
%if &mdebug=1 %then %do;
|
||||||
debug level=2;
|
debug level=2;
|
||||||
%end;
|
%end;
|
||||||
|
|||||||
@@ -82,3 +82,12 @@ run;
|
|||||||
desc=Test 1 - audit table updated,
|
desc=Test 1 - audit table updated,
|
||||||
outds=work.test_results
|
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
|
||||||
|
)
|
||||||
|
|||||||
61
tests/serveronly/ms_deletefile.test.sas
Normal file
61
tests/serveronly/ms_deletefile.test.sas
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing ms_deletefile.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@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
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user