lang: en | ru
MOD_ JDC
(JavaScript DataBase Communication)


Примеры
Одной из целей проекта является упрощение разработки сайтов, использующих AJAX. Обычно разработчику требуется придумать некоторый набор правил, по которым будет происходить обмен данными между браузером и сервером, и реализовать приложения с обеих сторон, работающих по данным правилам.
MOD_JDC способен автоматизировать работу серверной части такого сложного, распределённого веб-приложения, и представляет собой программную прослойку, посредством которой приложение, написаное на языке JavaScript, может работать с удалённой базой данных на сервере. Происходит это благодаря типизированным запросам, которые модуль mod_jdc создан обрабатывать.
На пример, у нас есть таблица:
idnameagejdc_uid
1Василий Выборский427
2Павел Вишнёвый237
3Ксения Поберушка297
4Никита Кожемякин563
Последнее поле - идентификатор пользователя, котрый владеет записью (см. документацию). И оба пользователя с идентификаторами 7 и 3 принадлежат к группе с кодом 2.
Пускай у нас существут «пул» доступа к базе данных со следующим описанием:
<?xml version="1.0" encoding="UTF-8"?>
<connection>
    <database driver="pgsql">
        <connstr>dbname=test user=admin password=passwd host=localhost port=5432</connstr>
        <lifetime>60</lifetime>
        <authtablename>test_users</authtablename>
        <responsetype>json</responsetype>
        <debug>on</debug>
    </database>
    <access>
        <table name="people">
            <rule type="S">
                <group>-1</group>
            </rule>
            <rule type="IUBDB">
                <grouponly>2</grouponly>
            </rule>
        </table>
    </access>
</connection>
Чтобы разобраться в конфигурации, смотрите документацию.
Сервер сконфигурирован и готов обрабатывать входящие запросы. Рассмотрим инструменты, предоставляемые библиотекой JDC JS API на следующий примерах:
Пример 1

Задача: получить выборку имён и идентификаторов людей, возраст которых больше 30 лет, с обратной сортировкой по возрасту.

Подключив библиотеку jdcapi.js и используя её функции мы создадим пакет-запрос к серверу:
var req = new jdc_request (JDC_SELECT, "people");

jdc_field_add (req, "id");
jdc_field_add (req, "name");
                        
req.where = "age > 30";
req.postfix = "ORDER by age DESC";

var xml = jdc_make_xml (req);
Данный код создаст строку с XML-запросом:
<?xml version="1.0" encoding="UTF-8"?>
<request type="select">
        <table name="people">
                <id/>
                <name/>
        </table>
        <where>age > 30</where>
        <postfix>ORDER by age DESC</postfix>
</request>
Полученную строку можно отправлять серверу, который вернёт ответ:
{
        "status": { "code": 0, "nrows": 2 },
        "data": [
                {"id": "4", "name": "Никита Кожемякин"}
                {"id": "1", "name": "Василий Выборский"},
        ]
}
Данный ответ будет возвращён независимо от того, авторизован ли пользователь, или нет, т.к. в конфиге пула подключения запрос типа select разрешён всем.
Пример 2

Задача: добавить новую запись в таблицу, если пользователь НЕ аутентифицирован.
var req = new jdc_request (JDC_INSERT, "people");

jdc_field_add (req, "name", "Остап Бендер");
jdc_field_add (req, "age", 47);

var xml = jdc_make_xml (req);
Данный код создаст XML-запрос:
<?xml version="1.0" encoding="UTF-8"?>
<request type="insert">
        <table name="people">
                <name>'Остап Бендер</name>
                <age>47</age>
        </table>
</request>
Ответом от сервера будет:
{
        "status": { "code": 5, "nrows": 0,
        "debug": "Error: no rule for this group and request type" }
}
Ненулевой код статуса ответа скажет нам об ошибке, "nrows": 0 - говорит о том, что ни одной записи не было добавлено. Запись "debug" содержит описание ошибки. В данном случае, модуль не нашёл правила, разрешающего неаутентифицированному пользовтелю выполнять запрос типа insert.
Если же пользователь аутентифицирован, и относится к группе с идентификатором 2, на тот-же самый запрос сервер ответит:
{
        "status": { "code": 0, "nrows": 1 }
}
Нулевой код говорит о том, что запрос прошёл успешно, и добавлена 1 запись ("nrows": 1).
Идея и реализация проекта — Ленский Алексей aka PM.
2008. e-mail