pl.edu.pjwstk.yaod.store.defaultstore.persistentstore
Class PersistentRecordManager

java.lang.Object
  |
  +--pl.edu.pjwstk.yaod.store.defaultstore.persistentstore.PersistentRecordManager

public class PersistentRecordManager
extends java.lang.Object

Klasa zapewnia niskopoziomowa funkcjonalnosc domyslnego skladu trwalych obiektow. Jej podstawowym zadaniem jest tworzenie rekordow w ramach blokow danych oraz wczytywanie blokow danych z dysku lub bufora blokow. Instancja tej klasy jest czescia procesu uslugowego, a jej metody wywolywane sa przez oslone (wrapper), udostepniajaca uslugi tworzenia atomow dla menadzera atomow.

Author:
M. Lentner, raist@ertel.com.pl

Constructor Summary
PersistentRecordManager(PersistentBlockManager bm)
           
 
Method Summary
 PersistentRecordID createRecord(byte[] data)
          Tworzy nowy rekord.
 void deleteRecord(PersistentRecordID recordPtr)
          Usuwa rekord identyfikowany przez podany wskaznik rekordu.
 byte[] getRecord(PersistentRecordID recordPtr)
          Zwraca rekord identyfikowany podanym wskaznikiem.
 void updateRecord(PersistentRecordID recordPtr, byte[] data)
          Aktualizuje rekord o podanym wskazniku, zastepujac go nowymi danymi.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

PersistentRecordManager

public PersistentRecordManager(PersistentBlockManager bm)
Method Detail

createRecord

public PersistentRecordID createRecord(byte[] data)
                                throws java.lang.Exception
Tworzy nowy rekord. Jesli rekord jest zbyt duzy by zmiescic go w jednym bloku, wowczas dzieli go na fragmenty i zapisuje jako rekord lancuchowany w formie kilku rekordow prostych. Kazdy rekord lancuchowany posiada na koncu 8 bajtow wskaznika do nastepnej czesci. Jesli rekord nie jest lancuchowany (w calosci miesci sie w jednym bloku), wowczas nie posiada takiego wskaznika. Ostatnia czesc rekordu lancuchowanego rowniez go nie posiada. Informacja o tym, czy dany rekord prosty ma wiecej fragmentow zapisywana jest przez podniesienie specjalnej flagi (wiecej o tym w DataBlock.createRecord()).
Parameters:
data - dane do zapisania.
Returns:
wskaznik do utworzonego rekordu.
Throws:
NoFreeSpaceException - nie mozna utworzyc bloku ze wzgledu na brak wolnego miejsca.

updateRecord

public void updateRecord(PersistentRecordID recordPtr,
                         byte[] data)
                  throws NoSuchRecordException
Aktualizuje rekord o podanym wskazniku, zastepujac go nowymi danymi. Zastosowano uproszczona wersje aktualizacji: jesli rekord jest lancuchowany i ma 1..n czesci, wowczas najpierw kasuje czesci 2..n, nastepnie tworzy nowy rekord, a czesc 1 modyfikuje w taki sposob, by nie zawierala zadnych danych, oprocz wskaznika na poczatek nowego rekordu.
Parameters:
recordPtr - aktualizowany rekord.
data - dane, jakie maja zastapic aktualizowany rekord.
Throws:
NoSuchRecordException - brak takiego rekordu.

deleteRecord

public void deleteRecord(PersistentRecordID recordPtr)
                  throws NoSuchRecordException,
                         java.lang.Exception
Usuwa rekord identyfikowany przez podany wskaznik rekordu. Jesli rekord jest lancuchowany, to usuwa wszystkie jego czesci.
Parameters:
recordPtr - wskaznik do usuwanego rekordu.
Throws:
NoSuchRecordException - rekord wskazywany przez recordPtr nie istnieje.

getRecord

public byte[] getRecord(PersistentRecordID recordPtr)
                 throws NoSuchRecordException
Zwraca rekord identyfikowany podanym wskaznikiem. Jesli jest to rekord lancuchowany (zapisany w kilku czesciach umieszczonych w osobnych blokach), wowczas czesci te skladane sa w jedna calosc.
Parameters:
recordPtr - wskaznik do rekordu.
Returns:
dane rekordu w formie ciagu bajtow.
Throws:
NoSuchRecordException - brak takiego rekordu.