mirror of
https://github.com/sasjs/core.git
synced 2025-12-10 14:04:36 +00:00
90 lines
2.7 KiB
SAS
90 lines
2.7 KiB
SAS
/**
|
|
@file
|
|
@brief Returns all folders / subfolder content for a particular root
|
|
@details Shows all members and SubTrees recursively for a particular root.
|
|
Note - for big sites, this returns a lot of data! So you may wish to reduce
|
|
the logging to speed up the process (see example below), OR - use mm_tree.sas
|
|
which uses proc metadata and is far more efficient.
|
|
|
|
Usage:
|
|
|
|
options ps=max nonotes nosource;
|
|
%mm_getfoldertree(root=/My/Meta/Path, outds=iwantthisdataset)
|
|
options notes source;
|
|
|
|
@param [in] root= the parent folder under which to return all contents
|
|
@param [out] outds= the dataset to create that contains the list of
|
|
directories
|
|
@param [in] mDebug= set to 1 to show debug messages in the log
|
|
|
|
@version 9.4
|
|
@author Allan Bowe
|
|
|
|
**/
|
|
%macro mm_getfoldertree(
|
|
root=
|
|
,outds=work.mm_getfoldertree
|
|
,mDebug=0
|
|
,depth=50 /* how many nested folders to query */
|
|
,level=1 /* system var - to track current level depth */
|
|
,append=NO /* system var - when YES means appending within nested loop */
|
|
)/*/STORE SOURCE*/;
|
|
|
|
%if &level>&depth %then %return;
|
|
|
|
%local mD;
|
|
%if &mDebug=1 %then %let mD=;
|
|
%else %let mD=%str(*);
|
|
%&mD.put Executing &sysmacroname;
|
|
%&mD.put _local_;
|
|
|
|
%if &append=NO %then %do;
|
|
/* ensure table doesn't exist already */
|
|
data &outds; run;
|
|
proc sql; drop table &outds;
|
|
%end;
|
|
|
|
/* get folder contents */
|
|
data &outds.TMP/view=&outds.TMP;
|
|
length metauri pathuri $64 name $256 path $1024
|
|
assoctype publictype MetadataUpdated MetadataCreated $32;
|
|
keep metauri assoctype name publictype MetadataUpdated MetadataCreated path;
|
|
call missing(of _all_);
|
|
path="&root";
|
|
rc=metadata_pathobj("",path,"Folder",publictype,pathuri);
|
|
if publictype ne 'Tree' then do;
|
|
putlog "%str(WAR)NING: Tree " path 'does not exist!' publictype=;
|
|
stop;
|
|
end;
|
|
__n1=1;
|
|
do while(metadata_getnasl(pathuri,__n1,assoctype)>0);
|
|
__n1+1;
|
|
/* Walk through all possible associations of this object. */
|
|
__n2=1;
|
|
if assoctype in ('Members','SubTrees') then
|
|
do while(metadata_getnasn(pathuri,assoctype,__n2,metauri)>0);
|
|
__n2+1;
|
|
call missing(name,publictype,MetadataUpdated,MetadataCreated);
|
|
__rc1=metadata_getattr(metauri,"Name", name);
|
|
__rc2=metadata_getattr(metauri,"MetadataUpdated", MetadataUpdated);
|
|
__rc3=metadata_getattr(metauri,"MetadataCreated", MetadataCreated);
|
|
__rc4=metadata_getattr(metauri,"PublicType", PublicType);
|
|
output;
|
|
end;
|
|
n1+1;
|
|
end;
|
|
drop __:;
|
|
run;
|
|
|
|
proc append base=&outds data=&outds.TMP;
|
|
run;
|
|
|
|
data _null_;
|
|
set &outds.TMP(where=(assoctype='SubTrees'));
|
|
call execute('%mm_getfoldertree(root='
|
|
!!cats(path,"/",name)!!",outds=&outds,mDebug=&mdebug,depth=&depth"
|
|
!!",level=%eval(&level+1),append=YES)");
|
|
run;
|
|
|
|
%mend mm_getfoldertree;
|