mirror of
https://github.com/sasjs/core.git
synced 2025-12-10 14:04:36 +00:00
327 lines
9.7 KiB
SAS
327 lines
9.7 KiB
SAS
/**
|
|
@file
|
|
@brief Create a SAS Library
|
|
@details Currently only supports BASE engine
|
|
|
|
This macro is idempotent - if you run it twice (for the same libref or
|
|
libname), it will only create one library. There is a dependency on other
|
|
macros in this library - they should be installed as a suite (see README).
|
|
|
|
Usage:
|
|
|
|
%mm_createlibrary(
|
|
libname=My New Library
|
|
,libref=mynewlib
|
|
,libdesc=Super & <fine>
|
|
,engine=BASE
|
|
,tree=/User Folders/sasdemo
|
|
,servercontext=SASApp
|
|
,directory=/tmp/tests
|
|
,mDebug=1)
|
|
|
|
<h4> SAS Macros </h4>
|
|
@li mf_verifymacvars.sas
|
|
@li mm_createfolder.sas
|
|
|
|
|
|
@param [in] libname= (My New Library) Library name (as displayed to user,
|
|
256 chars). Duplicates are not created (case sensitive).
|
|
@param [in] libref= (mynewlib) Library libref (8 chars). Duplicate
|
|
librefs are not created, HOWEVER- the check is not case sensitive - if
|
|
*libref* exists, *LIBREF* will still be created.
|
|
Librefs created will always be uppercased.
|
|
@param [in] engine= Library engine (currently only BASE supported)
|
|
@param [in] tree= The metadata folder uri, or the metadata path, in which to
|
|
create the library.
|
|
@param [in] servercontext= (SASApp) The SAS server against which
|
|
the library is registered.
|
|
@param [in] IsPreassigned= set to 1 if the library should be pre-assigned.
|
|
|
|
@param [in] libdesc= Library description (optional)
|
|
@param [in] directory= (/tmp/somelib) Required for the BASE engine.
|
|
The metadata directory objects are searched to find an existing
|
|
one with a matching physical path.
|
|
If more than one uri found with that path, then the first one will be used.
|
|
If no URI is found, a new directory object will be created. The physical
|
|
path will also be created, if it doesn't exist.
|
|
|
|
|
|
@param [in] mDebug= set to 1 to show debug messages in the log
|
|
@param [in] frefin= fileref to use (enables change if there is a conflict).
|
|
The filerefs are left open, to enable inspection after running the
|
|
macro (or importing into an xmlmap if needed).
|
|
@param [out] frefout= fileref to use (enables change if there is a conflict)
|
|
|
|
|
|
@version 9.3
|
|
@author Allan Bowe
|
|
|
|
**/
|
|
|
|
%macro mm_createlibrary(
|
|
libname=My New Library
|
|
,libref=mynewlib
|
|
,libdesc=Created automatically using the mm_createlibrary macro
|
|
,engine=BASE
|
|
,tree=/User Folders/sasdemo
|
|
,servercontext=SASApp
|
|
,directory=/tmp/somelib
|
|
,IsPreassigned=0
|
|
,mDebug=0
|
|
,frefin=mm_in
|
|
,frefout=mm_out
|
|
)/*/STORE SOURCE*/;
|
|
|
|
%local mD;
|
|
%if &mDebug=1 %then %let mD=;
|
|
%else %let mD=%str(*);
|
|
%&mD.put Executing &sysmacroname..sas;
|
|
%&mD.put _local_;
|
|
|
|
%let libref=%upcase(&libref);
|
|
|
|
/**
|
|
* Check Library does not exist already with this libname
|
|
*/
|
|
data _null_;
|
|
length type uri $256;
|
|
rc=metadata_resolve("omsobj:SASLibrary?@Name='&libname'",type,uri);
|
|
call symputx('checktype',type,'l');
|
|
call symputx('liburi',uri,'l');
|
|
putlog (_all_)(=);
|
|
run;
|
|
%if &checktype = SASLibrary %then %do;
|
|
%put %str(WARN)ING: Library (&liburi) already exists with libname (&libname);
|
|
%return;
|
|
%end;
|
|
|
|
/**
|
|
* Check Library does not exist already with this libref
|
|
*/
|
|
data _null_;
|
|
length type uri $256;
|
|
rc=metadata_resolve("omsobj:SASLibrary?@Libref='&libref'",type,uri);
|
|
call symputx('checktype',type,'l');
|
|
call symputx('liburi',uri,'l');
|
|
putlog (_all_)(=);
|
|
run;
|
|
%if &checktype = SASLibrary %then %do;
|
|
%put %str(WARN)ING: Library (&liburi) already exists with libref (&libref) ;
|
|
%return;
|
|
%end;
|
|
|
|
|
|
/**
|
|
* Attempt to create tree
|
|
*/
|
|
%mm_createfolder(path=&tree)
|
|
|
|
/**
|
|
* check tree exists
|
|
*/
|
|
data _null_;
|
|
length type uri $256;
|
|
rc=metadata_pathobj("","&tree","Folder",type,uri);
|
|
call symputx('foldertype',type,'l');
|
|
call symputx('treeuri',uri,'l');
|
|
run;
|
|
%if &foldertype ne Tree %then %do;
|
|
%put %str(WARN)ING: Tree &tree does not exist!;
|
|
%return;
|
|
%end;
|
|
|
|
/**
|
|
* Create filerefs for proc metadata call
|
|
*/
|
|
filename &frefin temp;
|
|
filename &frefout temp;
|
|
|
|
%mp_abort(iftrue= (
|
|
&engine=BASE & %mf_verifymacvars(libname libref engine servercontext tree)=0
|
|
)
|
|
,mac=&sysmacroname
|
|
,msg=%str(Empty inputs: libname libref engine servercontext tree)
|
|
)
|
|
|
|
%if &engine=BASE %then %do;
|
|
/**
|
|
* Check that the ServerContext exists
|
|
*/
|
|
data _null_;
|
|
length type uri $256;
|
|
rc=metadata_resolve("omsobj:ServerContext?@Name='&ServerContext'",type,uri);
|
|
call symputx('checktype',type,'l');
|
|
call symputx('serveruri',uri,'l');
|
|
putlog (_all_)(=);
|
|
run;
|
|
%if &checktype ne ServerContext %then %do;
|
|
%put %str(ERR)OR: ServerContext (&ServerContext) does not exist!;
|
|
%return;
|
|
%end;
|
|
|
|
/**
|
|
* Get prototype info
|
|
*/
|
|
data _null_;
|
|
length type uri str $256;
|
|
str="omsobj:Prototype?@Name='Library.SAS.Prototype.Name.xmlKey.txt'";
|
|
rc=metadata_resolve(str,type,uri);
|
|
call symputx('checktype',type,'l');
|
|
call symputx('prototypeuri',uri,'l');
|
|
putlog (_all_)(=);
|
|
run;
|
|
%if &checktype ne Prototype %then %do;
|
|
%put %str(ERR)OR: Prototype Library.SAS.Prototype.Name.xmlKey.txt not found;
|
|
%return;
|
|
%end;
|
|
|
|
/**
|
|
* Check that Physical location exists
|
|
*/
|
|
%if %sysfunc(fileexist(&directory))=0 %then %do;
|
|
%put %str(ERR)OR: Physical directory (&directory) does not appear to exist!;
|
|
%return;
|
|
%end;
|
|
|
|
/**
|
|
* Check that Directory Object exists in metadata
|
|
*/
|
|
data _null_;
|
|
length type uri $256;
|
|
rc=metadata_resolve("omsobj:Directory?@DirectoryRole='LibraryPath'"
|
|
!!" and @DirectoryName='&directory'",type,uri);
|
|
call symputx('checktype',type,'l');
|
|
call symputx('directoryuri',uri,'l');
|
|
putlog (_all_)(=);
|
|
run;
|
|
%if &checktype ne Directory %then %do;
|
|
%put NOTE: Directory object does not exist for (&directory) location;
|
|
%put NOTE: It will now be created;
|
|
|
|
data _null_;
|
|
file &frefin;
|
|
directory=quote(symget('directory'));
|
|
put "<AddMetadata><Reposid>$METAREPOSITORY</Reposid><Metadata> "/
|
|
'<Directory UsageVersion="1000000" IsHidden="0" IsRelative="0"'/
|
|
' DirectoryRole="LibraryPath" Name="Path" DirectoryName=' directory '/>'/
|
|
"</Metadata><NS>SAS</NS>"/
|
|
"<Flags>268435456</Flags></AddMetadata>";
|
|
run;
|
|
|
|
proc metadata in= &frefin out=&frefout %if &mdebug=1 %then verbose;;
|
|
run;
|
|
%if &mdebug=1 %then %do;
|
|
data _null_;
|
|
infile &frefout lrecl=1048576;
|
|
input; put _infile_;
|
|
run;
|
|
%end;
|
|
%put NOTE: Checking to ensure directory (&directory) object was created;
|
|
data _null_;
|
|
length type uri $256;
|
|
rc=metadata_resolve("omsobj:Directory?@DirectoryRole='LibraryPath'"
|
|
!!" and @DirectoryName='&directory'",type,uri);
|
|
call symputx('checktype2',type,'l');
|
|
call symputx('directoryuri',uri,'l');
|
|
%if &mdebug=1 %then putlog (_all_)(=);;
|
|
run;
|
|
%if &checktype2 ne Directory %then %do;
|
|
%put %str(ERR)OR: Directory (&directory) object was NOT created!;
|
|
%return;
|
|
%end;
|
|
%else %put NOTE: Directory (&directoryuri) successfully created!;
|
|
%end;
|
|
|
|
/**
|
|
* check SAS version
|
|
*/
|
|
%if %sysevalf(&sysver lt 9.3) %then %do;
|
|
%put %str(WARN)ING: Version 9.3 or later required;
|
|
%return;
|
|
%end;
|
|
|
|
/**
|
|
* Prepare the XML and create the library
|
|
*/
|
|
data _null_;
|
|
file &frefin;
|
|
treeuri=quote(symget('treeuri'));
|
|
serveruri=quote(symget('serveruri'));
|
|
directoryuri=quote(symget('directoryuri'));
|
|
libname=quote(symget('libname'));
|
|
libref=quote(symget('libref'));
|
|
IsPreassigned=quote(symget('IsPreassigned'));
|
|
prototypeuri=quote(symget('prototypeuri'));
|
|
|
|
/* escape description so it can be stored as XML */
|
|
libdesc=tranwrd(symget('libdesc'),'&','&');
|
|
libdesc=tranwrd(libdesc,'<','<');
|
|
libdesc=tranwrd(libdesc,'>','>');
|
|
libdesc=tranwrd(libdesc,"'",''');
|
|
libdesc=tranwrd(libdesc,'"','"');
|
|
libdesc=tranwrd(libdesc,'0A'x,' ');
|
|
libdesc=tranwrd(libdesc,'0D'x,' ');
|
|
libdesc=tranwrd(libdesc,'$','$');
|
|
libdesc=quote(trim(libdesc));
|
|
|
|
put "<AddMetadata><Reposid>$METAREPOSITORY</Reposid><Metadata> "/
|
|
'<SASLibrary Desc=' libdesc ' Engine="BASE" IsDBMSLibname="0" '/
|
|
' IsHidden="0" IsPreassigned=' IsPreassigned ' Libref=' libref /
|
|
' UsageVersion="1000000" PublicType="Library" name=' libname '>'/
|
|
' <DeployedComponents>'/
|
|
' <ServerContext ObjRef=' serveruri "/>"/
|
|
' </DeployedComponents>'/
|
|
' <PropertySets>'/
|
|
' <PropertySet Name="ModifiedByProductPropertySet" '/
|
|
' SetRole="ModifiedByProductPropertySet" UsageVersion="0" />'/
|
|
' </PropertySets>'/
|
|
" <Trees><Tree ObjRef=" treeuri "/></Trees>"/
|
|
' <UsingPackages> '/
|
|
' <Directory ObjRef=' directoryuri ' />'/
|
|
' </UsingPackages>'/
|
|
' <UsingPrototype>'/
|
|
' <Prototype ObjRef=' prototypeuri '/>'/
|
|
' </UsingPrototype>'/
|
|
'</SASLibrary></Metadata><NS>SAS</NS>'/
|
|
'<Flags>268435456</Flags></AddMetadata>';
|
|
run;
|
|
|
|
|
|
proc metadata in= &frefin out=&frefout %if &mdebug=1 %then verbose ;;
|
|
run;
|
|
|
|
%if &mdebug=1 %then %do;
|
|
data _null_;
|
|
infile &frefout lrecl=1048576;
|
|
input;put _infile_;
|
|
run;
|
|
%end;
|
|
%put NOTE: Checking to ensure library (&libname) was created;
|
|
data _null_;
|
|
length type uri $256;
|
|
rc=metadata_pathobj("","&tree/&libname","Library",type,uri);
|
|
call symputx('libtype',type,'l');
|
|
call symputx('liburi',uri,'l');
|
|
%if &mdebug=1 %then putlog (_all_)(=);;
|
|
run;
|
|
%if &libtype ne SASLibrary %then %do;
|
|
%put %str(ERR)OR: Could not find (&libname) at (&tree)!!;
|
|
%return;
|
|
%end;
|
|
%else %put NOTE: Library (&libname) successfully created in (&tree)!;
|
|
%end;
|
|
%else %do;
|
|
%put %str(ERR)OR: Other library engine types are not yet supported!!;
|
|
%end;
|
|
|
|
|
|
/**
|
|
* Wrap up
|
|
*/
|
|
%if &mdebug ne 1 %then %do;
|
|
filename &frefin clear;
|
|
filename &frefout clear;
|
|
%end;
|
|
|
|
%mend mm_createlibrary;
|