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