Ein KeyedAccessRecordFile-Objekt repräsentiert eine für index-sequentiellen Zugriff geöffnete Datei. Die Datei wird beim Erzeugen des Objektes (siehe Abschnitt „Öffnen und Schließen einer Datei") implizit geöffnet.
Die KeyedAccessRecordFile-Klasse bietet Methoden zum Lesen, Schreiben und Löschen von Sätzen dieser Datei. Zusätzlich gibt es Methoden für die Handhabung von Schlüsseln und zum Schließen der Datei.
Die Datei, die geöffnet werden soll, muss im zugrunde liegenden Dateisystem schon existieren. Für die Erzeugung einer Datei muss die Methode createNewFile() der Klasse RecordFile benutzt werden.
Beim Öffnen einer Datei für den index-sequentiellen Zugriff kann die spezifische Zugriffsrichtung eingeschränkt werden und es kann das Löschen des Datei-inhalts einer existierenden Datei angefordert werden.
Die folgenden Open-Modi werden mit dieser Klasse erlaubt:
INPUT
Nach dem Öffnen der Datei sind nur Lese-Operationen erlaubt.OUTIN
Nach dem Öffnen sind sowohl Schreib- als auch Lese-Operationen erlaubt. Der vollständige Dateiinhalt wird beim Öffnen der Datei gelöscht.INOUT
Nach dem Öffnen sind sowohl Lese- als auch Schreib-Operationen erlaubt. Beim Öffnen der Datei bleibt der Dateiinhalt unverändert.
Nach dem Schließen der Datei sollte das KeyedAccessRecordFile-Objekt nicht mehr benutzt werden.
Öffnen und Schließen einer Datei
Bei der Konstruktion eines KeyedAccessRecordFile-Objektes wird die als RecordFile-Objekt angegebene Datei mit der angegebenen Zugriffsmethode oder den angegebenen Zugriffsparametern im spezifizierten Modus geöffnet.
Die Datei muss im darunter liegenden Dateisystem bereits existieren und die Zugriffsmethode muss zu diesem Dateisystem gehören und muss für diese Datei erlaubt sein. Der Benutzer muss die für den angegebenen Open-Modus erforderlichen Zugriffsrechte auf die Datei besitzen. Falls ein Security Manager aktiv ist und dessen Einschränkungen für diese Datei mit dem angegebenen Open-Modus kollidieren, so wird eine Exception ausgelöst (siehe Abschnitt „Sicherheit").
Werden zum Öffnen Zugriffsparameter angegeben, so werden diese beim Öffnen berücksichtigt, soweit nicht die Datei-Parameter Vorrang haben. Nach dem Öffnen werden sie mit den entsprechenden Werten der geöffneten Datei aktualisiert.
Die Methode close() schließt die index-sequentielle Datei. Danach sind keine E/A-Operationen über dieses KeyedAccessRecordFile-Objekt mehr möglich.
Besonderheiten des DMS-Dateisystems
Die Shared-Update-Verarbeitung (siehe Abschnitt „Shared-Update-Verarbeitung" sowie Abschnitt „AccessParameter") eines KeyedAccessRecordFile ist für alle Open-Modi (INPUT, INOUT, OUTIN) möglich. Der Open-Modus OUTIN ist allerdings nur für die Anwendung erlaubt, die die Datei als erste öffnet. Wenn die Datei im Open-Modus INPUT eröffnet wurde, erfolgen alle Zugriffe ohne Sperre. Es können also keine Zugriffskonflikte auftreten. Es muss jedoch damit gerechnet werden, dass der Inhalt des Satzes zwischenzeitlich von einer anderen Anwendung geändert wurde. Bei den anderen Open-Modi erfolgen Lese- und Schreibzugriffe mit impliziter Sperre, was bei Zugriffskonflikten je nach mittels setWaitMode() eingestellten Option zu einer RecordLockedException bzw. zum Warten des Threads oder der gesamten Anwendung führen kann. Sperren werden nach dem Schreiben oder Löschen des gesperrten Satzes implizit wieder aufgehoben. Sie können aber auch explizit mit unlock() aufgehoben werden. Beim Lesen eines Satzes wird eine noch bestehende Sperre für einen anderen Satz ebenfalls aufgehoben. Einzelheiten entnehmen Sie der jeweiligen Schnittstellenbeschreibung in der mitgelieferten JAVADOC-Dokumentation.
Methoden zum Lesen von Sätzen
Alle read-Methoden werden in zwei Ausprägungen angeboten. Einmal eine Variante, bei der der gelesene Satz in einem neu erzeugten Record-Objekt als Ergebnis bereitgestellt wird und einer Variante, bei der ein vom Aufrufer als Argument übergebenes Record-Objekt mit den Daten des gelesenen Satzes gefüllt wird.
Wird ein Satzpuffer neu angelegt, so hat er genau die Größe der gelesenen Daten. Stellt der Aufrufer das Record-Objekt bereit, muss er dafür sorgen, dass der Satzpuffer groß genug ist, um die Daten des zu lesenden Satzes aufzunehmen. Wenn der angegebene Satzpuffer zu klein ist, um die kompletten Daten aufzunehmen, wird eine Ausnahme ausgelöst und es werden keine Daten übertragen.
Bei den read-Methoden, bei denen ein KeyValue- bzw. KeyDescriptor-Objekt angegeben werden kann, werden solche Argumente nur akzeptiert, wenn sie zu dieser Datei passen (siehe Methoden getPrimaryKeydescriptor() und getSecondaryKeydescriptor()).
Die Methoden read() lesen den Satz, der durch den angegebenen Schlüsselwert ausgewählt wird. Gibt es in der Datei mehrere Sätze mit dem gleichen Schlüsselwert, wird der erste geliefert. Als Schlüsselwert kann sowohl ein Wert des primären als auch ein Wert eines sekundären Schlüssels angegeben werden.
Die Methoden readNext() lesen den jeweils nächsten Satz gemäß der Ordnung, die durch das gegebene Argument bestimmt wird. Es gibt drei Varianten dieser Methoden:
Wird kein Ordnungsargument angegeben, so wird der nächste Satz gelesen, der durch die Ordnung des primären Schlüssels definiert ist. Wenn diese Methode als erste Operation nach dem Öffnen der Datei gerufen wird, so wird der Satz mit dem kleinsten verfügbaren primären Schlüsselwert gelesen, ansonsten liest diese Operation den nachfolgenden Satz des zuletzt gelesenen Satzes, falls der zuletzt gelesene Satz ebenfalls über den primären Schlüssel gelesen wurde (ansonsten ist das Verhalten zugriffsmethodenspezifisch). Dies ist eine Methode, um Sätze sequentiell zu lesen, die den gleichen Schlüsselwert enthalten.
Wird als Ordnungsargument eine Schlüsselbeschreibung angegeben, so wird der nächste Satz gelesen, der durch die Ordnung des primären bzw. sekundären Schlüssels der gegebenen Schlüsselbeschreibung definiert ist. Wenn diese Methode sofort nach dem Öffnen der Datei gerufen wird, wird der Satz mit dem kleinsten verfügbaren Schlüsselwert, gemäß der gegebenen Schlüsselbeschreibung, gelesen, ansonsten liest diese Operation den nachfolgenden Satz des zuletzt gelesenen Satzes, falls der zuletzt gelesene Satz über die gleiche Schlüsselbeschreibung gelesen wurde (ansonsten ist das Verhalten zugriffsmethodenspezifisch). Dies ist eine Methode, um Sätze sequentiell zu lesen, die den gleichen Schlüsselwert enthalten.
Wird als Ordnungsargument ein Schlüsselwert angegeben, so wird der Satz mit dem nächst größeren Schlüssel, gemäß der Ordnung der zugehörigen Schlüsselbeschreibung, gelesen.
Die Methoden readPrevious() lesen analog den Methoden readNext(), jedoch den jeweils vorherigen Satz statt des nachfolgenden Satzes.
Methoden zum Schreiben und Löschen von Sätzen
Beim Schreiben von Sätzen in eine index-sequentielle Datei ist die Position des geschriebenen Satzes durch die im Satz enthaltenen Schlüsselfelder bestimmt.
Die Methode write() schreibt einen Satz in die Datei. Wenn es schon einen Satz mit gleichem primären Schlüsselwert gibt und keine doppelten Schlüssel für den primären Schlüssel erlaubt sind, so wird der existierende Satz ersetzt. Wenn doppelte Schlüssel erlaubt sind und der Satz schon existiert, wird der Satz nach dem letzten Satz mit dem gleichen primären Schlüsselwert angefügt.
Die Methode writeNew() schreibt einen Satz in die Datei, aber nur, wenn noch kein Satz in der Datei mit dem gleichen primären Schlüssel existiert.
Die Methode writeBack() überschreibt einen direkt vorher gelesenen Satz in der Datei. Es dürfen zwischen der Lese- und Schreib-Operation keine Änderung am primären Schlüsselfeld des Satzes durchgeführt werden. Bei der Shared-Update-Verarbeitung wird ein existierender Satz nur dann überschrieben, wenn die für ihn beim Lesen gesetzte Sperre noch besteht. Andernfalls wird eine RecordNotLockedException ausgelöst.
Die Methode delete() löscht den Satz, der durch den angegebenen Schlüsselwert ausgewählt wird. Gibt es in der Datei mehrere Sätze mit dem gleichen Schlüsselwert, wird der erste gelöscht. Als Schlüsselwert kann sowohl ein Wert des primären als auch ein Wert eines sekundären Schlüssels angegeben werden.
Methoden zum unbedingten Aufheben einer Sperre
Die Methode unlock() dient zum expliziten Aufheben einer durch eine Leseoperation implizit gesetzten Sperre bei der Shared-Update-Verarbeitung.
Methoden zum Ermitteln von Schlüsselbeschreibungen
Die Methode getPrimaryKeyDescriptor() liefert die Schlüsselbeschreibung für den primären Schlüssel dieser Datei.
Die Methode getSecondaryKeyDescriptor() liefert die Schlüsselbeschreibung für den sekundären Schlüssel mit dem angegebenen Namen.
Die Methode getKeyDescriptorNames() liefert eine Liste der Namen aller sekundären Schlüssel dieser Datei.
Methoden zum Erzeugen und Löschen von sekundären Schlüsseln
Die Methoden createSecondaryKey() erzeugen für diese index-sequentielle Datei einen neuen sekundären Schlüssel mit den angegebenen Parametern. Es gibt zwei Parameter-Varianten, die eine Variante ist, dass alle Felder des KeyDescriptor-Objektes (Name, Schlüsselposition, -länge und die Angabe, ob für diesen Schlüssel gleiche Schlüsselwerte in verschiedenen Sätzen erlaubt sind) einzeln angegeben werden und die zweite Variante ist, dass ein KeyDescriptor-Objekt für einen sekundären Schlüssel angegeben wird. Mit der zweiten Variante können Sie z.B. die Attribute eines sekundären Schlüssels einer anderen Datei benutzen, um einen entsprechenden sekundären Schlüssel in dieser Datei zu erzeugen
Die Methode deleteSecondaryKey() löscht den angegebenen sekundären Schlüssel dieser index-sequentiellen Datei.
Die Methoden createSecondaryKey() und deleteSecondaryKey() erfordern den exklusiven Zugriff auf die Datei und sind daher bei der Shared-Update-Verarbeitung nicht erlaubt. Sie führen zur IOException.