37%macro mp_lockanytable(
47 if _n_=1 then putlog
"&sysmacroname entry vars:";
49 where scope=
"&sysmacroname";
53%mp_abort(iftrue= (
"&ds"=
"0" and &action ne MAKETABLE)
55 ,msg=%str(dataset was not provided)
57%mp_abort(iftrue= (&ctl_ds=0)
59 ,msg=%str(Control dataset was not provided)
63%let lib=%upcase(&lib);
65%let action=%upcase(&action);
66%local user x trans msg abortme;
67%let user=%mf_getuser();
70%mp_abort(iftrue= (&action ne LOCK & &action ne UNLOCK & &action ne MAKETABLE)
72 ,msg=%str(Invalid action (&action) provided)
76%mp_abort(iftrue= (&syscc>0 and &action=LOCK)
78 ,msg=%str(aborting due to syscc=&syscc on LOCK entry)
82%
if (%upcase(&lib)=WORK or %str(&lib)=%str()) & &action ne MAKETABLE %then %
do;
83 %put NOTE: WORK libraries will not be registered in the locking system.;
88%mp_abort(iftrue= (%sysfunc(getoption(OBS))=0)
90 ,msg=%str(cannot
continue when options obs = 0)
93%
if &ACTION=LOCK %then %
do;
96 %mp_lockfilecheck(&lib..&ds)
99 %local record_exists_check;
101 select count(*) into: record_exists_check from &ctl_ds
102 where LOCK_LIB ="&lib" and LOCK_DS="&ds";
104 %if &syscc>0 %then %put syscc=&syscc sqlrc=&sqlrc;
105 %if &record_exists_check=0 %then %do;
107 putlog "&sysmacroname: adding record to lock table..";
111 if 0 then set &ctl_ds;
114 LOCK_STATUS_CD='LOCKED';
115 LOCK_START_DTTM="%sysfunc(datetime(),%mf_fmtdttm())"dt;
116 LOCK_USER_NM="&user";
117 LOCK_PID="&sysjobid";
122 proc append base=&ctl_ds data=&trans;
126 %else %do x=1 %to &loops;
128 putlog "&sysmacroname: attempting lock (iteration &x) "@;
129 putlog "at %sysfunc(datetime(),datetime19.) ..";
134 set LOCK_STATUS_CD='LOCKED'
135 , LOCK_START_DTTM="%sysfunc(datetime(),%mf_fmtdttm())"dt
136 , LOCK_USER_NM="&user"
137 , LOCK_PID="&sysjobid"
139 where LOCK_LIB ="&lib" and LOCK_DS="&ds";
145 %if &syscc>0 %then %do;
147 putlog 'NOTE-' / 'NOTE-';
148 putlog "NOTE- &sysmacroname: Update failed. "@;
149 putlog "Resetting err conditions and re-attempting.";
150 putlog "NOTE- syscc=&syscc syserr=&syserr sqlrc=&sqlrc";
151 putlog 'NOTE-' / 'NOTE-';
158 %local success_check;
160 select count(*) into: success_check from &ctl_ds
161 where LOCK_LIB ="&lib" and LOCK_DS="&ds"
162 and LOCK_PID="&sysjobid" and LOCK_STATUS_CD='LOCKED';
164 %if &success_check=0 %then %do;
165 %if &x < &loops %then %do;
168 putlog 'NOTE-' / 'NOTE-';
169 putlog "NOTE- &sysmacroname: table locked, waiting "@;
170 putlog "%sysfunc(sleep(&loop_secs)) seconds.. ";
171 putlog "NOTE- (iteration &x of &loops)";
172 putlog 'NOTE-' / 'NOTE-';
176 %let msg=Unable to lock &lib..&ds via &ctl_ds after &loops attempts.\n
177 Please ask your administrator to investigate!;
183 putlog 'NOTE-' / 'NOTE-';
184 putlog "NOTE- &sysmacroname: Table &lib..&ds locked at "@;
185 putlog " %sysfunc(datetime(),datetime19.) (iteration &x)"@;
186 putlog 'NOTE-' / 'NOTE-';
188 %if &syscc>0 %then %do;
189 %put setting syscc(&syscc) back to 0;
196%else %if &ACTION=UNLOCK %then %do;
200 select count(*) into: cnt from &ctl_ds where LOCK_LIB ="&lib" & LOCK_DS="&ds";
201 %if &cnt=0 %then %do;
202 %put %str(WAR)NING: &lib..&ds was not previously locked in &ctl_ds!;
205 select LOCK_STATUS_CD into: status from &ctl_ds
206 where LOCK_LIB ="&lib" and LOCK_DS="&ds";
208 %if &syscc>0 %then %put syscc=&syscc sqlrc=&sqlrc;
209 %if &status=LOCKED %then %do;
211 putlog "&sysmacroname: unlocking &lib..&ds:";
215 set LOCK_STATUS_CD='UNLOCKED'
216 , LOCK_END_DTTM="%sysfunc(datetime(),%mf_fmtdttm())"dt
217 , LOCK_USER_NM="&user"
218 , LOCK_PID="&sysjobid"
220 where LOCK_LIB ="&lib" and LOCK_DS="&ds";
223 %else %if &status=UNLOCKED %then %do;
224 %put %str(WAR)NING: &lib..&ds is already unlocked!;
227 %put NOTE: Unrecognised STATUS_CD (&status) in &ctl_ds;
233 %let msg=lock_anytable given unsupported action (&action);
238%mp_abort(iftrue=(&abortme=1),
245 put "&sysmacroname: Exit vars: action=&action lib=&lib ds=&ds";
246 put " syscc=&syscc sqlrc=&sqlrc syserr=&syserr";
248%mend mp_lockanytable;