Смекни!
smekni.com

Объектно-ориентированная СУБД прототип (стр. 5 из 12)

2.5 Триггеры. Ограничение доступа

В множество поведений любого объекта можно включить два списка с предопределенными именами «PRE_TRIGGERS» и «POST_TRIGGERS». Список PRE_TRIGGERS содержит объекты, обрабатывающие входящее сообщение. Как правило, это объекты-условия. Такой подход называется фильтрацией [20]. Список POST_TRIGGERS содержит объекты, которые проверяют результат воздействия и могут произвести откат. POST_TRIGGERS вызываются по окончании действия транзакции при выполнении операции удаления транзакционных зависимостей.

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

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

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

Впрочем, тема безопасности заслуживает отдельного рассмотрения. Как, например, в [9] и [18].


2.6 Действие (knowhow)

Действие представляет собой объект типа “строка”, хранящий текст ДССП-процедуры. Ссылка на действие может хранится в поле OBJKH объекта, через который и происходит вызов действия. Алгоритм выбора выполняемого действия рассматривается ниже. В интерфейсах объектов указаны идентификаторы объектов, которые в поле OBJKH хранят идентификатор действия. Значения этих объектов являются именем действия. Наиболее удобно использовать для этой цели строковые объекты. Использова­ние поля OBJKH позволяет выполнять одно и то же действие для различных методов различных объектов.

При вызове действия с идентификатором OIDKH делается вызов слова с именем kh$<OIDKH>. Например, для объекта с OIDKH=0x00000DFC это будет KH$00000DFC. Если возникает ситуация EXERR, значит слово в словаре отсутствует и подлежит компиляции. Для компиляции текст действия дополняется префиксом “: KH$<oid> ” и суффиксом “ ;”, после чего компилируется командой TEXEC и выполняется. Словарь действий называется $KH_VOC.

При изменении текста метода необходимо полностью очистить словарь ДССП $KH_VOC, хранящий откомпилированные действия, поскольку эти действия содержат в своем коде абсолютные ссылки на прежнюю откомпилированную версию действия. Впрочем, эта процедура очистки словаря выполняется лишь при переопределении текста действия, что бывает достаточно редко.

2.7 Объекты-поведения

В отсутствии классов, хранить методы в каждом объекте было бы слишком накладно. Вынесение правил поведения в отдельный объект позволяет уменьшить затраты на хранение объектов-данных. Математическая модель ООБД в [17], также разделяет дан­ные и поведения, что дополнительно дает возможность переиспользовать поведение дру­гого объекта.

Объект-поведение представляет собой множество объектов-методов, которое и назы­ва­ется интерфейсом объекта.

При посылке на вход произвольного объекта OID2 сообщения OID1 (которое тоже является объектом), сначала проверяется, содержится ли OID1в интерфейсе объекта OID2 (проверка идентичности). Если да, то выполняется действие объекта OID1, иначе сравниваются значения OID1и объектов интерфейса (проверка эквивалентности). Если соответствие найдено, выполняется действие, указанное в найденном в интерфейсе объекте.

2.8 Принципы взаимодействия объектов

Есть два основных способа управления объектами:

· Посылка сообщений

· Алгебра объектов

·

Определения операций Select и Pickup алгебры объектов можно найти в [17]. Здесь оно не рассматривается по той причине, что является надстройкой над управлением посылкой сообщений и описывается через механизм посылки сообщений. То есть операции алгебры объектов могут быть заданы через операции посылки сообщений, без исправления структуры СУБД. Полная алгебра объектов является замкнутой и состоит из следующих операций: Select s, Pickup d, Apply r, Expression Apply l, Project p, Combine c, Union È, Interselect Ç, Subtract -, Collapse v, Assimilate a. Объектная алгебра более выразительна, чем реляционная, поскольку поддерживает полиморфность. Оператор Select, например, может работать с любыми видами операндов, а не только с множествами.

Согласно [17], любое сообщение в системе является объектом. Любой объект может иметь связанное с ним действие (knowhow), или не иметь его.

Алгоритм определения метода для выполнения

При посылке объекта проверяется, находится ли идентификатор объекта-сооб­ще­ния в интерфейсе объекта-получателя. Если да, то выполняется knowhow, связанное с этим идентификатором. Если нет – проверяется, совпадает ли значение объекта-сооб­щения со значением какого-либо метода из интерфейса объекта-получателя. Если да, то выполняется связанное с этим методом действие. Иначе возвращается объект fail.

Параметры методов

Набор_параметров (Blackboard) представляет собой множество меток, аргумент­ных пар { (L1, arg1), … , (Ln, argn) }. LiÎA, argiÎOдля 1 £ i £ n и "i, j Î 1,…,n : i ¹ j Þ Li¹ Li.

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

Синтаксис посылки сообщения

Воздействие(Набор_параметров) ~> Получатель. Объект, называемый Воздействие (Invoker), является сообщением (message) и посылается к другому объекту, названному Получателем (Reciver), используя Набор_параметров, предоставляющий необходимые аргументы. Если параметры в Наборе_параметров отсутствуют, то можно записать короче: Воздействие ~>Получатель. Посланное сообщение всегда возвращает объект, называемый Результат (Result).

Посылка простого сообщения

Пусть B – Набор_параметров и mи r – два объекта в O.

Примитивные взаимодействия

(1) m(B) ~>failºfail; fail(B) ~>rºfail;

(2) m(B) ~>nullºnull; null(B) ~>rºnull;

(когда m¹ fail)

(3) m(B) ~>sameºsame; same(B) ~>rºr;

(когда m¹ fail и m¹ null)

При совпадении идентификатора

(4) Если существует метод x из r такой, что xºm и sig(x) = (A1,c1) ´ …´ (An,cn)® crи {(A1,a1) ´ …´ (An,an)} ÍBи FID каждого поля сi присутствует в ai (в терминах ОО-програм­мирования: ciявляется предком по значению для ai), тогда

m(B) ~>rºr.kh(x)(A1 : a1, … , An : an )

иначе проверяется совпадение значения.

При совпадении значения

(5) Если существует метод x в r или его объектах-учителях (объектов, от которых наследуется поведение)такой, что x»m и sig(x) = (A1,c1) ´ …´ (An,cn)® crи {(A1,a1) ´ …´
´ (An,an)}ÍBи FID каждого поля сi присутствует в ai, тогда

m(B) ~>rºr.kh(x)(A1 : a1, … , An : an )

иначе

(6) Если r является атомарным, то m(B) ~>rºfail.

Иначе m(B) ~>r является комплексным сообщением (complex message sending), обладает сложной структурой.

Комплексные сообщения

Если Воздействие является объектом-агрегатом, то

s(B) ~>oºnull, если s=[ ]

s(B) ~>oº [A1 : s1(B) ~>o1, …, An : sn(B) ~>on], если s=[A1 : s1, …, An : sn]

где oj » o, ojнеº o) и orf(oi) Ç orf(o) = Æдля j = 1,..,n и для любого i, j Î [1,..,n], если i ¹ j тогда ojнеº o и orf(oi) Ç orf(oj) = Æ (т.е. o1,…,onявляются глубокими копиями объекта-получателя o).

Если Воздействие является объектом-условием, то

s(B) ~>oºs.then(B) ~>o,если s.if(B) Ï {False, fail}

s(B) ~>oºs.else(B) ~>o,иначе.

Где s.if, s.then, s.elseобозначение if-части, then-части и else-части sсоответственно.

Если Воздействие является объектом-множеством, то

s(B) ~>oºnull, если s={ }

s(B) ~>oºs1(B) ~>o, если s={s1}

s(B) ~>oºs’(B) ~>o, s’= s – {x} после x(B) ~>o

где x – произвольно выбранный элемент из множества s.

Если Воздействие является объектом-списком, то

s(B) ~>oºnull, если s=( )

s(B) ~>oºsn(B) ~>(…~>( s2(B) ~>( s1(B) ~>o))…) где s = (s1, s2, …, sn)

Семантика дробящейся посылки

Пусть B– Набор_параметров и пусть s, oÎO. Тогда оператор дробящейся посылки, обозначаемый ~1>определяется следующим образом:

Таблица 1: Семантика дробящейся посылки

Условие S(B) ~1>oº
s(B) ~>o неºfail s(B) ~>o
AGG(o) & o = [A1 : o1, …, An : on] [A1 : s(B) ~>o1, …, An : s(B) ~>on]
BIO(o) & o.ifнеº null s(B) ~>o.then
BIO(o) & o.ifº null s(B) ~>o.else
SET(o) & o = {o1,…,on} {s(B) ~>o1, …, s(B) ~>on}
SEQ(o) & o = (o1,…,on) (s(B) ~>o1, …, s(B) ~>on)
Иначе Fail

2.9 Транзакции и механизм согласованного управления

Согласованное управление является важным аспектом управления транзакциями в СУБД. В обычных базах данных, транзакции являются независимыми атомарными воздействиями, которые выполняются изолированно, в том числе от результатов выполнения других транзакций. Однако, для повышения производительности, для не­ко­торых транзакций составляется расписание выполнения. Механизм согласованного управления обеспечивает корректное выполнение этого множества транзакций, в том числе продолжительных.