summaryrefslogtreecommitdiff
path: root/app/baisy/2.2.1-schulis/src/isp.baisy server
blob: dfb77a9d4c3baee10f5eb43b8c99d7b947604ca4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
PACKET ispbaisyserverDEFINES baisyserver:LET PARAM =STRUCT (TEXT textkey1,
textkey2,TAG maske);LET endcode=37,savedbcode=38,restoredbcode=39,
maxthesaurusentry=252,nak=1,aktionsavebase=38,aktionloadbase=39,sendall=47,
pruefen=40,init=41,loeschen=42,speichern=43,umbenennen=44,kopieren=45,liste=
46,newtree=52,reorg=53,refinementlist=54,translate=55,retranslate=56,
eraserefinement=57;LET ack=0,nack=1,ende=3;LET fehldat="Übersetzungsfehler:";
BOUND PARAM VAR p;INT VAR status;PROC baisyserver:boot;globalmanager(PROC (
DATASPACE VAR ,INT CONST ,INT CONST ,TASK CONST )baisyserver)END PROC 
baisyserver;PROC baisyserver(DATASPACE VAR ds,INT CONST auftragsnr,INT CONST 
dummy,TASK CONST auftraggeber):BOUND THESAURUS VAR boundthesau;THESAURUS VAR 
thesau;enablestop;status:=ack;fuehreauftragaus;meldezurueck.fuehreauftragaus:
IF auftragsnr>=newtreeTHEN baumbearbeitungELSE andererdienstFI .
baumbearbeitung:IF auftragsnr=newtreeTHEN schicktabelleELSE bearbeitetabelle
FI .bearbeitetabelle:TEXT VAR dateiname:=headline(sequentialfile(input,ds));
forget(dateiname,quiet);copy(ds,dateiname);forget(ds);SELECT auftragsnrOF 
CASE refinementlist:listeallerrefinementsCASE translate,reorg:
bearbeitendesbaumesCASE retranslate:ausdembaumCASE eraserefinement:
refinementloeschenOTHERWISE falscherauftragEND SELECT ;forget(dateiname,quiet
).schicktabelle:p:=ds;TEXT VAR startknotenname:=p.textkey1;forget(ds);
gibbaumtabelle(startknotenname,ds).listeallerrefinements:listederteilbaeume(
dateiname);ds:=old(dateiname).ausdembaum:BOOL VAR ok;teilbaeumeaussystembaum(
dateiname,ok);IF NOT okTHEN status:=nackFI ;ds:=old(dateiname).
refinementloeschen:loescheteilbaeume(dateiname,ok);IF NOT okTHEN status:=nack
FI ;ds:=old(dateiname).bearbeitendesbaumes:INT CONST dl:=length(dateiname);
disablestop;continue(int(subtext(dateiname,dl-1,dl)));IF auftragsnr=reorg
THEN reorganisierenELSE BOOL VAR falsch;uebersetze(dateiname,falsch)FI ;
startesystembaum;break(quiet);clearerror;enablestop;IF falschTHEN status:=
nack;ds:=old(fehldat);forget(fehldat,quiet)ELSE ds:=old(dateiname)FI .
falscherauftrag:errorstop("Ungültiger Auftrag an "+name(myself)).
andererdienst:p:=ds;SELECT auftragsnrOF CASE pruefen:maskepruefenCASE init:
maskeinitialisierenCASE loeschen:maskeloeschenCASE speichern:maskespeichern
CASE umbenennen:maskeumbenennenCASE kopieren:maskekopierenCASE liste:
maskenlisteCASE sendall:savefast(auftraggeber)CASE aktionsavebase:#savebase#
senddb(auftraggeber)CASE aktionloadbase:#fetchbase#boundthesau:=ds;thesau:=
boundthesau;restoredb(auftraggeber,thesau);startesystembaum;
startemaskenverarbeitungOTHERWISE systemaufrufEND SELECT .maskepruefen:IF 
NOT tagexists(p.textkey1)THEN status:=endeFI .maskeinitialisieren:p.maske
INITBY p.textkey1.maskeloeschen:forgettag(p.textkey1).maskespeichern:storetag
(p.maske,p.textkey1).maskekopieren:copytag(p.textkey1,p.textkey2);.
maskeumbenennen:renametag(p.textkey1,p.textkey2).maskenliste:TEXT VAR 
listdatei:=p.textkey1;listedermasken(listdatei);forget(ds);ds:=old(listdatei)
;forget(listdatei,quiet).meldezurueck:send(auftraggeber,status,ds).
systemaufruf:IF auftragsnr>=100THEN forget(ds);LEAVE baisyserverELSE 
freemanager(ds,auftragsnr,dummy,auftraggeber)FI .#savebase:sbase(auftraggeber
).fetchbase:fbase(auftraggeber,katalog);boot.katalog:BOUND THESAURUS VAR kat
:=ds;kat.#END PROC baisyserver;PROC boot:startesystembaum;
startemaskenverarbeitungEND PROC boot;PROC sbase(TASK CONST auftraggeber):
meldezurueck;saveall(auftraggeber).meldezurueck:DATASPACE VAR ds:=nilspace;
send(auftraggeber,0,ds).END PROC sbase;PROC fbase(TASK CONST auftraggeber,
THESAURUS VAR katalog):meldezurueck;interessierendeeintraege(katalog);fetch(
katalog,auftraggeber).meldezurueck:DATASPACE VAR ds:=nilspace;send(
auftraggeber,0,ds).END PROC fbase;PROC interessierendeeintraege(THESAURUS 
VAR t):LET datenraumpraefix="BAISY-";beginneliste;naechster;WHILE 
nochwelchedaREP pruefen;naechsterPER .beginneliste:TEXT VAR name;INT VAR 
index:=0.naechster:get(t,name,index).nochwelcheda:index>0.pruefen:IF pos(name
,datenraumpraefix)<>1THEN delete(t,index)FI .END PROC 
interessierendeeintraege;ROW maxthesaurusentryDATASPACE VAR receiveddb;PROC 
senddb(TASK CONST ordertask):THESAURUS VAR dbthesaurus:=ALL myself;DATASPACE 
VAR ds;INT VAR tindex;forget(ds);ds:=nilspace;interessierendeeintraege(
dbthesaurus);sendthesaurus;sendfilesinthesaurus.sendthesaurus:BOUND 
THESAURUS VAR thesau:=ds;thesau:=dbthesaurus;send(ordertask,savedbcode,ds);.
sendfilesinthesaurus:TEXT VAR fname;tindex:=0;get(dbthesaurus,fname,tindex);
WHILE tindex>0REP sendfile;get(dbthesaurus,fname,tindex)PER ;sendend.sendfile
:pause(10);forget(ds);ds:=old(fname);send(ordertask,savedbcode,ds);.sendend:
pause(10);ds:=nilspace;send(ordertask,endcode,ds).ENDPROC senddb;PROC 
restoredb(TASK CONST ordertask,THESAURUS CONST dbthesaurus):INT VAR replycode
;#THESAURUS VAR olddb:=ALL myself;#DATASPACE VAR ds;TASK VAR sourcetask:=
niltask;INT VAR tindex;TEXT VAR fname:="";#deleteallfiles;#sendack;rcvdb;
builddb.#deleteallfiles:TEXT VAR fname;INT VAR tindex;tindex:=0;get(olddb,
fname,tindex);WHILE tindex>0REP forget(fname,quiet);get(olddb,fname,tindex)
PER .#sendack:forget(ds);ds:=nilspace;send(ordertask,restoredbcode,ds).rcvdb:
INT VAR l:=1;REP forget(receiveddb[l]);wait(receiveddb[l],replycode,
sourcetask);IF NOT (sourcetask=ordertask)THEN forget(receiveddb[l]);sendnack
ELSE IF replycode=restoredbcodeTHEN lINCR 1ELSE forget(receiveddb[l])FI FI 
UNTIL replycode=endcodePER .builddb:tindex:=0;l:=1;get(dbthesaurus,fname,
tindex);WHILE tindex>0REP forget(fname,quiet);copy(receiveddb[l],fname);
forget(receiveddb[l]);lINCR 1;get(dbthesaurus,fname,tindex)PER .sendnack:
forget(ds);ds:=nilspace;send(sourcetask,nak,ds).ENDPROC restoredb;ENDPACKET 
ispbaisyserver;