diff --git a/base/mf_getfilesize.sas b/base/mf_getfilesize.sas
index 0d4b433..551f9a2 100644
--- a/base/mf_getfilesize.sas
+++ b/base/mf_getfilesize.sas
@@ -5,18 +5,19 @@
%put %mf_getfilesize(fpath=C:\temp\myfile.txt);
- or
+ or, provide a libds value as follows:
data x;do x=1 to 100000;y=x;output;end;run;
%put %mf_getfilesize(libds=work.x,format=yes);
- gives:
+ Which gives:
- 2mb
+ > 2mb
+
+ @param [in] fpath= Full path and filename. Provide this OR the libds value.
+ @param [in] libds= (0) Library.dataset value (assumes library is BASE engine)
+ @param [in] format= (NO) Set to yes to apply sizekmg. format
- @param fpath= full path and filename. Provide this OR the libds value.
- @param libds= library.dataset value (assumes library is BASE engine)
- @param format= set to yes to apply sizekmg. format
@returns bytes
@version 9.2
@@ -26,16 +27,32 @@
%macro mf_getfilesize(fpath=,libds=0,format=NO
)/*/STORE SOURCE*/;
- %if &libds ne 0 %then %do;
- %let fpath=%sysfunc(pathname(%scan(&libds,1,.)))/%scan(&libds,2,.).sas7bdat;
- %end;
+ %local rc fid fref bytes dsid lib vnum;
- %local rc fid fref bytes;
- %let rc=%sysfunc(filename(fref,&fpath));
- %let fid=%sysfunc(fopen(&fref));
- %let bytes=%sysfunc(finfo(&fid,File Size (bytes)));
- %let rc=%sysfunc(fclose(&fid));
- %let rc=%sysfunc(filename(fref));
+ %if &libds ne 0 %then %do;
+ %let libds=%upcase(&libds);
+ %if %index(&libds,.)=0 %then %let lib=WORK;
+ %else %let lib=%scan(&libds,1,.);
+ %let dsid=%sysfunc(open(
+ sashelp.vtable(where=(libname="&lib" and memname="%scan(&libds,-1,.)")
+ keep=libname memname filesize
+ )
+ ));
+ %if (&dsid ^= 0) %then %do;
+ %let vnum=%sysfunc(varnum(&dsid,FILESIZE));
+ %let rc=%sysfunc(fetch(&dsid));
+ %let bytes=%sysfunc(getvarn(&dsid,&vnum));
+ %let rc= %sysfunc(close(&dsid));
+ %end;
+ %else %put &sysmacroname: &libds could not be opened! %sysfunc(sysmsg());
+ %end;
+ %else %do;
+ %let rc=%sysfunc(filename(fref,&fpath));
+ %let fid=%sysfunc(fopen(&fref));
+ %let bytes=%sysfunc(finfo(&fid,File Size (bytes)));
+ %let rc=%sysfunc(fclose(&fid));
+ %let rc=%sysfunc(filename(fref));
+ %end;
%if &format=NO %then %do;
&bytes
diff --git a/base/mp_assertdsobs.sas b/base/mp_assertdsobs.sas
index 6682da9..4abe423 100644
--- a/base/mp_assertdsobs.sas
+++ b/base/mp_assertdsobs.sas
@@ -12,10 +12,6 @@
%mp_assertdsobs(sashelp.class,test=ATMOST 20) %* pass if <21 obs present;
-
SAS Macros
- @li mf_nobs.sas
- @li mp_abort.sas
-
@param [in] inds input dataset to test for presence of observations
@param [in] desc= (Testing observations) The user provided test description
@@ -33,6 +29,11 @@
|---|---|---|
|User Provided description|PASS|Dataset &inds has XX obs|
+ SAS Macros
+ @li mf_getuniquename.sas
+ @li mf_nobs.sas
+ @li mp_abort.sas
+
Related Macros
@li mp_assertcolvals.sas
@li mp_assert.sas
@@ -49,9 +50,10 @@
outds=work.test_results
)/*/STORE SOURCE*/;
- %local nobs;
+ %local nobs ds;
%let nobs=%mf_nobs(&inds);
%let test=%upcase(&test);
+ %let ds=%mf_getuniquename(prefix=mp_assertdsobs);
%if %substr(&test.xxxxx,1,6)=EQUALS %then %do;
%let val=%scan(&test,2,%str( ));
@@ -84,7 +86,7 @@
)
%end;
- data;
+ data &ds;
length test_description $256 test_result $4 test_comments $256;
test_description=symget('desc');
test_result='FAIL';
@@ -110,9 +112,6 @@
%end;
run;
- %local ds;
- %let ds=&syslast;
-
proc append base=&outds data=&ds;
run;
diff --git a/base/mp_ds2squeeze.sas b/base/mp_ds2squeeze.sas
index a9c1e16..21e3957 100644
--- a/base/mp_ds2squeeze.sas
+++ b/base/mp_ds2squeeze.sas
@@ -49,7 +49,7 @@
%macro mp_ds2squeeze(
libds,
- outds=work.work.mp_ds2squeeze,
+ outds=work.mp_ds2squeeze,
mdebug=0
)/*/STORE SOURCE*/;
%local dbg source;
@@ -62,9 +62,10 @@
%let source=/source2;
%end;
-%local optval ds fref;
+%local optval ds fref startsize;
%let ds=%mf_getuniquename();
%let fref=%mf_getuniquefileref();
+%let startsize=%mf_getfilesize(libds=&libds,format=yes);
%mp_getmaxvarlengths(&libds,outds=&ds)
@@ -113,7 +114,7 @@ options varlenchk=&optval;
filename &fref clear;
%end;
-%put &sysmacroname: &libds was %mf_getfilesize(libds=&libds,format=yes);
+%put &sysmacroname: &libds was &startsize;
%put &sysmacroname: &outds is %mf_getfilesize(libds=&outds,format=yes);
%mend mp_ds2squeeze;
\ No newline at end of file
diff --git a/base/mp_init.sas b/base/mp_init.sas
index 734f555..1e191ac 100644
--- a/base/mp_init.sas
+++ b/base/mp_init.sas
@@ -37,6 +37,7 @@
%global
SASJS_PREFIX /* the ONLY hard-coded global macro variable in SASjs */
+ &prefix._FUNCTIONS /* used in mcf_init() to track core function compilation */
&prefix._INIT_NUM /* initialisation time as numeric */
&prefix._INIT_DTTM /* initialisation time in E8601DT26.6 format */
&prefix.WORK /* avoid typing %sysfunc(pathname(work)) every time */
diff --git a/base/mp_stackdiffs.sas b/base/mp_stackdiffs.sas
index d35052b..5cf5489 100644
--- a/base/mp_stackdiffs.sas
+++ b/base/mp_stackdiffs.sas
@@ -194,6 +194,7 @@
@li mf_nobs.sas
@li mf_wordsinstr1butnotstr2.sas
@li mp_abort.sas
+ @li mp_ds2squeeze.sas
Related Macros
@@ -298,11 +299,14 @@ proc transpose data=&ds1d(where=(tgtvar_type='C'))
id TGTVAR_NM;
var OLDVAL_CHAR;
run;
+%mp_ds2squeeze(&ds2d,outds=&ds2d)
+%mp_ds2squeeze(&ds3d,outds=&ds3d)
data &outdel;
if 0 then set &baselibds;
set &ds2d;
set &ds3d;
drop key_hash;
+ if not missing(%scan(&key,1));
run;
proc sort;
by &key;
@@ -328,11 +332,14 @@ proc transpose data=&ds1a(where=(tgtvar_type='C'))
id TGTVAR_NM;
var NEWVAL_CHAR;
run;
+%mp_ds2squeeze(&ds2a,outds=&ds2a)
+%mp_ds2squeeze(&ds3a,outds=&ds3a)
data &outadd;
if 0 then set &baselibds;
set &ds2a;
set &ds3a;
drop key_hash;
+ if not missing(%scan(&key,1));
run;
proc sort;
by &key;
@@ -359,10 +366,13 @@ proc transpose data=&ds1m(where=(tgtvar_type='C'))
id TGTVAR_NM;
var NEWVAL_CHAR;
run;
+%mp_ds2squeeze(&ds2m,outds=&ds2m)
+%mp_ds2squeeze(&ds3m,outds=&ds3m)
data &outmod;
if 0 then set &baselibds;
set &ds2m;
set &ds3m;
+ if not missing(%scan(&key,1));
run;
proc sort;
by &key;
@@ -375,6 +385,7 @@ run;
* passthrough and a temporary table.
*/
data &pks;
+ if 0 then set &baselibds;
set &outadd &outmod &outdel;
keep &key;
run;
@@ -382,6 +393,10 @@ run;
proc sort noduprec dupout=&dups;
by &key;
run;
+data _null_;
+ set &dups;
+ putlog (_all_)(=);
+run;
%mp_abort(iftrue= (%mf_nobs(&dups) ne 0)
,mac=&sysmacroname
,msg=%str(duplicates (%mf_nobs(&dups)) found on &auditlibds!)
@@ -542,17 +557,16 @@ select distinct tgtvar_nm into: missvars separated by ' '
%let fref=%mf_getuniquefileref();
data _null_;
file &fref;
- set &auditlibds(where=(move_type='D')) end=lastobs;
+ set &auditlibds(where=(move_type='M')) end=lastobs;
by key_hash;
if _n_=1 then put 'proc sql;';
if first.key_hash then put "update &outmod set ";
comma=ifc(first.key_hash=0,',',' ');
if tgtvar_type='C' then put ' ' comma TGTVAR_NM '=trim("' NEWVAL_CHAR '")';
if last.key_hash then put ' where key_hash=trim("' key_hash '");';
- if lastobs then put 'alter &outmod drop key_hash';
+ if lastobs then put "alter table &outmod drop key_hash;";
run;
%inc &fref/source2;
-
%end;
%if &mdebug=0 %then %do;
diff --git a/fcmp/mcf_init.sas b/fcmp/mcf_init.sas
new file mode 100644
index 0000000..84b5735
--- /dev/null
+++ b/fcmp/mcf_init.sas
@@ -0,0 +1,44 @@
+/**
+ @file
+ @brief Sets up the mcf_xx functions
+ @details
+ There is no (efficient) way to determine if an mcf_xx macro has already been
+ invoked. So, we make use of a global macro variable list to keep track.
+
+ Usage:
+
+ %mcf_init(MCF_LENGTH)
+
+ Returns:
+
+ > 1 (if already initialised) else 0
+
+ @param [in] func The function to be initialised
+
+ Related Macros
+ @li mcf_init.test.sas
+
+**/
+
+%macro mcf_init(func
+)/*/STORE SOURCE*/;
+
+%if not (%symexist(SASJS_PREFIX)) %then %do;
+ %global SASJS_PREFIX;
+ %let SASJS_PREFIX=SASJS;
+%end;
+
+%let func=%upcase(&func);
+
+/* the / character is just a seperator */
+%global &sasjs_prefix._FUNCTIONS;
+%if %index(&&&sasjs_prefix._FUNCTIONS,&func/)>0 %then %do;
+ 1
+ %return;
+%end;
+%else %do;
+ %let &sasjs_prefix._FUNCTIONS=&&&sasjs_prefix._FUNCTIONS &func/;
+ 0
+%end;
+
+%mend mcf_init;
diff --git a/fcmp/mcf_length.sas b/fcmp/mcf_length.sas
index 43b2bdb..3e8a6cf 100644
--- a/fcmp/mcf_length.sas
+++ b/fcmp/mcf_length.sas
@@ -40,10 +40,11 @@
Uses a 3 part format: libref.catalog.package
SAS Macros
- @li mf_existfunction.sas
+ @li mcf_init.sas
- Related Macros
+ Related Programs
@li mcf_length.test.sas
+ @li mp_init.sas
**/
@@ -54,7 +55,7 @@
,pkg=UTILS
)/*/STORE SOURCE*/;
-%if %mf_existfunction(mcf_length)=1 %then %return;
+%if %mcf_init(mcf_length)=1 %then %return;
%if &wrap=YES %then %do;
proc fcmp outlib=&lib..&cat..&pkg;
diff --git a/fcmp/mcf_stpsrv_header.sas b/fcmp/mcf_stpsrv_header.sas
index e6ba2f0..b9f39f1 100644
--- a/fcmp/mcf_stpsrv_header.sas
+++ b/fcmp/mcf_stpsrv_header.sas
@@ -55,7 +55,11 @@
Uses a 3 part format: libref.catalog.package
SAS Macros
- @li mf_existfunction.sas
+ @li mcf_init.sas
+
+ Related Programs
+ @li mcf_stpsrv_header.test.sas
+ @li mp_init.sas
**/
@@ -66,7 +70,7 @@
,pkg=UTILS
)/*/STORE SOURCE*/;
-%if %mf_existfunction(stpsrv_header)=1 %then %return;
+%if %mcf_init(stpsrv_header)=1 %then %return;
%if &wrap=YES %then %do;
proc fcmp outlib=&lib..&cat..&pkg;
diff --git a/fcmp/mcf_string2file.sas b/fcmp/mcf_string2file.sas
index f41b30c..dce768f 100644
--- a/fcmp/mcf_string2file.sas
+++ b/fcmp/mcf_string2file.sas
@@ -40,7 +40,11 @@
Uses a 3 part format: libref.catalog.package
SAS Macros
- @li mf_existfunction.sas
+ @li mcf_init.sas
+
+ Related Programs
+ @li mcf_stpsrv_header.test.sas
+ @li mp_init.sas
**/
@@ -51,7 +55,7 @@
,pkg=UTILS
)/*/STORE SOURCE*/;
-%if %mf_existfunction(mcf_string2file)=1 %then %return;
+%if %mcf_init(mcf_string2file)=1 %then %return;
%if &wrap=YES %then %do;
proc fcmp outlib=&lib..&cat..&pkg;
diff --git a/sasjs/sasjsconfig.json b/sasjs/sasjsconfig.json
index 9840f6d..ad14bbd 100644
--- a/sasjs/sasjsconfig.json
+++ b/sasjs/sasjsconfig.json
@@ -68,7 +68,7 @@
},
{
"name": "server",
- "serverUrl": "https://sas.analytium.co.uk:5001",
+ "serverUrl": "https://sas.analytium.co.uk:5000",
"serverType": "SASJS",
"appLoc": "/Shared Data/temp/macrocore",
"macroFolders": [
diff --git a/tests/crossplatform/mcf_init.test.sas b/tests/crossplatform/mcf_init.test.sas
new file mode 100644
index 0000000..e01ef56
--- /dev/null
+++ b/tests/crossplatform/mcf_init.test.sas
@@ -0,0 +1,46 @@
+/**
+ @file
+ @brief Testing mcf_init.sas macro
+
+ SAS Macros
+ @li mcf_init.sas
+ @li mp_assert.sas
+
+**/
+
+%mp_assert(
+ iftrue=(%mcf_init(test)=0),
+ desc=Check if new func returns 0
+)
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=No errs on basic invocation
+)
+%mp_assert(
+ iftrue=(%mcf_init(test)=1),
+ desc=Check if second invocation returns 1
+)
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=No errs on second invocation
+)
+%mp_assert(
+ iftrue=(%mcf_init(test2)=0),
+ desc=Check if new invocation returns 0
+)
+%mp_assert(
+ iftrue=(%mcf_init(test2)=1),
+ desc=Check if second new invocation returns 1
+)
+%mp_assert(
+ iftrue=(%mcf_init(test)=1),
+ desc=Check original returns 1
+)
+%mp_assert(
+ iftrue=(%mcf_init(t)=0),
+ desc=Check subset returns 0
+)
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=No errs at end
+)
\ No newline at end of file
diff --git a/tests/crossplatform/mf_getfilesize.test.sas b/tests/crossplatform/mf_getfilesize.test.sas
new file mode 100644
index 0000000..8554daf
--- /dev/null
+++ b/tests/crossplatform/mf_getfilesize.test.sas
@@ -0,0 +1,31 @@
+/**
+ @file
+ @brief Testing mf_getfilesize macro
+
+ SAS Macros
+ @li mf_getfilesize.sas
+ @li mp_assert.sas
+ @li mp_assertscope.sas
+
+**/
+
+data test;
+ x=1;
+run;
+
+%mp_assertscope(SNAPSHOT)
+%put %mf_getfilesize(libds=work.test)
+%mp_assertscope(COMPARE)
+
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=Checking syscc,
+ outds=work.test_results
+)
+
+%put %mf_getfilesize(libds=test)
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=Checking syscc with one level name,
+ outds=work.test_results
+)
\ No newline at end of file
diff --git a/tests/crossplatform/mp_stackdiffs.test.sas b/tests/crossplatform/mp_stackdiffs.test.sas
index 8be96a8..83f02da 100644
--- a/tests/crossplatform/mp_stackdiffs.test.sas
+++ b/tests/crossplatform/mp_stackdiffs.test.sas
@@ -32,7 +32,9 @@ data work.orig work.deleted work.changed work.appended;
else stop;
run;
-%mp_storediffs(sashelp.electric,work.orig,CUSTOMER YEAR
+%mp_storediffs(sashelp.electric
+ ,work.orig
+ ,CUSTOMER YEAR
,delds=work.deleted
,modds=work.changed
,appds=work.appended
diff --git a/tests/testinit.sas b/tests/testinit.sas
index a877f16..d96ccee 100644
--- a/tests/testinit.sas
+++ b/tests/testinit.sas
@@ -14,6 +14,8 @@
/* set defaults */
%mp_init()
+%global _debug;
+
%macro loglevel();
%if "&_debug"="2477" or "&_debug"="fields,log,trace" %then %do;
%put debug mode activated;