Эта страница была перенесена на
altlinux.org. Текст на freesource.info заморожен.
Система нативных бакендов в Alterator
Напомню что основной транспортной магистралью alterator является шина Woobus, по которой перемещаются команды Woo в стандартном формате
Проходя по шине команды преобразуются и в конце-концов попадают в модуль –
Ensign, который передаёт их на обработку самым низкоуровневым модулям –
бакендам.
Note: ознакомьтесь ограничениями на имена бакендов и передаваемые атрибуты
Бакенды бывают двух видов –
внешние и
нативные. Первые создаются на произвольном языке программирования, вторые пишутся на
Scheme, но зато получают все бонусы от существования в родной среде. Внешние бакенды описываются в отдельной статье, здесь речь пойдёт о нативных бакендах.
Нативные бакенды располагаются в каталоге
/usr/lib/alterator/backend2. Имя бакенда должно совпадать с именем корневого объекта (до первого '/') в передаваемой woo-команде. Так, например, для обработки команды
(foo/bar/baz action “read”) будет вызван бакенд с именем foo.
Каждый бакент есть
объект. При поступлении очередной команды, обрабатывается её аттрибут action и вызывается одноименный метод объекта.
В случае отсуствия данного метода производится попытка вызова самого объекта, и, если тот не вернул ничего осмысленного, то считается, что бакенд не обслуживает данный вид операций.
При вызове метода или самого объекта передаются следующие параметры:
- self – сам объект
- objects – список из объектов команды
- options – ассоциативный список из параметров команды.
Например, для команды (/foo/bar/baz action “read” arg1 “value1” arg2 “value2”), objects полагается равным (bar baz), а ассоциативный список параметров выглядит как
( (action . “read”) (arg1 . “value1”) (arg2 . “value2”) ) .
Возвращаемые значения
Каждый вызов бакенда должен вернуть одно из следующих возможных значений:
- пустой ответ – ему соотвествует пустой список '()
- ошибка – двухэлементный список, начинающийся с символа error. Второй элемент списка – текстовая строка, с объяснением причин ошибки. Например, '(error “some reason”). В этом случае ответ автоматически преобразуется в форму (/error/исходный-объект reason «причина»)
- заранее подготовленный ответ – список, начинающийся с символа quote. Хвост списка – готовая woo-команда, например '(quote /foo/bar/baz anwer “good”)
- перечиление параметров – простой список параметров, например '(arg1 “value1” arg2 “value2”). Из предыдущего ясно что этот список не стоит начинать с параметра по имени quote или error – это не очень сильное ограничение. Данное перечисление автоматически преобразуется в woo-команду (исходный-объект параметры).
- перечисление объектов – список из списков, каждый вложенный список начинается с имени объекта и далее следуют параметры этого объекта. Данное перечисление автоматически преобразуется в список woo-команд, каждая из-которых будет выглядеть как (исходный-объект/объект параметры).
Все остальные значения считаются ошибочными о чём и будет сообщено в обратной woo-командe.
Возможно такие правила покажутся несколько странными, но так было когда-то сделано из наилучших пожеланий – избавить автора нативного бакенда от детального составления woo-ответов.
Примеры бакендов
Самый простой бакенд состоит из одной единственной функции, самостоятельно разбирающейся с тем какое именно действие стоит выполнить.
При вызове он всегда будет возращать ошибку.
Другая крайность – бакенд, который обрабатывает только определённые виды action.
Этот бакенд при вызове '(/foo action “read”) вернёт '(/foo arg1 “value1” arg2 “value2”), а при вызове '(/foo action “list”), вернёт команды (/foo/obj1), (/foo/obj2) и (/foo/obj3 arg3 “value3”) .
Золотая середина – бакенд, который обрабатывает несколько конкретных действий, и кроме того способен делать дополнительную обработку оставшихся действий.
Этот бакенд при вызове '(/foo action “read”) вернёт '(/foo arg1 “value1” arg2 “value2”), а при вызове '(/foo action “other”) вернёт ошибку '(/error/foo reason “I don't know”).