На этом шаге мы рассмотрим стандартные предикаты для В+ деревьев.
Новое В+ дерево создается с помощью предиката bt_create:
bt_create(Dbase,BtreeName,Btree_Sel,KeyLen,Order) % (i,i,o,i,i) bt_create(Dbase,BtreeName,Btree_Sel,KeyLen,Order,Duplicate) % (i,i,o,i,i,i)
Аргумент BtreeName определяет имя нового дерева. Это имя используется в дальнейшем в качестве аргумента для bt_open. Аргументы KeyLen и Order задаются в момент создания В+ дерева. После этого их изменять нельзя. Если вы вызываете bt_create/5 или bt_create/6 с аргументом Duplicates, установленным в 1, то в B+ дереве можно использовать повторяющиеся ключи. Если вы вызовите bt_create/6 с аргументом Duplicates, установленным в 0, то нельзя включать дублирующиеся ключи в В+ дерево.
Этот предикат открывает уже созданное В+ дерево, идентифицированное именем, данным в bt_create:
bt_open/3(Dbase,BtreeName,Btree_Sel) % (i,i,o)
В момент открытия или создания В+ дерева возвращается значение селектора В+ дерева Btree_Sel. Селектор В+ дерева принадлежит к предопределенному домену db_selector и указывает на В+ дерево, когда система выполняет операции поиска или позиционирования. Связь между именем В+ дерева и его селектором такая же, как связь между физическим именем файла и соответствующим ему символическим именем.
Вы можете открыть данное В+ дерево более чем один раз для выполнения нескольких одновременных просмотров. Всякий раз, когда В+ дерево открыто, устанавливается описатель, и каждый описатель соответствует своему внутреннему указателю В+ дерева.
Предикат bt_close используется для закрытия В+ дерева, a bt_delete - для его удаления:
bt_close(Dbase,Btree_Sel) % (i,i) bt_delete(Dbase,BtreeName) % (i,i)
Обращение к bt_close высвобождает внутренние буферы с именем BtreeName.
Предикат bt_copyselector выдает новый указатель на уже открытый селектор В+ дерева:
bt_copyselector(Dbase,OldBtree_sel,NewBtree_sel) % (i,i,o)
Новый селектор указывает на то же место В+ дерева, что и уже существующий. После создания оба селектора В+ дерева могут свободно перемещаться, не влияя друг на друга.
Предикат bt_statistics возвращает статистическую информацию для В+ дерева, указывает Btree_Sel:
bt_statistics(Dbase,Btree_Sel,NumKeys,
NumPages,Depth,Order,PgSize) % (i,i,o,o,o,o,o,o)
Аргументы предиката bt_statistics описаны в таблице 1.
Аргумент | Описание |
---|---|
Dbase | Селектор, определяющий базу данных |
Btree_Sel | Селектор В+ дерева |
NumKeys | Общее число ключей в В+ дереве Btree_Sel |
NumPages | Общее число страниц в В+ дереве |
Depth | Глубина В+ дерева |
KeyLen | Длина ключа |
Order | Порядок В+ дерева |
PgSize | Размер страницы (в байтах) |
Стандартные предикаты key_insert и key_delete используются для обновления В+ дерева:
key_insert(Dbase,Btree_Sel,Key,Ref) %(i,i,i,i) key_delete(Dbase,Btree_Sel,Key,Ref) % (i,i,i,i)
Задавая предикату key_delete оба аргумента: Key и Ref - можно удалить в В+ дереве определенный элемент с двойным ключом.
Каждое В+ дерево поддерживает внутренние указатели на свои узлы. Предикит key_first и key_last позволяют установить указатель на первый или последний узел в В+ дереве соответственно. Предикат key_search устанавливает указатель на данный ключ:
key_first(Dbase,Btree_Sel,Ref) % (i,i,o) key_last(Dbase,Btree_Sel,Ref) % (i,i,o) key_search(Dbase,Btree_Sel,Key,Ref) % (i,i,i,o) (i,i,i,i)
Предикат key_search завершается успешно, если ключ найден, в противном случае - неудачно, а внутренний указатель В+ дерева устанавливается на ключ, дующий после того, где должен был бы быть расположен ключ Key. Можно испозовать key_current, чтобы указать ключ и указатель базы данных на этот ключ. Если вы хотите указать на точную позицию в В+ дереве с двойными ключами, то можите предоставить Ref в качестве входного параметра.
Предикаты key_next и key_prev используются для перемещения указателя B+ дерева вперед или назад:
key_next(Dbase,Btree_Sel,NextRef) % (i,i,o) key_rev(Dbase,Btree_Sel,PrevRef) % (i,i,o)
Если указатель находится на одном из концов В+ дерева, то попытка передвинуть указатель далее завершится неудачно, а указатель В+ дерева будет работать так, как бы он был помещен на одну позицию вне дерева.
Предикат key_current возвращает ключ с указателем базы данных, соответствующей текущему положению указателя В+ дерева:
current(Dbase,Btree_Sel,Key,Ref) % (i,i,о,о)
Предикат key_current завершается неудачно после обращения к предикатам bt_open, bt_create, key_insert или key_delete, а также, если указатель находится первым (используется key_prev) или после последнего ключа (key_next).
На следующем шаге мы рассмотрим программирование внешних баз данных.