1
0
mirror of https://github.com/sasjs/core.git synced 2025-12-10 22:14:35 +00:00
Files
core/meta/mm_getfoldertree.sas
2021-04-03 21:30:51 +02:00

92 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
<h4> SAS Macros </h4>
@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;