Как стать автором
Обновить

Комментарии 11

Самое главное, чтобы никто не додумался сделать прям как здесь описано, без добавления слоя безопасности.
Для того, чтобы сделать такое же в Postgres/nginx, нужно:

— Написать запрос, вытаскивающий всё, что нужно, сразу же правильно упаковывающий в json, эскейпящий все значения и делающий хорошо:
select array_to_json(array_agg(g.*)) from our_table g;

— Написать конфиг nginx, который скажет, как раздать postgres по http:
http {
    upstream database {
        postgres_server  127.0.0.1 dbname=test
                         user=test password=test;
    }

    server {
        location / {
            postgres_pass   database;
            postgres_query  "SELECT * FROM cats";
        }
    }
}


(пример утащен с https://github.com/FRiCKLE/ngx_postgres)

ВСЁ.
В этом примере:
— формирование корректного json;
— безопасность регулируется на двух уровнях: права доступа конкретного пользователя в postgresql, и права доступа к урлам на nginx;
— формирование любой структуры данных автоматически — hstore / json / jsonb-поля в базе автоматически свернутся в своё правильное представление.

Скажите, почему в системе, работающей и предлагающейся к использованию в 2014 году до сих пор нет средств простого сворачивания произвольной структуры в json, а разработчики (разработчики самой системы, сотрудники InterSystems) пользуются для её имитации конкатенацией строк?
Внизу статьи указано, что можно формировать JSON сразу, с помощью %ZEN.Auxiliary. Там есть классы для формирования JSON из объекта и из SQL запроса. Просто в данной статье акцент сделан на другом — на доступе к статическим методам классов через REST.
«Доктор не мыл руки перед операцией, потому что в ней акцент делался на другом, на вырезании аппендицита.»

Почему вы их не использовали, если они есть?
Они неудобны, некрасивы, глючны, или вы просто ими никогда не пользовались?

Во всех современных системах сделать json-представление чего угодно значительно быстрее, проще и безопаснее через специально для этого созданные средства.
Стилистика InterSystems Caché осталась в девяностых?
Системные классы по работе с JSON разумеется есть: объекты, SQL. Безопасность тоже несложно настраивается — ресурсы и роли для веб-приложения.

А статья скорее про принцип построений приложений с Caché: сервер сайд: хранилище+REST API <-JSON-> frontend на статических HTML+JS.
Кстати пример не то что бы корректен, возможность работать из nginx напрямую это не предоставляемая из коробки от postgress возможность, а сделанная энтузиастом. Да, к сожалению для каше что-то подобное пока не придумали (хотя и не вижу каких то ограничений, такое сделать возможно), но и сообщество у нас поменьше, и сейчас таких наработок постепенно становится больше. Сила постресс в бОльшем сообществе, которое может наваять много удобных инструментов под себя. Мы тоже можем и делаем, только пока не все открыто делятся.

Кстати как уже раньше писали, сами сотрудники компании написало мало статей, и в основном это новости.
Postgres. Одна s. Я же не ленюсь проставлять é в Caché :)

Привязка nginx — это всего лишь способ сменить протокол передачи данных с протокола БД на http, да расписать способы преобразования. Это можно заменить даже shell cgi-скриптом.

Суть примера в том, что в базе есть всё для организации REST API, включая лёгкий парсинг и сериализацию json.
В Caché, судя по статье, вырвиглазная комбинация всего подряд:
— роуты http->function пишутся в XML-подобном стиле;
— классы оборачиваются в C-like скобочки;
— сам язык напоминает привет из детства (привет, qbasic и отмечание типа переменной %$@), только во много раз хуже (скажите, зачем в quit $$$OK аж трёхзначная сумма долларов?);
— сериализация в json методом конкатенации строк, забытая всеми… везде?
— конфигурация в окошках (я посмотрю, как вас будут любить админы, которые будут раскатывать 200 инстансов базы по серверам c помощью chef/puppet...)
— метод GetGridData вообще пишет дебажные логи в не-json формате в выходной канал. Способов логирования ошибок система не предоставляет?

Скажите, существуют ли вообще примеры не-говнокода на Caché? Пока что я таких не видел — в статьи-то на хабр, наверное, самое классное и вкусное пишется?

(Кстати, спасибо за статью — в процессе написания комментария проверил, обнаружил, что геометрические типы в postgis не сериализовались в geojson, оставаясь в текстовом WKB, запилил и заслал патч из двух строчек.)

Чтобы узнать, работает ли человек в InterSystems, достаточно пойти в профиль человека и найти строку «Работаю в InterSystems». Таковыми являются почти все авторы статей про Caché на хабре. Новости пишет только корпоративный аккаунт intersystems.
— роуты http->function пишутся в XML-подобном стиле;

это довольно общее место в Caché. Ресурсы, которые относятся к классу или удобно использовать из класса можно держать в блоках XData. Записываются ресурсные данные в виде XML-ных блоков. Так в хранимых классах описывается структура хранения, в классах-кубах описываются измерения и показатели, в рест-брокерах — маршруты.

$$$OK — это макрос.
— конфигурация в окошках (я посмотрю, как вас будут любить админы, которые будут раскатывать 200 инстансов базы по серверам c помощью chef/puppet...)

Конфигурация хранится в конфигурационном файле. А для одновременного безопасного изменения на сотнях инстансов служит Enterprise Manager.
— метод GetGridData вообще пишет дебажные логи в не-json формате в выходной канал. Способов логирования ошибок система не предоставляет?

Отладка и логи есть конечно нормальные — это достойно отдельной статьи, спасибо за коммент.
зачем в quit $$$OK аж трёхзначная сумма долларов?

три доллара это обозначение, что дальше используется макрос. Можете смело написать q 1
Обычно определения макросов выносят в отдельный модуль *.inc, но можно и по тексту, например:
#define json(%sql) ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL("json", %sql)
и дальше в рамках метода использовать
w $$$json("SELECT * FROM Sample.Person")

Раньше на Хабре, чтобы опубликовать статью в блоге компании, нужно было числиться сотрудником этой компании, поэтому у всех авторов блога InterSystems стоит галочка «работаю в InterSystems», хотя не все они в InterSystems работают.

JSON из Caché пишется достаточно просто. Например:
write ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL("json", "SELECT * FROM Sample.Person")
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.