`Erster Teil`
allegro Systemhandbuch V32

7.5	QRIX - Werkzeug für Datenbank-Ingenieure

Wie arbeitet INDEX?
Eine Indexdatei ist ein recht kompliziertes Gebilde. Seit Version 10.2 gibt es mehrteilige Indexdateien mit bis zu 9 Registern, ab 12.1 sind es 11. Mit zunehmender Größe der Anwendungen wurde der Wunsch nach einer flexibleren Handhabung und schnellerem Aufbau der Indexdateien dringender. Ab Version 10.3 ist das Programm INDEX intern anders gestaltet, und zu seiner Unterstützung wurde ein neues Programm, QRIX, entwickelt. Beide Programme wurden mehrfach optimiert; gegenüber 10.2 braucht das Indexieren nur noch weniger als 10%% der Zeit. Rechner mit Pentium-Prozessoren schaffen nicht selten mehrere hundert Sätze pro Sekunde. 
Hier soll zunächst die Arbeitsweise des Programms INDEX etwas näher erläutert werden, bevor die Benutzung von QRIX erklärt wird. 
Das Programm INDEX erledigt nicht die gesamte Arbeit der Indexerstellung, sondern es erzeugt zunächst einmal vorsortierte Zwischendateien mit den Namen iik (k=1,2,...). Ist das erledigt, muß ein zweites Programm, eben QRIX (sprich "cricks", für "Quick Reorganization of IndeX") den Rest erledigen, d.h. die Zwischendateien vereinigen zu einer richtigen Indexdatei. QRIX schreibt protokollarische Meldungen in die Datei PROTOQ, INDEX dagegen in PROTOK.

Eine Indexierung (= Datenbank-Generierung) geht folgendermaßen vor sich: (s.a. Kap.7) 

 1.	INDEX liest .cLD-Dateien und/oder .ALG-Dateien ein und gibt eine neue Datenbankdatei (Typ .cLD) und eine Satztabelle (Typ .TBL) aus. Dabei produziert es mit Hilfe der Index-Parameterdatei die Zugriffsschlüssel, die es aber zunächst im Arbeitsspeicher aufbewahrt. 
 2.	Wenn der Arbeitsspeicher voll wird, sortiert INDEX die gesammelten Einträge und schreibt sie in eine Hilfsdatei mit dem Namen iik . Dann läuft Vorgang 1. weiter, bis die Ausgangsdaten zu Ende sind. Die Zahl k beginnt bei 1 und wird jedesmal um 1 hochgezählt. 
 3.	Sind alle Ausgangsdaten durchgearbeitet, liegen als Zwischenergebnis einige Hilfsdateien ii1, ii2, ..., iin vor. Dann ruft INDEX das Programm QRIX auf. Hatte man Option -m1 gegeben, kann man vorher unterbrechen, z.B. um die Ausgangsdaten auszulagern, und QRIX dann mit der Hand starten. (Der Aufruf wird an das Ende der Datei PROTOK geschrieben, damit man ihn sich bei Bedarf ansehen kann.) 
 4.	QRIX nimmt jeweils 10 Hilfsdateien und mischt sie zu einer neuen zusammen: aus den Nummern 1-10 wird Nummer 1, aus 11-20 wird Nummer 2 usw., bis nur noch höchstens 10 Dateien übrig sind. 
 5.	Wenn schon eine .cDX-Datei vorhanden ist, sind 2 Situationen denkbar, und das Programm fragt, welche davon vorliegt: (man antwortet durch Druck auf '0' oder '1') 
	1 	INDEX war gestartet worden, um neue Daten zur Datenbank hinzuzufügen: in diesem Fall muß QRIX die neuen Hilfsdateien mit der vorhandenen .cDX-Datei zu einer neuen .cDX-Datei zusammenmischen. 
		Wenn man INDEX mit Option  -f?1  startet (? = 7,i,n), weiß das Programm gleich Bescheid. 
	0 	Die alte Indexdatei ist überflüssig, denn es wurde eine Index-Erneuerung gestartet. Dann wird die .cDX-Datei zunächst gelöscht und aus den Hilfsdateien neu aufgebaut. 
		Dies kann man dem Programm durch Option  -f?0  mitteilen (? = 7,i,n). Oder man löscht die .cDX-Datei vor dem Start. 
 6.	Wenn mit Stammsätzen gearbeitet wird (es kommt ein Befehl i5 in der Index-Parameterdatei vor), dann startet QRIX das Programm INDEX automatisch für einen zweiten Durchlauf (-Ø 10.2.6.8). Hierbei werden die Ersetzungen der Stammsatznummern durch die Klartexte der Namen, Schlagwörter etc. durchgeführt (-Ø 10.2.6.3 Index-Sonderbefehle). Dies gilt auch für die Kurzanzeige: sie wird automatisch mit bearbeitet. 
	Den zweiten Durchlauf kann man auch von Hand starten: dann ist INDEX mit der Option -fa1 aufzurufen. QRIX schreibt diesen Aufruf für Kontrollzwecke an das Ende der Datei PROTOQ. 

Wiederanlauf nach Unterbrechung
Wenn QRIX z.B. durch Stromausfall abgebrochen wurde, stellt man zunächst fest, wie weit es gekommen war. Beispiel: es gibt die Dateien ii1 bis ii76 und ii751 bis ii1248. Das bedeutet: es muß mit ii751 weitergemacht werden (ii76 ist sehr wahrscheinlich unvollständig). Das veranlaßt man durch 
qrix -fq -n751 ...
Dann entsteht eine neue ii76 aus ii751 - ii760, usw. Ist dann die letzte verarbeitet, geht es wieder vorn los: aus ii1 bis ii10 wird eine neue ii1, aus ii11 bis ii20 wird ii2, usw. Sind schließlich nur noch bis zu 10 ii-Dateien übrig, wird daraus die eigentliche Indexdatei erstellt. 

Zum Zeitbedarf
Abhängig von der Leistung des Systems können je Stunde 50.000 bis 1.000.000 Datensätze indexiert werden. Mehrtägige Indexierungsläufe dürften selbst bei Millionenmengen kaum auftreten. Man kann mehrteilige Indexdateien auch etappenweise erstellen oder einzelne Indexteile herausnehmen oder getrennt erneuern, ohne den Gesamtindex neu generieren zu müssen (dazu gibt es die QRIX-Optionen -w und -W). Oder z.B. zeitweise einen Zusatzindex dranhängen und später wieder beseitigen, den man für eine Dublettenprüfung braucht (-Ø 7.6/7). 

Aufruf
Mit folgenden Optionen ruft man QRIX auf: Zunächst die Funktionen:

-fc	Index kompaktieren  (insbes. Kombination mit -w und -W, s.u. !)	CockPit µr o c
		vorhandene .cDX-Datei komprimieren; .cLD und .TBL bleiben unberührt 
		Wenn man -fc1 gibt, wird der alte Index nicht gelöscht, sondern in OLDIX umbenannt. Nach Rückbenennung ist er dann wieder benutzbar. 
		Nur bei dieser Funktion bleiben die manuellen Änderungen (-Ø Kap.1.4, Funktionen Inst/Del), die man im Index gemacht hat, erhalten. 
		Diese Funktion ist sinnvoll, wenn ein Index sich nach längerem Gebrauch stark vergrößert hat. 
		Die Kombination  QRIX -fc -W47  würde z.B. bewirken, daß beim Kompaktieren die Teil-Indizes 4 und 7 weggelassen werden (wozu das gut ist? -Ø 7.6 und 7.8). 
-fd		Index anzeigen (default-Funktion) 
		zusammen mit den Optionen -s, -S, -w, -W und -x kann man sich verschiedene Teile einer Indexdatei am Bildschirm ansehen oder ausdrucken lassen. Stop/Abbruch mit x . Diese Funktion wird z.B. angewendet bei der Einrichtung WWW-Zugängen, um Index-Einblicke zu ermöglichen. 
-fqi	Hilfsdateien mischen und Index aufbauen   (i = 0 oder 1 für Neuaufbau bzw. Einmischen) 
		Dieser Aufruf wird von INDEX automatisch gemacht, sobald die ii-Dateien fertig sind. Man kann aber auch nach dem Ablauf von INDEX unterbrechen (Option -m1) und QRIX`-fq später mit der Hand aufrufen. Die von INDEX erzeugten Dateien iik werden zusammengemischt. Wenn keine .cDX-Datei existiert, wird sie neu erzeugt. Wenn eine vorhanden und ist und -fq1  gegeben wurde, wird sie mit den Hilfsdateien zu einem neuen Index vereinigt, bei -fq0 wird der vorhandene Index gelöscht; wenn i fehlt, wird gefragt, ob das Vereinigen stattfinden soll oder nicht. 
		Wenn man QRIX -fq von Hand gibt, füge man die Option -Kn mit n=Schlüssellänge hinzu. (Wenn INDEX automatisch QRIX aufruft, passiert auch das automatisch.) Sonst fragt das Programm nach dieser Zahl, falls es die Index-Parameterdatei nicht findet (denn darin steht die Zahl im Befehl il). 

Mit diesen drei Funktionen sind folgende Möglichkeiten sinnvoll kombinierbar: 

Zusatz-Optionen:	CockPit µf q

-Edatei	interne Satznummern ausgeben : dies wird in WWW-Anwendungen eingesetzt, und zwar zusammen mit der Option: 

-ddbdir	Datenordner : Wo liegt die Datenbank, also auch der Index, um den es geht? 

-eparami=dbdir 
		Indexparameter:  QRIX muß wissen, wie die Indexdatei heißt bzw. heißen soll und was die maximale Schlüssellänge ist. Option -e ermöglicht es ihm, diese Dinge festzustellen. Weder -d noch -e dürfen fehlen.

-Ze		Indexdatei  cat.aex nehmem statt  cat.adx  (MultiX)  bei Funktion  -fd

-Mn		Zeilenanzahl vorgeben : es werden n Zeilen ausgegeben (nur bei -fd sinnvoll) 
-tnnn,ppp	Kategorienummern für die Ausgabe in datei. Die Satznummer wird in Kategorie #nnn ausgegeben, in #ppp kommt die Kurzanzeige. Es entstehen Ausgabesätze im Grundformat, die nur aus #nnn und #ppp bestehen. Diese Grunddatei kann anschließend per SRCH verarbeitet werden. Dabei kann man die eigentlichen Sätze laden (per Nachladebefehl |01). Dies wird in älteren Web-Verfahren gebraucht, wo man nicht den "avanti"-Server einsetzen konnte. 
			Die entstandene datei muß dann anschließend durch SRCH verarbeitet werden. 
-sabc	Selektive Anzeige  (Ausschnitt aus dem Index, nur bei -fd sinnvoll) 
-Sxyz		Das Programm soll bei abc mit der Anzeige beginnen, bei xyz enden 
-wijk	Register auswählen  (w = with; i j k = aufsteigende Ziffern zwischen 1 und 9, : für 10,  ;  für 11) 
			nur die Register i, j und k sollen angezeigt werden; z.B. -w135
-Wijk	Register i, j und k weglassen  (W = Without) 
			z.B. mit -W123579 würde man nur die Register 4, 6 und 8 bekommen 
			(sind  -w  und  -W  gleichzeitig angegeben, wirkt nur  -w) 
-xn		Schwellenwert für die Anzeige 
			nur Einträge mit mehr als n Datensätzen erscheinen in der Anzeige. Standardwert ist -x29. Wenn man den gesamten Index sehen will: -x0  geben (nur bei -fd sinnvoll) 
-T		Testbetrieb : man erhält zusätzliche Meldungen über den Verlauf der Arbeit des Programms. 
-Qproto	Protokolldatei: Meldungen werden in die Datei PROTOQ geschrieben. Mit dieser Option kann man einen anderen Namen vorgeben. 
>filename	Ausgabe in Datei filename umlenken : für Option -fd ist es sinnvoll, die Ausgabe statt auf den Bildschirm in eine Datei schreiben zu lassen. Bei älteren WWW-Schnittstellen wurde dies eingesetzt, um Registerauszüge zunächst in eine Datei schreiben zu lassen und diese dann für die Anzeige in Netscape aufzubereiten. 

Beispiel:		qrix -fq1 -dbibl -ecat/bibl -x1000    (ii-Dateien auf BIBL\ suchen und dort in  cat.adx  einmischen) 
			qrix -fd -dbibl -ecat/demo2 -Ze -x0 >ixlist   (gesamte  cat.aex  als lineare Liste ausgeben in die Datei  ixlist ) 

7.6	Einzelne Register erneuern

Wer größere Datenmengen hat (d.h. mindestens mehrere zehntausend), wird es lästig finden, wegen einer Änderung an einem der Register gleich einen umfassenden Gesamtlauf zur Neu-Indexierung zu machen. Ist auch nicht notwendig. Man geht so vor: Nehmen wir an, die Register 2 und 5 sollen erneuert werden. Dann: 

   •	Man führt die nötigen Änderungen an der Index-Parameterdatei aus und macht zunächst alle nicht für die Register 2 und 5 zuständigen ak-Zeilen unwirksam, indem man jeweils ein Leerzeichen davor setzt. 
   •	Man beseitigt die Register 2 und 5 wie in Abschnitt 7.8 gezeigt  (qrix -fc -W25 ...)
   •	index -fi1 -0  erstellt die neuen Register 2 und 5 und arbeitet sie in die alte Indexdatei ein, evtl. unter Mithilfe von QRIX, welches aber automatisch aufgerufen wird. (Achtung: bei index -fi0 hätte man anschließend nur noch die Register 2 und 5, die anderen wären weg!) Die nur für INDEX geltende Option -0 (Null) verhindert übrigens, daß die Leerschlüssel, die ja ins Register 1 kommen, bei dem Durchlauf neu gebildet werden. Schaden könnte das zwar nicht, aber es würden lauter Meldungen "Ladefehler ..." kommen. 
   •	Nicht vergessen: in der Index-Parameterdatei wieder alle ak-Zeilen wirksam machen (Leerzeichen vor den ak-Zeilen wieder wegnehmen). Sonst werden bei künftigen Änderungen und Neueingaben nur die Register 2 und 5 bedient. 

7.7	Neues Register hinzufügen

Solange man noch weniger als 11 Register hat, kann man ohne weiteres eines oder mehrere neue hinzufügen. Das geschieht wie folgt:   (wenn es um das Kurztitelregister geht, siehe 7.0, Situation 6) 

   •	In der Index-Parameterdatei ergänzt man die nötigen ak-Zeilen und Prozeduren für die Schlüssel, die in dem neuen Register stehen sollen. Dann macht man zeitweilig die anderen ak-Zeilen alle unwirksam, indem man jeweils ein Leerzeichen davor setzt. 
   •	Man startet  index -fi1  und läßt es durchlaufen. Das neue Register wird angelegt und in die vorhandene Indexdatei eingearbeitet. 
   •	Nicht vergessen: in der Index-Parameterdatei wieder alle ak-Zeilen wirksam machen (Leerzeichen vor den ak-Zeilen wieder wegnehmen). 

7.8	Ein Register ganz löschen

Ein Register k, das nur temporär gebraucht wird, kann auch mit Option -W wieder völlig beseitigt werden. Das leistet der Befehl 

qrix -fc -Wk -eparam/datapath

Zugleich wird dabei der Index kompaktiert - was nie schaden kann. 

7.9	Registerauszüge

Hinweis: Viel leichter geht's mit den Windows-Programmen über den Button [List] im Indexfenster (à Kap.2). 
Die FLEX-Sprache hat einen Befehl `qrix`, mit dem man leicht Registerauszüge aller Art erstellen kann (Menü Export / Komfort-Methoden / Registerauszug). 
Manchmal wird gewünscht, einzelne Register ganz oder teilweise in eine Textdatei kopieren zu können. Wie das geht, wurde oben unter 7.5 schon erwähnt. Wir zeigen es hier noch deutlicher und mit Beispielen, damit es jeder leicht durchführen kann, auch ohne sich mit den anderen Optionen zu befassen. Wenn man die Bildschirmausgabe mit dem MS-DOS-Steuerzeichen > in eine Datei oder auf den Drucker umlenkt, kann man Registerauszüge in Textdateien umwandeln oder ausdrucken. Das CockPit-Menü µf q für QRIX enthält einen Punkt d Dateiname. Dort trägt man den gewünschten Namen oder PRN ein. Der QRIX-Aufruf wird dann ergänzt um die Option  >dateiname. Diese kann man natürlich auch in eigene Aufrufe einbauen. 

Beispiel 1: Auf KATALOG (Unterverzeichnis von C:\ALLEGRO) liegt die Datenbank CAT. Aus dem Register 1 soll ein Ausschnitt von 30 Zeilen Länge in die Datei EXTRACT geschrieben werden, beginnend bei "mozart". Das könnte man so erreichen: 
qrix -dkatalog -fd -x0 -smozart -M30 -w1 -ecat/katalog >extract

Beispiel 2: Man will aus Register 1 die Zeilen mit den gelöschten Sätzen sehen. Die Schlüssel beginnen alle mit "//". Der Befehl kann so aussehen: 
qrix -fd -x0 -dkatalog -s// -S0 -w1 -ecat/katalog

DOS: Anstatt diese Aufrufe mit der Hand einzugeben oder in Batchdateien zu installieren, kann man auch im CockPit das Menü "Funktionen / QRIX" aufrufen. Alle Einzelheiten des Aufrufs werden dort in einer Eingabemaske eingestellt. 

NEWINX ??? 	Eine Datei mit diesem Namen entsteht, wenn QRIX nicht weiß, wie die zu produzierende Indexdatei heißen soll. Mit der Option -edbn kann man es ihm sagen, wobei dbn der Datenbankname ist. Bei Start über CockPit tritt dieser Fall nicht auf. 
			Abhilfe: einfach NEWINX umbenennen, also z.B. 
			  ren newinx cat.adx . 
			und eine zu dem Zeitpunkt bestehende, viel kleinere cat.adx vorher löschen. 

?Erster Teil=h ac7-1 
?qrix=h xqrix