UniSet  1.4.0
Открытые члены | Защищенные данные
Класс TableBlockStorage

Полный список членов класса

Открытые члены

 TableBlockStorage ()
 TableBlockStorage (const char *name, int byte_sz, int key_sz, int inf_sz, int inf_count, int block_num, int block_lim, int seek, bool create=false)
bool open (const char *name, int byte_sz, int inf_sz, int key_sz, int inf_count, int block_num, int block_lim, int seek)
bool create (const char *name, int byte_sz, int inf_sz, int key_sz, int inf_count, int block_num, int block_lim, int seek)
bool addRow (void *key, void *val)
bool delRow (void *key)
void * findKeyValue (void *key, void *val)
int getCurBlock (void)
int getByteSize ()
bool checkAttr (int key_sz, int inf_sz, int sz, int block_num, int block_lim, int seek)

Защищенные данные

FILE * file
int inf_size

Конструктор(ы)

Конструктор по умолчанию не открывает и не создает новой таблицы

Функции класса TableBlockStorage, таблицы ключ-значение с ограниченным кол-вом перезаписей для каждого блока памяти, при достижении предела, происходит переход в следующий блок

TableBlockStorage::TableBlockStorage ( const char *  name,
int  byte_sz,
int  key_sz,
int  inf_sz,
int  inf_count,
int  block_num,
int  block_lim,
int  seek,
bool  create = false 
)

Конструктор вызывает функцию Open, а при параметре create=true создает новую таблицу при несовпадении заголовков или отсутствии старой

Перекрестные ссылки create() и open().


Методы

bool TableBlockStorage::addRow ( void *  key,
void *  val 
)

Добавление информации по ключу, возможна перезапись при совпадении ключа с существующим

если нашли совпадение ключа, то pos>=0, записываем на это место, иначе пишем на пустое место empty

Возвращаем false, если место в блоке закончилось

bool TableBlockStorage::checkAttr ( int  key_sz,
int  inf_sz,
int  inf_count,
int  block_num,
int  block_lim,
int  seek 
)

Использовать для проверки совпадения заголовков

Чтение заголовка таблицы

Проверяем заголовок на совпадение с нашими значениями

Используется в open().

bool TableBlockStorage::create ( const char *  name,
int  byte_sz,
int  inf_sz,
int  key_sz,
int  inf_count,
int  block_num,
int  block_lim,
int  seek 
)

Инициализация памяти

Запись заголовка таблицы

Поле счетчика записей при создании служит флагом на используемость блока и на пустоту ячейки записи: EMPTY_BLOCK=(-5) - заполняются первые элементы каждого блока, если там другое значение, то этот блок используется, EMPTY_ELEM=(-1) - все остальные пустые записи

Цикл инициализирует все блоки в файле

Перекрестные ссылки EMPTY_BLOCK.

Используется в TableBlockStorage().

bool TableBlockStorage::delRow ( void *  key)

Удаление информации по ключу, фактически освобождения места не происходит, оно только помечается удаленным

При удалении счетчик перезаписей также увеличивается

void * TableBlockStorage::findKeyValue ( void *  key,
void *  val 
)

Поиск информации по ключу, при неудаче возвращается 0

TODO: можно убрать из параметров val, просто возвращать значение

Сравниваем ключи только если счетчик >= 0, т.е. запись существует

Получение текущего блока (для тестовой программы)

bool TableBlockStorage::open ( const char *  name,
int  byte_sz,
int  inf_sz,
int  key_sz,
int  inf_count,
int  block_num,
int  block_lim,
int  seek 
)
Аргументы:
inf_sz- размер поля информации,
key_sz- размер поля ключа,
inf_count- кол-во записей в одном блоке таблицы (размером inf_sz+key_sz +sizeof(int) на ключевое поле)
block_num- кол-во блоков (при этом кол-во записей во всей таблице = inf_count*block_num,
block_lim- число перезаписей на блок,
seek- отступ от начала файла (указывает место, где расположена таблица)

размер всей таблицы будет равен inf_count*block_num*(inf_sz+key_sz+sizeof(int)) + sizeof(StorageAttr), где последнее слагаемое - размер заголовка, размер можно получить, вызвав функцию getByteSize()

Если уже был открыт файл в переменной данного класса, он закрывается и открывается новый

Инициализация памяти

Поиск непустого блока, либо если все пустые, текущий устанавливается 0

Чтение в память из нужного блока

Перекрестные ссылки checkAttr().

Используется в TableBlockStorage().


Объявления и описания членов классов находятся в файлах: