Диплом К
.pdfТабл. 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.