Alterator/module/backend: различия между версиями
(Import from freesource.info) |
Нет описания правки |
||
Строка 1: | Строка 1: | ||
[[Category:Sisyphus]] | [[Category:Sisyphus]] | ||
=== Бакенд === | === Бакенд === | ||
Строка 44: | Строка 43: | ||
message_loop</pre> | message_loop</pre> | ||
В данном примере: | В данном примере: | ||
*'''message_loop''' -- запуск цикла обработки событий | |||
*'''on_message''' -- обработчик входящих сообщний. Входные переменные выглядят как переменные ''$in_<имя>''. Выходные печатаются при помощи функций ''write_*'' . | |||
*'''alterator_api_version''' - текущая версия API для взаимодействия с alterator. | |||
Если к к бакенду <name> обращались из интерфейса по адресу ''/<name>/foo/bar'', то переменная ''$in__objects'' будет равна "foo/bar" (то есть "хвост" адреса), если обращались по адресу ''/<name>'', то ''$in__objects'' будет равна "/". | |||
Более подробная информация по написанию бакендов на shell находится [[Alterator/shell|здесь]]. | |||
==== Простейший бакенд на perl ==== | ==== Простейший бакенд на perl ==== | ||
Пример аналогичного бакенда на perl | Пример аналогичного бакенда на perl: | ||
<pre>#!/usr/bin/perl -w | <pre>#!/usr/bin/perl -w | ||
use strict; | use strict; | ||
Строка 74: | Строка 80: | ||
message_loop(\&on_message);</pre> | message_loop(\&on_message);</pre> | ||
Здесь, как ив shell-бакенде | Здесь, как ив shell-бакенде: | ||
*'''message_loop''' -- запуск цикла обработки событий | |||
*'''on_message''' -- обработчик входящих сообщений. | |||
Обработчику передается ссылка на хэш с входными перемеными. Выходные печатаются при помощи функций ''write_*'' . | |||
При обращении из интерфейса по адресу ''/<name>/foo/bar'', то в бакенде <name> в этом хэше будет присутствовать //_objects// равный "foo/bar" (то есть "хвост" адреса), если обращались по адресу ''/<name>'', то //_objects// равно "/". | |||
Более подробная информация по написанию бакендов на perl находится [[Alterator/perl|здесь]]. |
Версия от 17:41, 30 июля 2008
Бакенд
Существует два вида бакендов: нативные и внешние. Размещаются эти бакенды в каталогах /usr/lib/alterator/backend2 и /usr/lib/alterator/backend3 соответственно.
Нативные бакенды пишутся только на языке scheme и работают внутри процесса alterator. Написание нативных бакендов требует достаточно большого опыта программирования и большой аккуратности.
Внешний бакенд может быть написан на произвольном языке програмирования, при этом настоятельно рекомендуется использовать готовые библиотеки, предоставляющие API для взаимодействия с alterator. Все библиотеки построены по одному и тому же принципу - есть главный цикл взаимодействующий с alterator и есть функция-обработчик пришедших сообщений. В функции обработчике:
- анализируется вид запроса (параметр action)
- анализируется url запроса, а также значения входных параметров
- вычисляются и выводятся значения выходных параметров.
Простейший бакенд на shell
Пример простейшего бакенда на shell:
#!/bin/sh -f po_domain="alterator-foo" api_version=1 . alterator-sh-functions on_message() { case "$in_action" in list) write_enum_item "item1" "label1" write_enum_item "item2" "label2" ;; read) case "$in__objects" in url1) write_string_param param1 "value1";; url2) write_bool_param param2 "yes";; esac ;; write) [ -n "$in_param1" ] && echo "$in_param1" >/tmp/file1 test_bool "$in_param2" && echo "yes">/tmp/file2 ;; esac } message_loop
В данном примере:
- message_loop -- запуск цикла обработки событий
- on_message -- обработчик входящих сообщний. Входные переменные выглядят как переменные $in_<имя>. Выходные печатаются при помощи функций write_* .
- alterator_api_version - текущая версия API для взаимодействия с alterator.
Если к к бакенду <name> обращались из интерфейса по адресу /<name>/foo/bar, то переменная $in__objects будет равна "foo/bar" (то есть "хвост" адреса), если обращались по адресу /<name>, то $in__objects будет равна "/".
Более подробная информация по написанию бакендов на shell находится здесь.
Простейший бакенд на perl
Пример аналогичного бакенда на perl:
#!/usr/bin/perl -w use strict; use Alterator::Backend3; $TEXTDOMAIN='alterator-foo'; $DEBUG = 1; sub on_message{ my message=shift; if ($message->{action} eq 'list'){ write_named_auto_list('item1', 'label', 'label1'); write_named_auto_list('item2', 'label', 'label2'); } elsif ($message->{action} eq 'read'){ write_string_param('param1', 'value1'); write_bool_param('param2', 'yes'); } elsif ($message->{action} eq 'write'){ print F1 $message->{param1} if (exists($message->{param1})); print F2 ($message->{param2} eq '#t')? 'yes':'no' if (exists($message->{param2})); } } message_loop(\&on_message);
Здесь, как ив shell-бакенде:
- message_loop -- запуск цикла обработки событий
- on_message -- обработчик входящих сообщений.
Обработчику передается ссылка на хэш с входными перемеными. Выходные печатаются при помощи функций write_* .
При обращении из интерфейса по адресу /<name>/foo/bar, то в бакенде <name> в этом хэше будет присутствовать //_objects// равный "foo/bar" (то есть "хвост" адреса), если обращались по адресу /<name>, то //_objects// равно "/".
Более подробная информация по написанию бакендов на perl находится здесь.