java.lang.Object
de.bsvrz.ars.ars.persistence.index.backend.storage.HybridStorage
All Implemented Interfaces:
IndexStorage, AutoCloseable

public final class HybridStorage extends Object implements IndexStorage, AutoCloseable
Eine IndexStorage-Implementierung, die einen Puffer für neu angelegte Objekte im Speicher hält und gleichzeitig auf eine Datei verweist.

Läuft der RAM-Puffer über, werden die Einträge an die Datei angehängt.

Beim Lesen wird die Datei und der RAM-Puffer wie ein zusammenhängender Speicherbereich angesprochen.

  • Constructor Details

    • HybridStorage

      public HybridStorage(int entryByteSize, int memoryLimit, @Nullable Path file) throws IOException
      Erzeugt eine neue Instanz
      Parameters:
      entryByteSize - Byte-Größe eines Eintrags
      memoryLimit - Maximale Anzahl Einträge, die im Speicher gehalten werden
      file - Datei, in die die Einträge geschrieben werden sollen (in der Regel != null, außer für bestimmte Tests)
      Throws:
      IOException - IO-Fehler beim Lesen
  • Method Details

    • getEntries

      public void getEntries(long entryIndex, int numEntries, byte[] result, int destPos) throws IOException
      Description copied from interface: IndexStorage
      Gibt Einträge aus dem Index zurück
      Specified by:
      getEntries in interface IndexStorage
      Parameters:
      entryIndex - Nullbasierte Position des ersten Eintrags, der angefragt werden soll. Gemeint ist hier die "Zeilennummer" im Index, nicht der byte-Offset
      numEntries - Anzahl Einträge, die angefragt werden sollen
      result - Byte-Array, in das das Ergebnis kopiert werden soll, muss mindestens destPos + (numEntries * IndexStorage.entryByteSize()) Bytes groß sein.
      destPos - Ziel-Position im Byte-Array. Standardmäßig 0.
      Throws:
      IOException - IO-Fehler (z. B. bei Dateizugriff)
    • setEntries

      public void setEntries(long entryIndex, int numEntries, byte[] data, int fromPos) throws IOException
      Description copied from interface: IndexStorage
      Setzt Einträge im Index
      Specified by:
      setEntries in interface IndexStorage
      Parameters:
      entryIndex - Nullbasierte Position des ersten Eintrags, der gesetzt werden soll. Gemeint ist hier die "Zeilennummer" im Index, nicht der byte-Offset
      numEntries - Anzahl Einträge, die überschrieben werden sollen
      data - Byte-Array, aus dem die Daten kopiert werden sollen, muss mindestens fromPos + (numEntries * IndexStorage.entryByteSize()) Bytes groß sein.
      fromPos - Von-Position im Byte-Array. Standardmäßig 0.
      Throws:
      IOException - IO-Fehler (z. B. bei Dateizugriff)
    • insertEntries

      public void insertEntries(long entryIndex, int numEntries, byte[] data, int fromPos) throws IOException
      Description copied from interface: IndexStorage
      Fügt Einträge im Index ein, anders als bei IndexStorage.setEntries(long, int, byte[]) werden die dort bestehenden Daten aber nicht überschrieben, sondern nach hinten geschoben.
      Specified by:
      insertEntries in interface IndexStorage
      Parameters:
      entryIndex - Nullbasierte Position an der Eingefügt werden soll (neuer Index des ersten eingefügten Eintrags). Gemeint ist hier die "Zeilennummer" im Index, nicht der byte-Offset
      numEntries - Anzahl Einträge, die eingefügt werden sollen
      data - Byte-Array, aus dem die Daten kopiert werden sollen, muss mindestens (numEntries * IndexStorage.entryByteSize()) Bytes groß sein.
      fromPos - Von-Position im Byte-Array. Standardmäßig 0.
      Throws:
      IOException - IO-Fehler (z. B. bei Dateizugriff)
    • getFile

      public Path getFile()
      Gibt die Datei zurück
      Returns:
      die Datei
    • numEntries

      public long numEntries()
      Description copied from interface: IndexStorage
      Gibt die Anzahl Einträge zurück
      Specified by:
      numEntries in interface IndexStorage
      Returns:
      die Anzahl Einträge
    • firstMemoryIndex

      public long firstMemoryIndex()
      Gibt den Index des ersten Eintrags im Speicher zurück, bzw. die Anzahl der in der datei gespeicherten Einträge
      Returns:
      den Index des ersten Eintrags im Speicher
    • memoryEntries

      public int memoryEntries()
      Gibt die aktuelle Anzahl der im Speicher gepufferten Einträge zurück
      Returns:
      aktuelle Anzahl Einträge
    • entryByteSize

      public int entryByteSize()
      Description copied from interface: IndexStorage
      Gibt die Byte-Größe eines Eintrags zurück
      Specified by:
      entryByteSize in interface IndexStorage
      Returns:
      die Byte-Größe eines Eintrags
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Throws:
      IOException
    • deleteEntryAtIndex

      public void deleteEntryAtIndex(long entryIndex) throws IOException
      Description copied from interface: IndexStorage
      Löscht den Eintrag am Index entryIndex
      Specified by:
      deleteEntryAtIndex in interface IndexStorage
      Parameters:
      entryIndex - Index, der gelöscht werden soll
      Throws:
      IOException
    • flush

      public void flush() throws IOException
      Schreibt alle Änderungen in das Dateisystem
      Throws:
      IOException - Fehler beim Schreiben