Версия:

Триггеры

Триггеры

Триггеры, которые также называют обратными вызовами, представляют собой функции, которые выполняет сервер при наступлении определенных событий.

There are four types of triggers in Tarantool:

У всех триггеров есть следующие особенности:

  • Triggers associate a function with an event. The request to «define a trigger» implies passing the trigger’s function to one of the «on_event()» functions:
  • Только пользователь „admin“ определяет триггеры.
  • Триггеры хранятся в памяти экземпляра Tarantool’а, а не в базе данных. Поэтому триггеры пропадают, когда экземпляр отключают. Чтобы сохранить их, поместите определения функции и настройки триггера в скрипт инициализации Tarantool’а.
  • Триггеры не приводят к высокой затрате ресурсов. Если триггер не определен, то затрата ресурсов минимальна: только разыменование указателя и проверка. Если триггер определен, то затрата ресурсов аналогична вызову функции.
  • Для одного события можно определить несколько триггеров. В таком случае триггеры выполняются в обратном порядке относительно того, как их определили.
  • Триггеры должны работать в контексте события. Однако результат не определен, если функция содержит запросы, которые при нормальных условиях не могут быть выполнены непосредственно после события, а только после возврата из события. Например, если указать os.exit() или box.rollback() в триггерной функции, запросы не будут выполняться в контексте события.
  • Триггеры можно заменять. Запрос на «замену триггера» подразумевает передачу новой триггерной функции и старой триггерной функции в одну из функций обработки событий «on_event()».
  • Во всех функциях обработки событий «on_event()» есть параметры, которые представляют собой указатели функции, и все они возвращают указатели функции. Следует запомнить, что определение Lua-функции, например, «function f() x = x + 1 end» совпадает с «f = function () x = x + 1 end» – в обоих случаях f получит указатель функции. А «trigger = box.session.on_connect(f)» – это то же самое, что «trigger = box.session.on_connect(function () x = x + 1 end)» – в обоих случаях trigger получит переданный указатель функции.

Чтобы получить список триггеров, можно использовать следующее:

  • on_connect() – без аргументов – чтобы вернуть таблицу со всеми триггерными функциями для обработки соединений;
  • on_auth(), чтобы вернуть все триггерные функции для обработки аутентификации;
  • on_disconnect(), чтобы вернуть все триггерные функции для обработки отключений;
  • on_replace(), чтобы вернуть все триггерные функции для обработки замены, сделанные для on_replace().
  • before_replace(), чтобы вернуть все триггерные функции для обработки замены, сделанные для before_replace().

Пример

Здесь мы записываем события подключения и отключения в журнал на сервере Tarantool’а.

log = require('log')

           function on_connect_impl()
             log.info("connected "..box.session.peer()..", sid "..box.session.id())
           end

           function on_disconnect_impl()
             log.info("disconnected, sid "..box.session.id())
           end

           function on_auth_impl(user)
             log.info("authenticated sid "..box.session.id().." as "..user)
           end

           function on_connect() pcall(on_connect_impl) end
           function on_disconnect() pcall(on_disconnect_impl) end
           function on_auth(user) pcall(on_auth_impl, user) end

           box.session.on_connect(on_connect)
           box.session.on_disconnect(on_disconnect)
           box.session.on_auth(on_auth)