Подписка обработчика на точку расширения Назад В начало Вперед

В обработчике точки расширения допускается любой код кроме доступа к БД. Это ограничение вызвано тем, что механизм точек расширения использован при реализации триггеров. Поэтому обработка точки расширения должна выполняться как можно быстрее. Если в точке расширения все-таки необходимо работать с БД, то этот код следует вынести из обработчика. Т.е. необходимо написать интерфейс, реализующий необходимую обработку, и вызвать его из обработчика точки расширения.

Подписка на точку расширения производится по следующиму синтаксису:

handler [ with replace ] <имя_обработчика> on extensionPoint <имя_точки_расширения>
  [ (<список_параметров>) ] [ [ <приоритет> ] ]
  [ action { <Action_код_на_языке_VIP> } ] [ rollback { <Rollback_код_на_языке_VIP> } ]

<имя_обработчика> - любой допустимый идентификатор Атлантиса.

Должено быть уникальным во ВСЕЙ системе!

<имя_точки_расширения> - произвольный идентификатор Атлантиса. Должен совпадать с прототипом.

<список_параметров> - контекст, для передачи в обработчик, синтаксис аналогичен синтаксису, используемому при описании процедур и функций. Должен совпадать с прототипом.

<приоритет> - целое число, задает приоритет при выполнении обработчиков одноименных событий. Меньшее число подразумевает больший приоритет. Внутри одного приоритета обработчики выполняются в произвольно порядке. При вызове откате обработки выполнение обработчиков с меньшим приоритетом не производится, для уже выполнившихся вызывается секция rollback. Максимальное значение приоритета 255, значение по умолчание 123.

<Action_код_на_языке_VIP> - любые операторы Атлантиса. Доступны параметры, глобальные и локальные переменные и глобальные костанты. Код должен возвращать true, если код отработал успешно и false если нужно "откатить" действие.

<Rollback_код_на_языке_VIP> - любые операторы Атлантиса. Секция rollback описывает действие, предназначенное для отката действий, произведенных в теле основного обработчика. Данная секция вызывается для всех успешно отработавших обработчиков данного сообщения, в порядке обратном прямому. Доступны параметры, глобальные и локальные переменные и глобальные костанты. Возвращаемое значение игнорируется!

Имеется зарегистрированная сервисная функция RecursionLevel.

Пример 3

var global : longInt;

extensionPoint xxx2( a : integer; b : longInt);

handler zz on extensionPoint xxx2( a : integer; b : longInt)[99]
action
{
 var i : longInt;
 i := b;
 global := global + 1;
 Message('global zz ' + global);
 Message('action zz xxx2 ' + a + ' ' + b + ' ' + i);
 result := true;
}
rollback
{
 Message('rollback zz xxx2 ' + a + ' ' + b );
}

handler aa on extensionPoint xxx2(a : integer; b : longint)[100]
action
{
 var i : longInt;
 i := b;
 global := global + 1;
 Message('global aa ' + global);
 Message('action aa xxx2 ' + a + ' ' + b + ' ' + i);
 result := true;
}
rollback
{
 Message('rollback aa xxx2 ' + a + ' ' + b);
}

interface test;

handleEvent
cmInit:
{
 Message(xxx2(1,2));
}

end;

end.

Оглавление раздела

Функция RecursionLevel