From e46165c14095027033d614276874760f0ffef6b1 Mon Sep 17 00:00:00 2001 From: Allan Date: Mon, 26 Jun 2023 22:02:08 +0100 Subject: [PATCH] fix: avoid error in mp_lockanytable.sas when unlocking a table that was not locked This may happen due to the noprint option affecting the sqlobs variable. Closes #339 --- all.sas | 54 +++++++++++++++++++++------------------- base/mp_lockanytable.sas | 54 +++++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 50 deletions(-) diff --git a/all.sas b/all.sas index 0f588bde..4c762c7b 100644 --- a/all.sas +++ b/all.sas @@ -10616,35 +10616,39 @@ run; %end; %end; %else %if &ACTION=UNLOCK %then %do; - %local status; + %local status cnt; + %let cnt=0; proc sql noprint; - select LOCK_STATUS_CD into: status from &ctl_ds - where LOCK_LIB ="&lib" and LOCK_DS="&ds"; - quit; - %if &syscc>0 %then %put syscc=&syscc sqlrc=&sqlrc; - %if &sqlobs=0 %then %do; - %put %str(WAR)NING: &lib..&ds has never been locked!; + select count(*) into: cnt from &ctl_ds where LOCK_LIB ="&lib" & LOCK_DS="&ds"; + %if &cnt=0 %then %do; + %put %str(WAR)NING: &lib..&ds was not previously locked in &ctl_ds!; %end; - %else %if &status=LOCKED %then %do; - data _null_; - putlog "&sysmacroname: unlocking &lib..&ds:"; - run; - proc sql; - update &ctl_ds - set LOCK_STATUS_CD='UNLOCKED' - , LOCK_END_DTTM="%sysfunc(datetime(),%mf_fmtdttm())"dt - , LOCK_USER_NM="&user" - , LOCK_PID="&sysjobid" - , LOCK_REF="&ref" + %else %do; + select LOCK_STATUS_CD into: status from &ctl_ds where LOCK_LIB ="&lib" and LOCK_DS="&ds"; quit; - %end; - %else %if &status=UNLOCKED %then %do; - %put %str(WAR)NING: &lib..&ds is already unlocked!; - %end; - %else %do; - %put NOTE: Unrecognised STATUS_CD (&status) in &ctl_ds; - %let abortme=1; + %if &syscc>0 %then %put syscc=&syscc sqlrc=&sqlrc; + %if &status=LOCKED %then %do; + data _null_; + putlog "&sysmacroname: unlocking &lib..&ds:"; + run; + proc sql; + update &ctl_ds + set LOCK_STATUS_CD='UNLOCKED' + , LOCK_END_DTTM="%sysfunc(datetime(),%mf_fmtdttm())"dt + , LOCK_USER_NM="&user" + , LOCK_PID="&sysjobid" + , LOCK_REF="&ref" + where LOCK_LIB ="&lib" and LOCK_DS="&ds"; + quit; + %end; + %else %if &status=UNLOCKED %then %do; + %put %str(WAR)NING: &lib..&ds is already unlocked!; + %end; + %else %do; + %put NOTE: Unrecognised STATUS_CD (&status) in &ctl_ds; + %let abortme=1; + %end; %end; %end; %else %do; diff --git a/base/mp_lockanytable.sas b/base/mp_lockanytable.sas index 3de9897f..f051700c 100644 --- a/base/mp_lockanytable.sas +++ b/base/mp_lockanytable.sas @@ -194,35 +194,39 @@ run; %end; %end; %else %if &ACTION=UNLOCK %then %do; - %local status; + %local status cnt; + %let cnt=0; proc sql noprint; - select LOCK_STATUS_CD into: status from &ctl_ds - where LOCK_LIB ="&lib" and LOCK_DS="&ds"; - quit; - %if &syscc>0 %then %put syscc=&syscc sqlrc=&sqlrc; - %if &sqlobs=0 %then %do; - %put %str(WAR)NING: &lib..&ds has never been locked!; + select count(*) into: cnt from &ctl_ds where LOCK_LIB ="&lib" & LOCK_DS="&ds"; + %if &cnt=0 %then %do; + %put %str(WAR)NING: &lib..&ds was not previously locked in &ctl_ds!; %end; - %else %if &status=LOCKED %then %do; - data _null_; - putlog "&sysmacroname: unlocking &lib..&ds:"; - run; - proc sql; - update &ctl_ds - set LOCK_STATUS_CD='UNLOCKED' - , LOCK_END_DTTM="%sysfunc(datetime(),%mf_fmtdttm())"dt - , LOCK_USER_NM="&user" - , LOCK_PID="&sysjobid" - , LOCK_REF="&ref" + %else %do; + select LOCK_STATUS_CD into: status from &ctl_ds where LOCK_LIB ="&lib" and LOCK_DS="&ds"; quit; - %end; - %else %if &status=UNLOCKED %then %do; - %put %str(WAR)NING: &lib..&ds is already unlocked!; - %end; - %else %do; - %put NOTE: Unrecognised STATUS_CD (&status) in &ctl_ds; - %let abortme=1; + %if &syscc>0 %then %put syscc=&syscc sqlrc=&sqlrc; + %if &status=LOCKED %then %do; + data _null_; + putlog "&sysmacroname: unlocking &lib..&ds:"; + run; + proc sql; + update &ctl_ds + set LOCK_STATUS_CD='UNLOCKED' + , LOCK_END_DTTM="%sysfunc(datetime(),%mf_fmtdttm())"dt + , LOCK_USER_NM="&user" + , LOCK_PID="&sysjobid" + , LOCK_REF="&ref" + where LOCK_LIB ="&lib" and LOCK_DS="&ds"; + quit; + %end; + %else %if &status=UNLOCKED %then %do; + %put %str(WAR)NING: &lib..&ds is already unlocked!; + %end; + %else %do; + %put NOTE: Unrecognised STATUS_CD (&status) in &ctl_ds; + %let abortme=1; + %end; %end; %end; %else %do;