@sasjs/utils 2.49.0 → 2.49.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/fs/internal/helper.js +19 -24
  2. package/fs/internal/helper.js.map +1 -1
  3. package/macros/mf_abort.sas +27 -0
  4. package/macros/mf_dedup.sas +53 -0
  5. package/macros/mf_deletefile.sas +31 -0
  6. package/macros/mf_existds.sas +30 -0
  7. package/macros/mf_existfeature.sas +59 -0
  8. package/macros/mf_existfileref.sas +33 -0
  9. package/macros/mf_existfunction.sas +37 -0
  10. package/macros/mf_existvar.sas +39 -0
  11. package/macros/mf_existvarlist.sas +56 -0
  12. package/macros/mf_fmtdttm.sas +42 -0
  13. package/macros/mf_getapploc.sas +78 -0
  14. package/macros/mf_getattrc.sas +34 -0
  15. package/macros/mf_getattrn.sas +34 -0
  16. package/macros/mf_getengine.sas +54 -0
  17. package/macros/mf_getfilesize.sas +64 -0
  18. package/macros/mf_getfmtlist.sas +61 -0
  19. package/macros/mf_getfmtname.sas +44 -0
  20. package/macros/mf_getkeyvalue.sas +32 -0
  21. package/macros/mf_getplatform.sas +75 -0
  22. package/macros/mf_getquotedstr.sas +57 -0
  23. package/macros/mf_getschema.sas +43 -0
  24. package/macros/mf_getuniquefileref.sas +60 -0
  25. package/macros/mf_getuniquelibref.sas +57 -0
  26. package/macros/mf_getuniquename.sas +22 -0
  27. package/macros/mf_getuser.sas +44 -0
  28. package/macros/mf_getvalue.sas +36 -0
  29. package/macros/mf_getvarcount.sas +49 -0
  30. package/macros/mf_getvarformat.sas +72 -0
  31. package/macros/mf_getvarlen.sas +56 -0
  32. package/macros/mf_getvarlist.sas +74 -0
  33. package/macros/mf_getvarnum.sas +58 -0
  34. package/macros/mf_getvartype.sas +52 -0
  35. package/macros/mf_getxengine.sas +43 -0
  36. package/macros/mf_increment.sas +29 -0
  37. package/macros/mf_isblank.sas +27 -0
  38. package/macros/mf_isdir.sas +34 -0
  39. package/macros/mf_isint.sas +36 -0
  40. package/macros/mf_islibds.sas +40 -0
  41. package/macros/mf_loc.sas +29 -0
  42. package/macros/mf_mkdir.sas +67 -0
  43. package/macros/mf_mval.sas +19 -0
  44. package/macros/mf_nobs.sas +26 -0
  45. package/macros/mf_trimstr.sas +50 -0
  46. package/macros/mf_uid.sas +21 -0
  47. package/macros/mf_verifymacvars.sas +72 -0
  48. package/macros/mf_wordsinstr1andstr2.sas +53 -0
  49. package/macros/mf_wordsinstr1butnotstr2.sas +54 -0
  50. package/macros/mf_writefile.sas +67 -0
  51. package/macros/mp_abort.sas +301 -0
  52. package/macros/mp_appendfile.sas +57 -0
  53. package/macros/mp_applyformats.sas +181 -0
  54. package/macros/mp_assert.sas +56 -0
  55. package/macros/mp_assertcols.sas +145 -0
  56. package/macros/mp_assertcolvals.sas +168 -0
  57. package/macros/mp_assertdsobs.sas +121 -0
  58. package/macros/mp_assertscope.sas +147 -0
  59. package/macros/mp_base64copy.sas +117 -0
  60. package/macros/mp_binarycopy.sas +79 -0
  61. package/macros/mp_chop.sas +194 -0
  62. package/macros/mp_cleancsv.sas +78 -0
  63. package/macros/mp_cntlout.sas +85 -0
  64. package/macros/mp_copyfolder.sas +84 -0
  65. package/macros/mp_coretable.sas +73 -0
  66. package/macros/mp_createconstraints.sas +70 -0
  67. package/macros/mp_createwebservice.sas +32 -0
  68. package/macros/mp_csv2ds.sas +140 -0
  69. package/macros/mp_deleteconstraints.sas +52 -0
  70. package/macros/mp_deletefolder.sas +70 -0
  71. package/macros/mp_dictionary.sas +52 -0
  72. package/macros/mp_dirlist.sas +263 -0
  73. package/macros/mp_distinctfmtvalues.sas +50 -0
  74. package/macros/mp_dropmembers.sas +46 -0
  75. package/macros/mp_ds2cards.sas +291 -0
  76. package/macros/mp_ds2csv.sas +212 -0
  77. package/macros/mp_ds2ddl.sas +30 -0
  78. package/macros/mp_ds2fmtds.sas +105 -0
  79. package/macros/mp_ds2inserts.sas +180 -0
  80. package/macros/mp_ds2md.sas +103 -0
  81. package/macros/mp_ds2squeeze.sas +120 -0
  82. package/macros/mp_dsmeta.sas +110 -0
  83. package/macros/mp_filtercheck.sas +251 -0
  84. package/macros/mp_filtergenerate.sas +105 -0
  85. package/macros/mp_filterstore.sas +254 -0
  86. package/macros/mp_filtervalidate.sas +105 -0
  87. package/macros/mp_getcols.sas +67 -0
  88. package/macros/mp_getconstraints.sas +115 -0
  89. package/macros/mp_getdbml.sas +335 -0
  90. package/macros/mp_getddl.sas +400 -0
  91. package/macros/mp_getformats.sas +124 -0
  92. package/macros/mp_getmaxvarlengths.sas +130 -0
  93. package/macros/mp_getpk.sas +281 -0
  94. package/macros/mp_gsubfile.sas +58 -0
  95. package/macros/mp_guesspk.sas +332 -0
  96. package/macros/mp_hashdataset.sas +91 -0
  97. package/macros/mp_hashdirectory.sas +162 -0
  98. package/macros/mp_include.sas +106 -0
  99. package/macros/mp_init.sas +76 -0
  100. package/macros/mp_jsonout.sas +406 -0
  101. package/macros/mp_lib2cards.sas +78 -0
  102. package/macros/mp_lib2inserts.sas +77 -0
  103. package/macros/mp_loadformat.sas +303 -0
  104. package/macros/mp_lockanytable.sas +243 -0
  105. package/macros/mp_lockfilecheck.sas +103 -0
  106. package/macros/mp_makedata.sas +107 -0
  107. package/macros/mp_md5.sas +58 -0
  108. package/macros/mp_perflog.sas +43 -0
  109. package/macros/mp_prevobs.sas +88 -0
  110. package/macros/mp_recursivejoin.sas +90 -0
  111. package/macros/mp_replace.sas +151 -0
  112. package/macros/mp_reseterror.sas +27 -0
  113. package/macros/mp_resetoption.sas +39 -0
  114. package/macros/mp_retainedkey.sas +247 -0
  115. package/macros/mp_runddl.sas +49 -0
  116. package/macros/mp_searchcols.sas +103 -0
  117. package/macros/mp_searchdata.sas +131 -0
  118. package/macros/mp_setkeyvalue.sas +55 -0
  119. package/macros/mp_sortinplace.sas +122 -0
  120. package/macros/mp_stackdiffs.sas +592 -0
  121. package/macros/mp_storediffs.sas +230 -0
  122. package/macros/mp_stprequests.sas +74 -0
  123. package/macros/mp_streamfile.sas +212 -0
  124. package/macros/mp_testjob.sas +92 -0
  125. package/macros/mp_testservice.sas +39 -0
  126. package/macros/mp_testwritespeedlibrary.sas +59 -0
  127. package/macros/mp_tree.sas +71 -0
  128. package/macros/mp_unzip.sas +90 -0
  129. package/macros/mp_updatevarlength.sas +93 -0
  130. package/macros/mp_validatecol.sas +97 -0
  131. package/macros/mp_wait4file.sas +35 -0
  132. package/macros/mp_webin.sas +59 -0
  133. package/macros/mp_zip.sas +85 -0
  134. package/package.json +4 -1
  135. package/scripts/copySASjsCore.ts +36 -0
  136. package/utils/index.d.ts +1 -2
  137. package/utils/index.js +2 -3
  138. package/utils/index.js.map +1 -1
  139. package/utils/utils.d.ts +1 -0
  140. package/utils/utils.js +7 -1
  141. package/utils/utils.js.map +1 -1
  142. package/utils/getNodeModulePath.d.ts +0 -2
  143. package/utils/getNodeModulePath.js +0 -83
  144. package/utils/getNodeModulePath.js.map +0 -1
@@ -0,0 +1,54 @@
1
+ /**
2
+ @file
3
+ @brief Returns the engine type of a SAS library
4
+ @details Usage:
5
+
6
+ %put %mf_getengine(SASHELP);
7
+
8
+ returns:
9
+ > V9
10
+
11
+ A note is also written to the log. The credit for this macro goes to the
12
+ contributors of Chris Hemedingers blog [post](
13
+ http://blogs.sas.com/content/sasdummy/2013/06/04/find-a-sas-library-engine/)
14
+
15
+ @param [in] libref Library reference (also accepts a 2 level libds ref).
16
+
17
+ @return output returns the library engine (uppercase) for the FIRST library
18
+ encountered.
19
+
20
+ @warning will only return the FIRST library engine - for concatenated
21
+ libraries, with different engines, inconsistent results may be encountered.
22
+
23
+ @version 9.2
24
+ @author Allan Bowe
25
+
26
+ <h4> Related Macros </h4>
27
+ @li mf_getxengine.sas
28
+
29
+ **/
30
+ /** @cond */
31
+
32
+ %macro mf_getengine(libref
33
+ )/*/STORE SOURCE*/;
34
+ %local dsid engnum rc engine;
35
+
36
+ /* in case the parameter is a libref.tablename, pull off just the libref */
37
+ %let libref = %upcase(%scan(&libref, 1, %str(.)));
38
+
39
+ %let dsid=%sysfunc(
40
+ open(sashelp.vlibnam(where=(libname="%upcase(&libref)")),i)
41
+ );
42
+ %if (&dsid ^= 0) %then %do;
43
+ %let engnum=%sysfunc(varnum(&dsid,ENGINE));
44
+ %let rc=%sysfunc(fetch(&dsid));
45
+ %let engine=%sysfunc(getvarc(&dsid,&engnum));
46
+ %put &libref. ENGINE is &engine.;
47
+ %let rc= %sysfunc(close(&dsid));
48
+ %end;
49
+
50
+ %upcase(&engine)
51
+
52
+ %mend mf_getengine;
53
+
54
+ /** @endcond */
@@ -0,0 +1,64 @@
1
+ /**
2
+ @file
3
+ @brief Returns the size of a file in bytes.
4
+ @details Provide full path/filename.extension to the file, eg:
5
+
6
+ %put %mf_getfilesize(fpath=C:\temp\myfile.txt);
7
+
8
+ or, provide a libds value as follows:
9
+
10
+ data x;do x=1 to 100000;y=x;output;end;run;
11
+ %put %mf_getfilesize(libds=work.x,format=yes);
12
+
13
+ Which gives:
14
+
15
+ > 2mb
16
+
17
+ @param [in] fpath= Full path and filename. Provide this OR the libds value.
18
+ @param [in] libds= (0) Library.dataset value (assumes library is BASE engine)
19
+ @param [in] format= (NO) Set to yes to apply sizekmg. format
20
+
21
+ @returns bytes
22
+
23
+ @version 9.2
24
+ @author Allan Bowe
25
+ **/
26
+
27
+ %macro mf_getfilesize(fpath=,libds=0,format=NO
28
+ )/*/STORE SOURCE*/;
29
+
30
+ %local rc fid fref bytes dsid lib vnum;
31
+
32
+ %if &libds ne 0 %then %do;
33
+ %let libds=%upcase(&libds);
34
+ %if %index(&libds,.)=0 %then %let lib=WORK;
35
+ %else %let lib=%scan(&libds,1,.);
36
+ %let dsid=%sysfunc(open(
37
+ sashelp.vtable(where=(libname="&lib" and memname="%scan(&libds,-1,.)")
38
+ keep=libname memname filesize
39
+ )
40
+ ));
41
+ %if (&dsid ^= 0) %then %do;
42
+ %let vnum=%sysfunc(varnum(&dsid,FILESIZE));
43
+ %let rc=%sysfunc(fetch(&dsid));
44
+ %let bytes=%sysfunc(getvarn(&dsid,&vnum));
45
+ %let rc= %sysfunc(close(&dsid));
46
+ %end;
47
+ %else %put &sysmacroname: &libds could not be opened! %sysfunc(sysmsg());
48
+ %end;
49
+ %else %do;
50
+ %let rc=%sysfunc(filename(fref,&fpath));
51
+ %let fid=%sysfunc(fopen(&fref));
52
+ %let bytes=%sysfunc(finfo(&fid,File Size (bytes)));
53
+ %let rc=%sysfunc(fclose(&fid));
54
+ %let rc=%sysfunc(filename(fref));
55
+ %end;
56
+
57
+ %if &format=NO %then %do;
58
+ &bytes
59
+ %end;
60
+ %else %do;
61
+ %sysfunc(INPUTN(&bytes, best.),sizekmg.)
62
+ %end;
63
+
64
+ %mend mf_getfilesize ;
@@ -0,0 +1,61 @@
1
+ /**
2
+ @file
3
+ @brief Returns a distinct list of formats from a table
4
+ @details Reads the dataset header and returns a distinct list of formats
5
+ applied.
6
+
7
+ %put NOTE- %mf_getfmtlist(sashelp.prdsale);
8
+ %put NOTE- %mf_getfmtlist(sashelp.shoes);
9
+ %put NOTE- %mf_getfmtlist(sashelp.demographics);
10
+
11
+ returns:
12
+
13
+ > DOLLAR $CHAR W MONNAME
14
+ > $CHAR BEST DOLLAR
15
+ > BEST Z $CHAR COMMA PERCENTN
16
+
17
+
18
+ @param [in] libds Two part library.dataset reference.
19
+
20
+ <h4> SAS Macros </h4>
21
+ @li mf_getfmtname.sas
22
+
23
+ @version 9.2
24
+ @author Allan Bowe
25
+
26
+ **/
27
+
28
+ %macro mf_getfmtlist(libds
29
+ )/*/STORE SOURCE*/;
30
+ /* declare local vars */
31
+ %local out dsid nvars x rc fmt;
32
+
33
+ /* open dataset in macro */
34
+ %let dsid=%sysfunc(open(&libds));
35
+
36
+ /* continue if dataset exists */
37
+ %if &dsid %then %do;
38
+ /* loop each variable in the dataset */
39
+ %let nvars=%sysfunc(attrn(&dsid,NVARS));
40
+ %do x=1 %to &nvars;
41
+ /* grab format and check it exists */
42
+ %let fmt=%sysfunc(varfmt(&dsid,&x));
43
+ %if %quote(&fmt) ne %quote() %then %let fmt=%mf_getfmtname(&fmt);
44
+ %else %do;
45
+ /* assign default format depending on variable type */
46
+ %if %sysfunc(vartype(&dsid, &x))=C %then %let fmt=$CHAR;
47
+ %else %let fmt=BEST;
48
+ %end;
49
+ /* concatenate unique list of formats */
50
+ %if %sysfunc(indexw(&out,&fmt,%str( )))=0 %then %let out=&out &fmt;
51
+ %end;
52
+ %let rc=%sysfunc(close(&dsid));
53
+ %end;
54
+ %else %do;
55
+ %put &sysmacroname: Unable to open &libds (rc=&dsid);
56
+ %put &sysmacroname: SYSMSG= %sysfunc(sysmsg());
57
+ %let rc=%sysfunc(close(&dsid));
58
+ %end;
59
+ /* send them out without spaces or quote markers */
60
+ %do;%unquote(&out)%end;
61
+ %mend mf_getfmtlist;
@@ -0,0 +1,44 @@
1
+ /**
2
+ @file
3
+ @brief Extracts a format name from a fully defined format
4
+ @details Converts formats in like $thi3. and th13.2 $THI and TH.
5
+ Usage:
6
+
7
+ %put %mf_getfmtname(8.);
8
+ %put %mf_getfmtname($4.);
9
+ %put %mf_getfmtname(comma14.10);
10
+
11
+ Returns:
12
+
13
+ > W
14
+ > $CHAR
15
+ > COMMA
16
+
17
+ Note that system defaults are inferred from the values provided.
18
+
19
+ @param [in] fmt The fully defined format. If left blank, nothing is returned.
20
+
21
+ @returns The name (without width or decimal) of the format.
22
+
23
+ @version 9.2
24
+ @author Allan Bowe
25
+
26
+ **/
27
+
28
+ %macro mf_getfmtname(fmt
29
+ )/*/STORE SOURCE*/ /minoperator mindelimiter=' ';
30
+
31
+ %local out dsid nvars x rc fmt;
32
+
33
+ /* extract actual format name from the format definition */
34
+ %let fmt=%scan(&fmt,1,.);
35
+ %do %while(%substr(&fmt,%length(&fmt),1) in 1 2 3 4 5 6 7 8 9 0);
36
+ %if %length(&fmt)=1 %then %let fmt=W;
37
+ %else %let fmt=%substr(&fmt,1,%length(&fmt)-1);
38
+ %end;
39
+
40
+ %if &fmt=$ %then %let fmt=$CHAR;
41
+
42
+ /* send them out without spaces or quote markers */
43
+ %do;%unquote(%upcase(&fmt))%end;
44
+ %mend mf_getfmtname;
@@ -0,0 +1,32 @@
1
+ /**
2
+ @file
3
+ @brief retrieves a key value pair from a control dataset
4
+ @details By default, control dataset is work.mp_setkeyvalue. Usage:
5
+
6
+ %mp_setkeyvalue(someindex,22,type=N)
7
+ %put %mf_getkeyvalue(someindex)
8
+
9
+
10
+ @param key Provide a key on which to perform the lookup
11
+ @param libds= define the target table which holds the parameters
12
+
13
+ @version 9.2
14
+ @author Allan Bowe
15
+ **/
16
+
17
+ %macro mf_getkeyvalue(key,libds=work.mp_setkeyvalue
18
+ )/*/STORE SOURCE*/;
19
+ %local ds dsid key valc valn type rc;
20
+ %let dsid=%sysfunc(open(&libds(where=(key="&key"))));
21
+ %syscall set(dsid);
22
+ %let rc = %sysfunc(fetch(&dsid));
23
+ %let rc = %sysfunc(close(&dsid));
24
+
25
+ %if &type=N %then %do;
26
+ &valn
27
+ %end;
28
+ %else %if &type=C %then %do;
29
+ &valc
30
+ %end;
31
+ %else %put %str(ERR)OR: Unable to find key &key in ds &libds;
32
+ %mend mf_getkeyvalue;
@@ -0,0 +1,75 @@
1
+ /**
2
+ @file mf_getplatform.sas
3
+ @brief Returns platform specific variables
4
+ @details Enables platform specific variables to be returned
5
+
6
+ %put %mf_getplatform();
7
+
8
+ returns one of:
9
+
10
+ @li SASMETA
11
+ @li SASVIYA
12
+ @li SASJS
13
+ @li BASESAS
14
+
15
+ @param switch the param for which to return a platform specific variable
16
+
17
+ <h4> SAS Macros </h4>
18
+ @li mf_mval.sas
19
+ @li mf_trimstr.sas
20
+
21
+ @version 9.4 / 3.4
22
+ @author Allan Bowe
23
+ **/
24
+
25
+ %macro mf_getplatform(switch
26
+ )/*/STORE SOURCE*/;
27
+ %local a b c;
28
+ %if &switch.NONE=NONE %then %do;
29
+ %if %symexist(sasjsprocessmode) %then %do;
30
+ %if &sasjsprocessmode=Stored Program %then %do;
31
+ SASJS
32
+ %return;
33
+ %end;
34
+ %end;
35
+ %if %symexist(sysprocessmode) %then %do;
36
+ %if "&sysprocessmode"="SAS Object Server"
37
+ or "&sysprocessmode"= "SAS Compute Server" %then %do;
38
+ SASVIYA
39
+ %end;
40
+ %else %if "&sysprocessmode"="SAS Stored Process Server"
41
+ or "&sysprocessmode"="SAS Workspace Server"
42
+ %then %do;
43
+ SASMETA
44
+ %return;
45
+ %end;
46
+ %else %do;
47
+ BASESAS
48
+ %return;
49
+ %end;
50
+ %end;
51
+ %else %if %symexist(_metaport) or %symexist(_metauser) %then %do;
52
+ SASMETA
53
+ %return;
54
+ %end;
55
+ %else %do;
56
+ BASESAS
57
+ %return;
58
+ %end;
59
+ %end;
60
+ %else %if &switch=SASSTUDIO %then %do;
61
+ /* return the version of SAS Studio else 0 */
62
+ %if %mf_mval(_CLIENTAPP)=%str(SAS Studio) %then %do;
63
+ %let a=%mf_mval(_CLIENTVERSION);
64
+ %let b=%scan(&a,1,.);
65
+ %if %eval(&b >2) %then %do;
66
+ &b
67
+ %end;
68
+ %else 0;
69
+ %end;
70
+ %else 0;
71
+ %end;
72
+ %else %if &switch=VIYARESTAPI %then %do;
73
+ %mf_trimstr(%sysfunc(getoption(servicesbaseurl)),/)
74
+ %end;
75
+ %mend mf_getplatform;
@@ -0,0 +1,57 @@
1
+ /**
2
+ @file
3
+ @brief Adds custom quotes / delimiters to a delimited string
4
+ @details Can be used in open code, eg as follows:
5
+
6
+ %put %mf_getquotedstr(blah blah blah);
7
+
8
+ which returns:
9
+ > 'blah','blah','blah'
10
+
11
+ Alternatively:
12
+
13
+ %put %mf_getquotedstr(these words are double quoted,quote=D)
14
+
15
+ for:
16
+ > "these","words","are","double","quoted"
17
+
18
+ @param [in] in_str The unquoted, spaced delimited string to transform
19
+ @param [in] dlm= (,) The delimeter to be applied to the output (default comma)
20
+ @param [in] indlm= ( ) The delimeter used for the input (default is space)
21
+ @param [in] quote= (S) The quote mark to apply (S=Single, D=Double, N=None).
22
+ If any other value than uppercase S or D is supplied, then that value will
23
+ be used as the quoting character.
24
+ @return output returns a string with the newly quoted / delimited output.
25
+
26
+ @version 9.2
27
+ @author Allan Bowe
28
+ **/
29
+
30
+
31
+ %macro mf_getquotedstr(IN_STR
32
+ ,DLM=%str(,)
33
+ ,QUOTE=S
34
+ ,indlm=%str( )
35
+ )/*/STORE SOURCE*/;
36
+ /* credit Rowland Hale - byte34 is double quote, 39 is single quote */
37
+ %if &quote=S %then %let quote=%qsysfunc(byte(39));
38
+ %else %if &quote=D %then %let quote=%qsysfunc(byte(34));
39
+ %else %if &quote=N %then %let quote=;
40
+ %local i item buffer;
41
+ %let i=1;
42
+ %do %while (%qscan(&IN_STR,&i,%str(&indlm)) ne %str() ) ;
43
+ %let item=%qscan(&IN_STR,&i,%str(&indlm));
44
+ %if %bquote(&QUOTE) ne %then %let item=&QUOTE%qtrim(&item)&QUOTE;
45
+ %else %let item=%qtrim(&item);
46
+
47
+ %if (&i = 1) %then %let buffer =%qtrim(&item);
48
+ %else %let buffer =&buffer&DLM%qtrim(&item);
49
+
50
+ %let i = %eval(&i+1);
51
+ %end;
52
+
53
+ %let buffer=%sysfunc(coalescec(%qtrim(&buffer),&QUOTE&QUOTE));
54
+
55
+ &buffer
56
+
57
+ %mend mf_getquotedstr;
@@ -0,0 +1,43 @@
1
+ /**
2
+ @file mf_getschema.sas
3
+ @brief Returns the database schema of a SAS library
4
+ @details Usage:
5
+
6
+ %put %mf_getschema(MYDB);
7
+
8
+ returns:
9
+ > dbo
10
+
11
+ @param libref Library reference (also accepts a 2 level libds ref).
12
+
13
+ @return output returns the library schema for the FIRST library encountered
14
+
15
+ @warning will only return the FIRST library schema - for concatenated
16
+ libraries, with different schemas, inconsistent results may be encountered.
17
+
18
+ @version 9.2
19
+ @author Allan Bowe
20
+ @cond
21
+ **/
22
+
23
+ %macro mf_getschema(libref
24
+ )/*/STORE SOURCE*/;
25
+ %local dsid vnum rc schema;
26
+ /* in case the parameter is a libref.tablename, pull off just the libref */
27
+ %let libref = %upcase(%scan(&libref, 1, %str(.)));
28
+ %let dsid=%sysfunc(open(sashelp.vlibnam(where=(
29
+ libname="%upcase(&libref)" and sysname='Schema/Owner'
30
+ )),i));
31
+ %if (&dsid ^= 0) %then %do;
32
+ %let vnum=%sysfunc(varnum(&dsid,SYSVALUE));
33
+ %let rc=%sysfunc(fetch(&dsid));
34
+ %let schema=%sysfunc(getvarc(&dsid,&vnum));
35
+ %put &libref. schema is &schema.;
36
+ %let rc= %sysfunc(close(&dsid));
37
+ %end;
38
+
39
+ &schema
40
+
41
+ %mend mf_getschema;
42
+
43
+ /** @endcond */
@@ -0,0 +1,60 @@
1
+ /**
2
+ @file
3
+ @brief Assigns and returns an unused fileref
4
+ @details Using the native approach for assigning filerefs fails as some
5
+ procedures (such as proc http) do not recognise the temporary names (starting
6
+ with a hash), returning a message such as:
7
+
8
+ > ERROR 22-322: Expecting a name.
9
+
10
+ This macro works by attempting a random fileref (with a prefix), seeing if it
11
+ is already assigned, and if not - returning the fileref.
12
+
13
+ If your process can accept filerefs with the hash (#) prefix, then set
14
+ `prefix=0` to revert to the native approach - which is significantly faster
15
+ when there are a lot of filerefs in a session.
16
+
17
+ Use as follows:
18
+
19
+ %let fileref1=%mf_getuniquefileref();
20
+ %let fileref2=%mf_getuniquefileref(prefix=0);
21
+ %put &fileref1 &fileref2;
22
+
23
+ which returns filerefs similar to:
24
+
25
+ > _7432233 #LN00070
26
+
27
+ @param [in] prefix= (_) first part of fileref. Remember that filerefs can only
28
+ be 8 characters, so a 7 letter prefix would mean `maxtries` should be 10.
29
+ if using zero (0) as the prefix, a native assignment is used.
30
+ @param [in] maxtries= (1000) the last part of the libref. Must be an integer.
31
+ @param [in] lrecl= (32767) Provide a default lrecl with which to initialise
32
+ the generated fileref.
33
+
34
+ @version 9.2
35
+ @author Allan Bowe
36
+ **/
37
+
38
+ %macro mf_getuniquefileref(prefix=_,maxtries=1000,lrecl=32767);
39
+ %local rc fname;
40
+ %if &prefix=0 %then %do;
41
+ %let rc=%sysfunc(filename(fname,,temp,lrecl=&lrecl));
42
+ %if &rc %then %put %sysfunc(sysmsg());
43
+ &fname
44
+ %end;
45
+ %else %do;
46
+ %local x len;
47
+ %let len=%eval(8-%length(&prefix));
48
+ %let x=0;
49
+ %do x=0 %to &maxtries;
50
+ %let fname=&prefix%substr(%sysfunc(ranuni(0)),3,&len);
51
+ %if %sysfunc(fileref(&fname)) > 0 %then %do;
52
+ %let rc=%sysfunc(filename(fname,,temp,lrecl=&lrecl));
53
+ %if &rc %then %put %sysfunc(sysmsg());
54
+ &fname
55
+ %return;
56
+ %end;
57
+ %end;
58
+ %put unable to find available fileref after &maxtries attempts;
59
+ %end;
60
+ %mend mf_getuniquefileref;
@@ -0,0 +1,57 @@
1
+ /**
2
+ @file
3
+ @brief Returns an unused libref
4
+ @details Use as follows:
5
+
6
+ libname mclib0 (work);
7
+ libname mclib1 (work);
8
+ libname mclib2 (work);
9
+
10
+ %let libref=%mf_getuniquelibref();
11
+ %put &=libref;
12
+
13
+ which returns:
14
+
15
+ > mclib3
16
+
17
+ A blank value is returned if no usable libname is determined.
18
+
19
+ @param [in] prefix= (mclib) first part of the returned libref. As librefs can
20
+ be as long as 8 characters, a maximum length of 7 characters is premitted
21
+ for this prefix.
22
+ @param [in] maxtries= Deprecated parameter. Remains here to ensure a
23
+ non-breaking change. Will be removed in v5.
24
+
25
+ @version 9.2
26
+ @author Allan Bowe
27
+ **/
28
+
29
+ %macro mf_getuniquelibref(prefix=mclib,maxtries=1000);
30
+ %local x;
31
+
32
+ %if ( %length(&prefix) gt 7 ) %then %do;
33
+ %put %str(ERR)OR: The prefix parameter cannot exceed 7 characters.;
34
+ 0
35
+ %return;
36
+ %end;
37
+ %else %if (%sysfunc(NVALID(&prefix,v7))=0) %then %do;
38
+ %put %str(ERR)OR: Invalid prefix (&prefix);
39
+ 0
40
+ %return;
41
+ %end;
42
+
43
+ /* Set maxtries equal to '10 to the power of [# unused characters] - 1' */
44
+ %let maxtries=%eval(10**(8-%length(&prefix))-1);
45
+
46
+ %do x = 0 %to &maxtries;
47
+ %if %sysfunc(libref(&prefix&x)) ne 0 %then %do;
48
+ &prefix&x
49
+ %return;
50
+ %end;
51
+ %let x = %eval(&x + 1);
52
+ %end;
53
+
54
+ %put %str(ERR)OR: No usable libref in range &prefix.0-&maxtries;
55
+ %put %str(ERR)OR- Try reducing the prefix or deleting some libraries!;
56
+ 0
57
+ %mend mf_getuniquelibref;
@@ -0,0 +1,22 @@
1
+ /**
2
+ @file mf_getuniquename.sas
3
+ @brief Returns a shortened (32 char) GUID as a valid SAS name
4
+ @details Use as follows:
5
+
6
+ %let myds=%mf_getuniquename();
7
+ %put &=myds;
8
+
9
+ which returns:
10
+
11
+ > MCc59c750610321d4c8bf75faadbcd22
12
+
13
+ @param prefix= set a prefix for the new name
14
+
15
+ @version 9.3
16
+ @author Allan Bowe
17
+ **/
18
+
19
+
20
+ %macro mf_getuniquename(prefix=MC);
21
+ &prefix.%substr(%sysfunc(compress(%sysfunc(uuidgen()),-)),1,32-%length(&prefix))
22
+ %mend mf_getuniquename;
@@ -0,0 +1,44 @@
1
+ /**
2
+ @file
3
+ @brief Returns a userid according to session context
4
+ @details In a workspace session, a user is generally represented by <code>
5
+ &sysuserid</code> or <code>SYS_COMPUTE_SESSION_OWNER</code> if it exists.
6
+ In a Stored Process session, <code>&sysuserid</code>
7
+ resolves to a system account (default=sassrv) and instead there are several
8
+ metadata username variables to choose from (_metauser, _metaperson
9
+ ,_username, _secureusername). The OS account is represented by
10
+ <code> _secureusername</code> whilst the metadata account is under <code>
11
+ _metaperson</code>.
12
+
13
+ %let user= %mf_getUser();
14
+ %put &user;
15
+
16
+ @param type - do not use, may be deprecated in a future release
17
+
18
+ @return SYSUSERID (if workspace server)
19
+ @return _METAPERSON (if stored process server)
20
+ @return SYS_COMPUTE_SESSION_OWNER (if Viya compute session)
21
+
22
+ @version 9.2
23
+ @author Allan Bowe
24
+ **/
25
+
26
+ %macro mf_getuser(
27
+ )/*/STORE SOURCE*/;
28
+ %local user;
29
+
30
+ %if %symexist(_sasjs_username) %then %let user=&_sasjs_username;
31
+ %else %if %symexist(SYS_COMPUTE_SESSION_OWNER) %then %do;
32
+ %let user=&SYS_COMPUTE_SESSION_OWNER;
33
+ %end;
34
+ %else %if %symexist(_metaperson) %then %do;
35
+ %if %length(&_metaperson)=0 %then %let user=&sysuserid;
36
+ /* sometimes SAS will add @domain extension - remove for consistency */
37
+ /* but be sure to quote in case of usernames with commas */
38
+ %else %let user=%unquote(%scan(%quote(&_metaperson),1,@));
39
+ %end;
40
+ %else %let user=&sysuserid;
41
+
42
+ %quote(&user)
43
+
44
+ %mend mf_getuser;
@@ -0,0 +1,36 @@
1
+ /**
2
+ @file
3
+ @brief Retrieves a value from a dataset. If no filter supplied, then first
4
+ record is used.
5
+ @details Be sure to <code>%quote()</code> your where clause. Example usage:
6
+
7
+ %put %mf_getvalue(sashelp.class,name,filter=%quote(age=15));
8
+ %put %mf_getvalue(sashelp.class,name);
9
+
10
+ <h4> SAS Macros </h4>
11
+ @li mf_getattrn.sas
12
+
13
+ <h4> Related Macros </h4>
14
+ @li mp_setkeyvalue.sas
15
+
16
+ @param libds dataset to query
17
+ @param variable the variable which contains the value to return.
18
+ @param filter contents of where clause
19
+
20
+ @version 9.2
21
+ @author Allan Bowe
22
+ **/
23
+
24
+ %macro mf_getvalue(libds,variable,filter=1
25
+ )/*/STORE SOURCE*/;
26
+ %if %mf_getattrn(&libds,NLOBS)>0 %then %do;
27
+ %local dsid rc &variable;
28
+ %let dsid=%sysfunc(open(&libds(where=(&filter))));
29
+ %syscall set(dsid);
30
+ %let rc = %sysfunc(fetch(&dsid));
31
+ %let rc = %sysfunc(close(&dsid));
32
+
33
+ %trim(&&&variable)
34
+
35
+ %end;
36
+ %mend mf_getvalue;