(Продолжение. Начало в №7-9, 11, 12, 13, 14, 15, 16, 17, 18, 19)
Сегодня мы расскажем о состояниях БД и переходах внутри комплекса БД.
Если попытаться найти аналог механизма сохранения состояний LeoBase среди обычных реляционных СУБД, то по назначению ближе всего к нему функция сохранения SQL-запроса, которая дает возможность неоднократно обращаться к результатам поиска. При этом, каждое такое обращение предполагает повторное выполнение сохраненного запроса. Качественное отличие механизма состояний состоит в том, что при его использовании сохраняется готовый результат, который используется сразу, без каких-либо предварительных операций.
Механизм сохранения состояний реализован специально для использованной в LeoBase концепции выделенных записей и позволяет быстро и эффективно, без создания дополнительных БД, сохранять и восстанавливать множества выделенных записей.
Состояние базы данных - это некоторые характеристики активной рабочей области, сохраненные в оперативной памяти или на диске под определенным именем. Напомним, рабочая область (РО) - образ БД в памяти, связываемый при открытии комплекса БД с каждой базой. Состояние - совокупность многих параметров РО: номер текущей записи, множество выделенных записей и порядок их следования, маркер выделенных записей и т.д.
После сохранения в базе данных может вестись разнообразная работа: выделение и отмена выделения записей, чтение других записей и т.д. После восстановления состояния текущей оказывается та же запись, что и была при сохранении состояния. Теми же остаются остальные компоненты, включенные в понятие "состояние РО", т. е. множество выделенных записей, порядок их следования, маркер выделенных записей и т. д. В одной БД может быть сохранено до 255 ее состояний. Состояние БД - понятие физическое, при работе оно сохраняется от сеанса к сеансу. В течение одного сеанса работы состояния БД, по возможности, хранятся в памяти.
Если с момента сохранения состояния РО была удалена запись, бывшая текущей при сохранении состояния, то при восстановлении этого состояния текущая запись не определена. Если с момента сохранения состояния РО была удалена какая-либо из записей, считавшихся выделенными, то при восстановлении этого состояния маркер выделенных записей становится неопределенным, а число выделенных записей - меньшим. Если с момента сохранения состояния РО была удалена какая-нибудь из выделенных при запоминании состояния записей, а затем добавлялись записи, то при восстановлении этого состояния возможна такая ситуация, при которой количество выделенных записей остается тем же, что и было при запоминании, а состав записей слегка изменяется. Среди выделенных записей будет присутствовать запись (или несколько записей), которой не было при выделении. Это происходит потому, что при добавлении, если в БД были удаленные записи, добавленная запись получает номер одной из удаленных.
Каждое состояние БД имеет свой ID, который однозначно идентифицирует это состояние и не меняется от сеанса к сеансу. ID состояния уникален в пределах конкретной РО. ID состояния не является его порядковым номером и не несет никакой дополнительной информации. ID состояния имеет свой тип Byte. В рабочей области может быть сохранено несколько состояний с произвольными ID. Иногда возникает необходимость просмотреть эти ID, чтобы, например, вывести список всех состояний в окно. Для этого есть функция выдачи количества состояний РО и функция выдачи ID состояния по его порядковому номеру.
LeoBase содержит состояния БД в системных файлах, к которым оно всегда может получить доступ. Прикладная же программа не имеет прямого доступа к этим файлам и работает с ними через ID состояний. Для конкретной прикладной программы иногда может потребоваться запись состояния БД: например, в файл конфигурации этой программы, где хранятся состояния многих РО и другие данные. Поэтому имеются две функции - записи и восстановления состояния из произвольного файла. В "ЮрИнформ", благодаря данной функции, каждый из пользователей одного комплекса имеет возможность сохранять собственный рабочий стол (расположение и содержание окон, открытых во время работы) в специальном файле и загружать его при новом сеансе работы.
В понятие состояния БД входит порядок следования выделенных записей. Для информации об этом СУБД содержит ряд внутренних структур, которые сохраняются в состоянии БД. Если выделенных записей много, то процесс сохранения и восстановления таких состояний может замедлиться. Если порядок следования выделенных записей для состояния БД не важен, то с помощью специальной процедуры есть возможность его уничтожить, ускорив таким образом сохранение и восстановление состояний.
LeoBase предоставляет разработчику элегантную возможность расширить понятие состояния БД, добавив в него свои данные, которые будут сохраняться в состоянии БД с дальнейшим восстановлением. Благодаря этому в "ЮрИнформ", в частности, в состоянии сохраняются координаты окон, записи, выделенные пользователем внутри списка (то есть, фактически, записи, выделенные внутри множества выделенных записей) и т.д. Для записи и чтения пользовательских данных из состояния активной БД имеется специальный триггер работы с состояниями БД.
При работе возникает необходимость переключаться между базами, т. е. менять активную РО. Переходы между РО могут осуществляться вне зависимости от реляционных ссылок, т. е. есть возможность перейти от активной РО к любой РО текущего комплекса, в том числе и не связанной путями с активной. При такой смене желательно было бы характеристики той РО, которая была активной, где-то сохранить. Для этого в LeoBase реализован стек возврата.
Рассмотрим знакомый комплекс БД. Пусть активна РО "Курсовой проект". После этого понадобилось просмотреть список кафедр, и активной стала РО "Кафедры". При этом автоматически загружается стек возврата. После того, как мы перейдем в БД "Студенты", стек возврата примет такой вид:
Теперь, если возникнет необходимость вернуться в РО "Кафедры" с восстановлением характеристик, которые были при переключении из нее, то после возвращения туда стек примет следующий вид:
Если после этого мы вернемся в РО "Курсовой проект", то стек возврата исчезнет.
Заметим, что активизацию РО "Курсовой проект" можно выполнить не только возвращением по стеку возврата, но и повторным вызовом этой БД. Если сделать это (в нашем примере - при активной РО "Студенты"), то к записям в стеке возврата добавятся характеристики РО "Студенты". Эта РО "перейдет" в состояние. Если после этого мы активизируем РО "Преподаватели", то в стеке возврата появится второе упоминание о РО "Курсовой проект", возможно, с другими характеристиками.
Для внутренних нужд LeoBase резервирует несколько РО. Они называются системными. Их структура и предназначение будут описаны в главе о журнале изменений.
Владимир КОТЛЯРОВ,
"СофтИнформ", тел. 213-28-13,
e-mail: [email protected]
Горячие темы