Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Диплом К

.pdf
Скачиваний:
14
Добавлен:
23.03.2016
Размер:
1.22 Mб
Скачать

Табл. 2. Список регистрируемых классом dsFile ошибок

Код ошибки

Описание ошибки

 

 

dsOK

Нет ошибки (O'кей)

 

 

dsCACHE_daError

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

 

кэш–памяти

 

 

dsCACHE_ErrorRead

Ошибка чтения из файла

 

 

dsCACHE_ErrorSeek

Ошибка позиционирования по файлу

 

 

dsCACHE_ErrorWrite

Ошибка записи в файл

 

 

dsCACHE_InvalidUserId

Неверный идентификатор пользователя

 

кэша

 

 

dsCACHE_NoMemory

Кэшу недостаточно памяти

 

 

dsFILE_FileEmpty

Файл пуст

 

 

dsFILE_FileNotClose

Файл не закрыт

 

 

dsFILE_InvalidHead

Неверный заголовок DS-файла

 

 

dsFILE_InvalidSeekMode

Неверный код позиционирования

 

 

dsFILE_NoMemory

Недостаточно памяти для буфера сжатия

 

записей

 

 

dsFILE_NotDSFile

Файл не является DS–файлом

 

 

dsFILE_NotFirstSPN

Задан ВСН, не являющийся ВСН'ом голов-

 

ной страницы

 

 

dsFILE_OtherVersion

Неверная версия DS–файла

 

 

dsFILE_TooManySizeRecord

Размер записи слишком большой

 

 

dsFPL_daError

Недостаточно памяти для кэша ВСН'ов

 

ССС

 

 

dsFPL_ErrReadHead

Ошибка чтения нулевой страницы

 

 

dsFPL_InvalidChain

Неверные ссылки в ССС

 

 

dsFPL_InvalidFirstPage

Некорректная первая страница из ССС

 

 

dsFPL_InvalidHead

Некорректный заголовок ССС

 

 

dsFPL_InvalidLastPage

Некорректная последняя страница ССС

 

 

Код ошибки

Описание ошибки

 

 

dsPAGE_ErrCreate

Ошибка создания файла

 

 

dsPAGE_ErrCreateUndoFile

Ошибка создания файла отката

 

 

dsPAGE_ErrFName

Неверное имя файла

 

 

dsPAGE_ErrOpen

Ошибка при открытии файла

 

 

dsPAGE_ErrorTransaction

Ошибка при транзакции

 

 

dsPAGE_ErrorUndo

Ошибка отката транзакции

 

 

dsPAGE_InvalidFile

Некорректный размер страницы в заголовке

 

DS–файла

 

 

dsPAGE_InvalidPart

Внутренняя ошибка класса dsPage

 

 

dsPAGE_NoMemory

Недостаточно памяти

 

 

dsPAGE_NotPageDS

Некорректный заголовок страницы

 

 

dsPAGE_OutOfRange

ВСН страницы больше числа страниц в

 

файле

 

 

dsPOOL_NoMemory

Недостаточно памяти под пул ВСН'ов

 

 

dsRECORD_InvalidChain

Некорректный список в записи

 

 

dsRECORD_InvalidChainSPN

Некорректный ВСН в списке записи

 

 

dsRECORD_InvalidDest

Внутренняя ошибка класса dsRecord

 

 

dsRECORD_InvalidPrevLast

Неверные ссылки назад–вперед в записи

 

 

dsRECORD_NoMemory

Недостаточно памяти для считывания запи-

 

си

 

 

dsRECORD_NotFirstSPN

Некорректный ВСН записи (ВСН не голов-

 

ной страницы)

 

 

dsRECORD_SmallBufferForRead

Заданный буфер для чтения записи слиш-

 

ком мал

 

 

3.4. Файл индексов

3.4.1. Введение Для начала следует дать необходимые определения.

Файл индексов (BT–файл) – файл данных, содержащий один или несколько индек-

сов и их каталог для доступа к отдельным индексам.

Индекс – логическая организация данных определенного формата (пара ключ– значение), обеспечивающая возможность быстрого поиска списка значений по ключу, а

также возможность поиска конкретной пары ключ–значение.

3.4.2. Выбор структуры индекса Основное предназначение разрабатываемого файла индексов – быстрый поиск

ключа в дереве. В литературе (например, [3]) подробно описаны несколько вариантов решения этой задачи, например B-дерево и В+дерево. Как В-, так и В+дерево предна-

значены для хранения ключей, как правило, фиксированной длины.

Вид B-дерева показан на рис. 15. Каждый прямоугольник представляет собой страницу дерева. Видно, что при наличии N элементов на странице имеется (N+1) ссыл-

ка, выходящая с этой страницы. B-дерево содержит некоторое множество ключей, но не все ключи присутствуют на листьях дерева, часть ключей присутствует также на про-

межуточных его узлах.

 

 

 

Ê î ðåí ü

 

 

 

 

 

 

25

 

 

 

 

10 20

 

 

 

30 40

 

2 5 7 8

13 14 15 18

22 24

26

27 82

32 35 38

41 42 45 46

Рис. 15. B-дерево порядка 2.

В отличие от B-дерева, В+дерево имеет на листьях все множество ключей, поме-

щенных в дерево. При этом некоторые ключи дублируются на промежуточных узлах дерева.

3.4.3. Особенности реализации

BT–файл реализован на базе DS–файла. Узел дерева индекса в ВТ–файле далее называется блоком. Различаются блоки данных и управляющие блоки. Блоки данных являются листьями дерева, а управляющие блоки – промежуточными его узлами.

Основным отличием разработанного ВТ–файла от классического В+дерева явля-

ется то, что в дереве могут храниться ключи переменной длины. Следовательно, при фиксированном размере блока на каждом блоке может быть разное количество ключей.

Кроме того, каждый управляющий блок дерева имеет ссылки на блоки нижнего уровня.

Причем ссылка на блок является атрибутом ключа – сколько ключей в блоке, столько и ссылок. Чтобы привести дерево к каноническому виду (N ключей и N+1 ссылка) на каждый блок вводится специальный нулевой ключ, то есть ключ, имеющий минималь-

ное значение из всех возможных. Сравнительный вид классического промежуточного узла дерева и управляющего блока приведен на рис. 16.

 

К лассический

 

 

 

 

Уп равляю щ ий

 

 

 

узел дерева

 

 

 

 

 

áëî ê ÂÒ– ô àéëà

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

20

30

 

40

 

0

10

20

30

40

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 16. Сравнение блоков В+дерева и ВТ–файла

Видно, что при таком подходе упрощается реализация (так как не надо отдельно обрабатывать самую левую ссылку из блока – она отрабатывается наряду со всеми), но увеличиваются накладные расходы за счет присутствия на каждом управляющем блоке дерева нулевого ключа.

Каждый отдельный блок В+дерева является записью в DS–файле. Также отдель-

ной записью хранится каталог всех индексов, содержащихся в BT–файле. Номер записи,

содержащей каталог индексов, сохраняется на нулевой странице DS–файла.

В блоках данных В+деревьев совмещено хранение ключей и списков значений произвольной длины к этим ключам (инвертированных списков), что ускоряет поиск пары ключ–значение. Кроме того, блоки деревьев (блоки данных или листья) прошиты

сквозными ссылками, образующими двусвязный список, что ускоряет перемещение вперед–назад по ключами дерева.

Каждый блок дерева представляет собой список ключей переменной длины (В

частном случае длина ключа может быть и постоянной величиной). При переменной длине ключа уже невозможно находить нужный ключ в блоке бинарным поиском, по-

этому поиск ключа в блоке осуществляется последовательным перебором. Исходя из этого, использовать ключи переменной длины следует только там, где это действитель-

но необходимо, например при индексировании естественно-языковых текстов.

При выполнении поиска по одному или нескольким индексам BT–файла формиру-

ется результат поиска. Он представляет собой список значений какого-либо ключа или множества ключей, разбитый на блоки (если список не помещается в один блок), свя-

занные в двусвязный список, который хранится как записи в дополнительном DS-файле.

Этот временный файл создается с появлением первого результата поиска, и удаляется после удаления последнего, а хранит он блоки от всех созданных за время работы про-

граммы результатов поиска.

Приняты меры по максимальному использованию оперативной памяти при вы-

полнении операций в ВТ–файле и работе с результатом поиска. Они включают в себя текущий путь в дереве и стек открытых деревьев. Подробнее эти структуры описаны в следующем разделе.

3.4.4. Структуры данных В данном разделе подобно рассматриваются структуры данных, образующие ВТ–

файл. К ним относятся: базовый блок дерева, на основе которого строятся все остальные блоки (далее обозначается как btBlock); блок данных (далее обозначается как btResBlock); управляющий блок (далее обозначается как btCtrlBlock). Под деревом здесь и далее понимается В+дерево с модификациями, описанными выше.

3.4.4.1. Общая структура дерева

Общая структура дерева представлена на рис. 17. При создании дерево сразу со-

здается двухуровневым, как показано на рис. 18. (Нулем обозначен нулевой ключ).

btCtrlBlock (корневой)

btCtrlBlock

btCtrlBlock

...........................

btCtrlBlock

 

 

btResBlock

btResBlock

btResBlock

btResBlock

.....................

btResBlock

 

Рис. 17. Общая структура дерева

btCtrlBlock (ко рен ь дерева) 0

btResBlock

0

Рис. 18. Структура дерева сразу после создания

3.4.4.2. Базовый блок дерева

Базовый блок – это список элементов переменной длины. В состав элемента вхо-

дит ключ (постоянной или переменной длины) и список значений этого ключа (пере-

менной длины). Структура элемента представлена на рис. и . В частном случае уни-

кальных ключей фиксированной длины структура элемента блока сильно упрощается и выглядит так, как показано на рис. 20.

Ниже описаны все поля элемента.

 

Äëèí à êëþ ÷à

2 байта

 

 

3 байта

 

 

 

 

 

 

 

 

 

1 áàéò

 

 

 

 

 

1 áèò

23 áèò

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Äëèí à

Ê ëþ ÷

Счетчик

Ï

ðèçí àê

Ññû ëêà–

 

êëþ ÷à

 

 

êëþ ÷à

ÂÑÍ áëî êà

 

 

 

 

 

(0)

 

 

 

 

 

 

 

 

Рис. 19а. Структура элемента базового блока (вариант 1)

 

Äëèí à êëþ ÷à

2 байта

 

 

 

 

2 байта

 

 

 

 

 

Äëèí à ñï èñêà

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 áàéò

 

 

 

 

 

1 áèò

 

1 áèò

1 áèò

13 áèò

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Äëèí à

Ê ëþ ÷

 

Счетчик

Ï

ðèçí àê

 

Åñòü

 

Åñòü

 

 

Äëèí à

Çí à÷åí èå

...

Çí à÷åí èå

 

êëþ ÷à

 

 

êëþ ÷à

ï ðåäû äóù .

 

следую щ .?

ñï èñêà

 

 

 

 

 

(1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 19б. Структура элемента базового блока (вариант 2)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Äëèí à

 

 

 

 

 

 

 

 

 

 

 

Äëèí à êëþ ÷à

 

çí à÷åí èÿ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 áàéò

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Äëèí à

 

Ê ëþ ÷

Çí à÷åí èå

 

 

 

 

 

 

 

 

 

 

 

êëþ ÷à

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 20. Элемент в случае уникальных ключей фиксированной длины

Длина ключа – длина ключа, включая и байт длины (если ключ фиксированной длины, то этого поля нет).

Ключ – ключ элемента (формат зависит от типа)

Счетчик ключа – Общее число значений при ключе во всем дереве. Достоверное значение находится только на самом верхнем уровне появления ключа.

Признак – бит, указывающий какая информация следует дальше: 0 – будет ссылка

(ВСН) на блок нижнего уровня; 1 – будет список значений.

Ссылка – ВСН блока следующего уровня.

Длина списка – Длина списка значений при ключе в данном элементе в байтах.

Есть след.? и Есть пред.? – биты, используемые только в блоке данных. Они пока-

зывают, есть ли еще блоки со значениями этого ключа (подробнее см. раздел 3.4.4.3.)

Значение – Значение при ключе. Для управляющего блока значение имеет формат,

показанный на рис. 21. Для блока данных – это искомое значение при ключе. Размер значения (как и ключа в случае фиксированной длины ключа) задается при создании дерева.

Äëèí à çí à÷åí èÿ 24 бита (3 байта)

 

 

 

Ï åðâî å

Ññû ëêà (ÂÑÍ )

çí à÷åí èå í à

 

со о тветствую щ его

áëî êå äàí í û õ

áëî êà äàí í û õ

 

 

 

Рис. 21. Структура значения при ключе в управляющем блоке

Для базового блока поддерживаются различные форматы как ключа, так и значе-

ния. Форматы ключей и значений в блоках дерева задаются при создании дерева. Реали-

зован ряд готовых форматов: целое число, строка текста переменной или постоянной длины, дата, время, деньги, телефон. Для задания нестандартных форматов клю-

чей/значений требуется наличие пользовательской функции их сравнения.

Размещение элементов при добавлении производится в порядке возрастания клю-

чей этих элементов. Значения в списке значений элементов также располагаются в по-

рядке возрастания. Это позволяет проводить бинарный поиск в списке значений (при фиксированной длине значения).

3.4.4.3. Блок данных

Предназначен для хранения списка значений. Является листом дерева (не имеет ссылок на другие блоки). Полный список как ключей, так и значений хранится именно в блоках данных. Блок данных состоит из заголовка и списка элементов. Структура заго-

ловка блока данных представлена на рис. 22. Поля заголовка блока описаны ниже.

Структура элементов списка показана на рис. . Поля элементов списка описаны в разде-

ле 3.4.4.2..

 

 

8 áàéò

 

1 áàéò

1 áàéò

3 байта

3 байта

Í î ì åð

Óðî âåí ü

Ññû ëêà (ÂÑÍ ) í à

Ññû ëêà (ÂÑÍ ) í à

дерева

в дереве

следую щ ий бло к

ï ðåäû äóù èé áëî ê

Рис. 22. Структура заголовка блока данных

Номер дерева – порядковый номер индекса, к которому относится данный блок

Уровень в дереве – номер уровня в дерева. Уровни дерева нумеруются снизу вверх, так что блоки данных всегда имеют номер 0. Данное поле вводится для единства формата заголовка с управляющим блоком.

Ссылка на следующий блок и ссылка на предыдущий блок предназначены для формирования двунаправленного списка блоков данных. Наличие такого списка суще-

ственно ускоряет процедуры перемещения по соседним ключам/значениям за счет ис-

ключения необходимости обращения к управляющим блокам. Если список значений для некоторого ключа не помещается на один блок данных, то биты Есть след.? и Есть пред.? показывают, есть ли соответственно перед и после этого блока данных еще блок или блоки со значениями этого же ключа. Пример списка значений, размещенного на трех блоках данных, приведен на рис 23. На рисунке разной штриховкой показаны списки значений, относящиеся к разным ключам.

 

Åñòü ñëåä?

 

 

 

0

1

1

0

0

0

0

1

1

0

Åñòü ï ðåä?

Рис. 23. Пример длинного списка значений

3.4.4.4. Управляющий блок

Предназначен для хранения ключей и, возможно, некоторых значений при них.

Управляющий блок состоит из заголовка и списка элементов. Структура заголовка бло-

ка данных представлена на рис. 24. Поля заголовка блока совпадают с полями блока данных и описаны в разделе 3.4.4.3. Структура элементов списка показана на рис. и .

Поля элементов списка описаны в разделе 3.4.4.2.

2 байта

1 áàéò

1 áàéò

Í î ì åð

Óðî âåí ü

дерева

в дереве

Рис. 24. Структура заголовка управляющего данных

3.4.5. Иерархия классов В соответствии с технологией объектно-ориентированного программирования для

реализации разрабатываемого ВТ–файла была построена иерархия классов, представ-

ленная на рис. 25. Каждый класс охватывает определенную область реализации BT–

файла. Ниже кратко описаны функции каждого класса. Подробное описание классов верхнего уровня (btFile, btFind) дано в следующем разделе.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btFile

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btCatalog

 

 

 

 

 

 

 

 

 

 

 

 

 

dsFile

 

 

 

 

 

 

 

btFind

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btTreeStack

 

 

 

 

 

 

 

 

btTree

 

 

 

 

 

 

 

 

 

 

 

 

 

btTreeRes

 

 

dsFile

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btTreeRes

 

 

btTreePath

 

 

 

 

 

 

 

 

 

 

btResBlock

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btResBlock

 

 

 

btCtrlBlock

 

 

 

btResBlock

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btBlock

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Н аследо ван ие

 

 

btBlock

 

 

 

 

btBlock

 

 

 

 

 

btBlock

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

È ñï î ëüçî âàí èå

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 25. Иерархия классов ВТ–файла

3.4.5.1. Класс btBlock

Данный класс реализует управление базовым блоком дерева. Формат базового блока описан в разделе 3.4.4.2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]