/**********************************************************************/
/**********************************************************************/
/* THE FILES CONTAINED HEREIN ARE PROVIDED BY SAS INSTITUTE INC. */
/* "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, */
/* INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF */
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. RECIPIENTS */
/* ACKNOWLEDGE AND AGREE THAT SAS INSTITUTE SHALL NOT BE LIABLE */
/* WHATSOEVER FOR ANY DAMAGES ARISING OUT OF THEIR USE OF THIS */
/* MATERIAL. IN ADDITION, SAS INSTITUTE WILL PROVIDE NO SUPPORT FOR */
/* THE MATERIALS CONTAINED HEREIN. */
/**********************************************************************/
/**********************************************************************/
/***********************************************************/
/* Code for the Server */
/***********************************************************/
/* determine if this session is the server and flag it */
tmpdsid=open('server.parmfile');
if tmpdsid then do;
rc=fetch(tmpdsid);
userid=symget('sysjobid'); /* CMS macro: session id */
if userid=getvarc(tmpdsid,varnum(tmpdsid,'serv_id'))
then do;
server=1;
/* CMS: refuse messages--would interrupt server */
call execcmdi('cms set msg off');
end;
else
server=0;
tmpdsid=close(tmpdsid);
end;
else
server=0;
call symputn('server',server);
/* 1st time only check stop flag and reset if desired */
prepstat:
parmdsid=open('server.parmfile','u');
rc=fetch(parmdsid); /* check stop flag */
stopflag=getvarn(parmdsid,varnum(parmdsid,'stopflag'));
if stopflag=0 then do; /* stop flag is set: reset it? */
call display('system.windows.yesorno.program',
'The Server Stop Flag Is Set',
'Server will immediately shut down if not reset.',
'Do you wish to reset the Server stop flag?',
'',response);
if response='1' then do; /* reset the stop flag */
call putvarn(parmdsid,
varnum(parmdsid,'stopflag'),0);
rc=update(parmdsid);
end;
end;
if parmdsid then parmdsid=close(parmdsid);
return;
chckstat: /* check and update server status */
rc=where(parmdsid); /*important: refreshes file content */
rc=fetch(parmdsid); /* check stop flag */
stopflag=getvarn(parmdsid,varnum(parmdsid,'stopflag'));
maxqueue=getvarn(parmdsid,varnum(parmdsid,'maxqueue'));
waitsecs=getvarn(parmdsid,varnum(parmdsid,'waitsecs'));
/* if not reasonable wait then default to 10 seconds */
if waitsecs<5 or waitsecs>60 then
waitsecs=10;
status=0; /* assume status is okay */
halt_now=0; /* and not halting now */
rc=where(savedsid,'savetime=.');
if stopflag then do; /* if stop flag is set */
if fetch(savedsid)=0 then /* data left to save */
status=2; /* status: preparing to halt */
else do;
/* no lots to save-make sure none being */
/* added and halt */
status=2; /* status: preparing to halt */
rc=fetchobs(statusid,1); /* update status file */
call putvarn(statusid,varnum(statusid,'status'),
status);
call putvarn(statusid,varnum(statusid,'lasttime'),
datetime());
rc=update(statusid);
_msg_='Server Halting: Waiting 30 seconds to '||
' make sure no new lots being added.';
refresh;
currtime=datetime();
/* delay loop */
do while (datetime()-currtime < 30);
end;
rc=where(savedsid,'savetime=.');
if fetch(savedsid)=0 then do; /* no data added */
status=3; /* status: shut down */
halt_now=1; /* halt server now */
end;
else do;
/* status remains at 2: save & try to halt */
_msg_='New lot added. Will save first and '||
'prepare to halt.';
refresh;
end;
end;
end; /* stop flag set */
else do; /* not halting -- too many lots? */
if fetchobs(savedsid,maxqueue+1)=0 then
status=1; /* status: too many lots */
end;
rc=rewind(savedsid);
/* update the status file with new status and time */
rc=fetchobs(statusid,1);
call putvarn(statusid,varnum(statusid,'status'),status);
call putvarn(statusid,varnum(statusid,'lasttime'),
datetime());
rc=update(statusid);
return;
server:
link prepstat; /* reset stop flag if desired */
/* operating params. */
parmdsid=open('server.parmfile','i');
/* requests: lots to save */
savedsid=open('server.save_req','u');
/* status and last chk tm */
statusid=open('server.status','u');
link chckstat; /* check and update server status */
do while(not halt_now); /* repeat until halt flag set */
/* any data not saved? */
rc=where(savedsid,'savetime=.');
/* data needs to be saved */
if fetch(savedsid)=0 then do;
/* need to determine values so that server can save the */
/* data just like a regular session would--get info to */
/* determine which lot to save and create where clause */
sku=getvarc(savedsid,varnum(savedsid,'sku'));
cntl=getvarc(savedsid,varnum(savedsid,'cntl'));
_msg_='SERVER: Saving '||sku||' '||cntl;
refresh;
whrcls="(where=(sku = '"|| sku ||"' and "||
"cntl = '"|| cntl ||"'))";
/* copy the data into the server's session */
rc=copy('server.tmphdr' ||whrcls,'work.tmphdr');
rc=copy('server.tmprslt'||whrcls,'work.tmprslt');
rc=copy('server.tmpattr'||whrcls,'work.tmpattr');
/* open the work files */
hdr_dsid=open('work.tmphdr', 'u');
rsltdsid=open('work.tmprslt','u');
attrdsid=open('work.tmpattr','u');
link savedata; /* actually do the saving */
/* close the work files */
if hdr_dsid then hdr_dsid=close(hdr_dsid);
if rsltdsid then rsltdsid=close(rsltdsid);
if attrdsid then attrdsid=close(attrdsid);
rc=delete('work.tmphdr'); /* delete work files */
rc=delete('work.tmprslt');
rc=delete('work.tmpattr');
/* remove data just saved from server files */
do i=1 to 3;
select(i);
when(1) filename='server.tmphdr';
when(2) filename='server.tmprslt';
when(3) filename='server.tmpattr';
otherwise;
end; /* select */
tmpdsid=open(filename||whrcls,'u');
do while(fetch(tmpdsid)=0);
rc=delobs(tmpdsid);
end;
if tmpdsid then tmpdsid=close(tmpdsid);
end;
end;
else do;
/* no lot--delay for few seconds and try again */
/* --avoids putting heavy strain on SAS/SHARE */
/* server--time shows server action on the screen */
_msg_='Server: Waiting for next lot to save. '||
putn(datetime(),'datetime18.');
refresh;
currtime=datetime();
/* delay loop */
do while (datetime()-currtime < waitsecs);
end;
/* to reduce the CPU usage, which can be */
/* substantial, some operating systems have a */
/* command that can be used instead of this loop */
/* to shut down the session for a specified */
/* number of seconds--the CMS command is called */
/* sleep */
/* */
/* call execcmdi ('cms sleep'|| */
/* put(waitsecs,8.0)||'SEC'); */
end;
link chckstat; /* check and update server status */
end; /* master do loop with stopflag check */
/* close files */
if savedsid then savedsid=close(savedsid);
if parmdsid then parmdsid=close(parmdsid);
if statusid then statusid=close(statusid);
return;