Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:MUMPS СУБД. Практика применения и опыт программирования.pdf
X
- •Предисловие
- •Введение
- •Среда исполнения
- •Команды
- •Команды присваивания
- •Условные команды
- •Команды передачи управления
- •Команды ввода-вывода
- •Служебные команды
- •Постусловия
- •Операторы
- •Переменные
- •Числа и строки
- •Функции
- •$DATA
- •$GET
- •$ORDER
- •$NEXT
- •$QUERY
- •$NAME
- •$QLENGTH
- •$QSUBSCRIPT
- •$ASCII
- •$CHAR
- •$EXTRACT
- •$PIECE
- •$LENGTH
- •$REVERSE
- •$FIND
- •$TRANSLATE
- •$JUSTIFY
- •$FNUMBER
- •$TEXT
- •$RANDOM
- •$VIEW
- •$SELECT
- •$STACK
- •Списковые функции
- •Битовые функции
- •Модули
- •Рутины
- •Передача параметров
- •Неопределенные значения
- •Шаблоны
- •Косвенность
- •Косвенность имени
- •Косвенность индексов
- •Косвенность метки
- •Косвенность аргумента
- •Косвенность шаблона
- •Интерпретатор
- •Голая ссылка
- •Очередность выполнения
- •Очередность вычисления выражений
- •Очередность вычисления имен
- •Стекование $test
- •Комментарий
- •Стандарт и расширения
- •Глобалы
- •B-дерево
- •Кодирование индексов
- •Размер блока
- •Кеширование блоков
- •Структуры
- •Индексация
- •Группировка
- •Каноничность индексов
- •Маппинг
- •Индексация данных
- •Общие принципы
- •Механизм поддержки индекса
- •Простой индекс
- •Составной индекс
- •Покрывающий индекс
- •Кластерный индекс
- •Хеш-индекс
- •Битмап индекс (bitmap)
- •Битслайс индекс (bitslice)
- •Нормирование значений
- •Выборки по индексу
- •Многоиндексная выборка (zig-zag)
- •Дифференциальное индексирование
- •Индексация длинных атрибутов
- •Межтабличный индекс
- •Индекс с условием на вставку
- •Индекс на вычисляемый атрибут
- •Индекс поиска по фрагменту
- •Индексация для шаблона (like)
- •Индексация уникального атрибута
- •Массовое перестроение индексов
- •Операции с древовидными индексами
- •Операции с битовыми индексами
- •Сортировка по индексу
- •Статистики и кардинальность
- •Конкурентный доступ
- •Параллельность выполнения
- •Блокировки
- •Функция $INCREMENT
- •Транзакции
- •Блокировки в транзакциях
- •Функция $BIT
- •Дедлоки
- •Обработка ошибок
- •Состояние ошибки
- •ZTRAP
- •GT.M
- •MiniM
- •ETRAP
- •Определение
- •$ETRAP
- •$ECODE
- •$ESTACK
- •Ошибки в обработчике ошибок
- •$STACK()
- •Трассировка
- •BREAK
- •MiniM Debugger
- •Serenji Debugger
- •Внешний мир
- •Общие принципы
- •Терминальный интерфейс
- •Сокеты
- •HTTP клиент
- •Вебсервер на MUMPS
- •WebLink
- •Проблемы HTTP
- •Поверх HTTP
- •Подключаемые DLL (SO)
- •Файлы
- •Внешние процессы
- •Порты
- •Практика применения
- •Терминальный режим
- •Редакторы рутин
- •Экспорт и импорт
- •Препроцессор
- •Формат $HOROLOG
- •Опции устройств
- •$X и $Y
- •Возврат результатов
- •Возврат по значению ($$)
- •Возврат по ссылке
- •Запись в предопределенную переменную
- •Возврат значений косвенно
- •Итеративный возврат
- •Потоковый возврат
- •%Z - рутины
- •Планирование файлов
- •Память и сборка мусора

6.4. WEB 431
|expression|
как инструкции по генерации кода. Пример синтаксиса из документации:
<%@Language=Cache@%>
<%
Set date=""
For Set date=$Order(^Contact(date)) Quit:date="" D List
G End ; jump past the HTML that lists the contacts
;
List ; get the details
Set d=^Contact(date)
Set VisitDate=date
Set Contact=$P(d,"#",1)
Set Notes=^Contact(date,"notes")
; now display the list
%>
<hr>
Date: |VisitDate|<br>
Our contact: |Contact|<br>
Notes of visit: |Notes|<br>
<br>
<%
Quit
End ;
%>
При обработке такой страницы фактически генерируется рутина на
MUMPS так, что все содержание страницы, не входящее в служебные
теги, заменяется на команды вывести это содержание в текущее устройство. В служебных тегах могут быть организованы подпрограммы, переходы на метки, может быть использован блочный синтаксис. В приведенном примере вывод данных Date, Contact и Notes производится в
цикле, как часть подпрограммы List.
По той же схеме выполняется обработка условных тегов, в них пишется переход на метку с служебном теге:
<%@Language=Cache@%>
<%
If condition1 goto Cond1
%>
<p>This is some HTML to display
...etc
<%
Goto End

432 ГЛАВА 6. ВНЕШНИЙ МИР
Cond1 ;
%>
<p> Here is the alternative HTML to display
...etc
<%
End ;
%>
<p>
continue with the rest of the page
WebLink также поддерживает генерацию HTML кода для элементов
управления путем присваивания в коде MUMPS значений специальным
зарезервированным локальным переменным.
При процессировании всех страниц WebLink производит замену имен
ссылок со страниц PageName.asp на вызов ISAPI модуля так, что все
необходимые служебные параметры автоматически передаются в URL в
виде:
http://server/scripts/mgwms32.dll?MGWLPN=My_LPN&wlapp=Contacts
При работе этот модуль обработки автоматически определяет по скомпилированному WebLink приложению и его служебным данным, какую
рутину необходимо вызвать, как и какие параметры передать.
Страница WebLink может управлять генерацией заголовков HTTP
ответа, используя специальный тег <HTTP>, при обработке которого
также выполняется подстановка параметров:
<HTTP>
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: MyCookieName=MyCookie|number|;
path=/; expires= Fri 08-Jan-1999 13:00:00 GMT
</HTTP>
<HTML>
Перед выполнением страницы в контексте MUMPS процесса создаются необходимые служебные локальные переменные с переменными
окружения, которые страница может использовать при необходимости.
К интересным возможностям приложений WebLink относятся механизм передачи событий и параметров с клиентской стороны (браузер) на
сервер (MUMPS). Например, если есть поле ввода, то можно установить
обработчик события его изменения на серверной стороне и процессор
WebLink при компиляции приложения автоматически сгенерирует код
передачи таких событий и их параметров:

6.4. WEB 433
<INPUT TYPE=TEXT NAME=Username
ActionOnChange=Mytest(Info,Password)>
...
<SCRIPT Language=Cache>
//type=actions
Mytest(Info,Password) ; Test the username
...
...
Quit
</SCRIPT>
WebLink работает с InterSystems Cach´e (NT, UNIX), а также с системами DSM и MSM (NT). Модуль разрабатывается фирмой M/Gateway
Developments Ltd и, кроме него, фирма M/Gateway также выпускает
множество модулей для WEB разработки с использованием MUMPS систем.
Что интересно, WebLink комплектуется программой для разработчиков WebLink Developer, который выполняет все необходимые действия
по подготовке веб приложения для WebLink. Сам WebLink Developer
выполнен также в веб интерфейсе.
6.4.5 MWA
MWA (MiniM Web Access) это модуль для промышленных WEB серверов, таких как Apache, IIS, и других, поддерживающих стандартные
соглашения о CGI модулях.
Технологически модуль MWA является CGI фильтром - браузер получает запрос к файлу, но вместо возврата его содержания этот файл
передается модулю, модуль его использует для генерации ответа, и уже
ответ передается вебсервером обратно HTTP клиенту.
Для генерации ответа модуль запускает MUMPS процесс и, в зависимости от встреченных синтаксических конструкций, передает управление процессу, либо самостоятельно отдает в содержание какие-то фрагменты обрабатываемого файла.
В настройках вебсервера производится ассоциирование типа файла
по расширению (mwa) с обработчиком MWA CGI и запрос к странице
производится указанием файла mwa:
http://server/dir/page.mwa?param=value&...
Сам файл mwa является текстовым, и в нем все содержание отдается вебсерверу как ответ, за исключением синтаксических конструкций
выделенных тегами

434 ГЛАВА 6. ВНЕШНИЙ МИР
<?name arguments ?>
Здесь name - имя MWA тега, а arguments - аргументы тега. Все
встреченные MWA теги обрабатываются MWA процессором и, в зависимости от тега, процессор либо самостоятельно заменяет тег на соответствующее ему содержание, либо передает управление MUMPS процессу,
чтобы вычислить значение либо выполнить MWA тег.
MWA теги образуют по совокупности возможностей небольшой язык
программирования, где часть операций выполняется на стороне процесса MiniM на языке MUMPS. Например, тег include включает указанный
другой файл, тег eval вычисляет значение выражения и оно подставляется вместо тега, тег if пропускает или включает часть тела страницы
до следующего условного тега, а тег while организует циклы обработки.
Кроме генерации содержания, MWA теги управляют заголовками ответа, чтобы задать веб баузеру, что он получает страницу HTML, данные
XML, файл PDF, графический файл или другое.
Структурно выполнение MWA страниц полностью аналогично таким
технологиям как PHP или ASP. При обработке файлов не генерируются промежуточные элементы, рутины, временные файлы, файлы MWA
не компилируются, и для обновления приложения необходимо только
обновить MWA файлы (останов вебсервера не требуется).
Например, страница с содержанием
<html><body>
Сегодня: <b><?eval $zd($h,13) ?></b>
</body><html>
генерирует HTML (тип ответа по умолчанию) страницу с текущей датой.
В контексте MUMPS процесса, обслуживающего страницу при генерации, все параметры запроса и переменные окружения доступны в виде
локальных переменных.
6.4.6 CSP
CSP (Cache Server Pages) это технология как фильтра файлов (CSP
страницы), так и обработка специального расширения (CLS), соответствующего сущности базы данных (класс). В настройках вебсервера
(поддерживаются и IIS и Apache, причем на различных операционных
системах) указывается что определенные расширения должны обрабатываться процессором CSP. Это может быть, в зависимости от версии
или операционной системы, как стандартный CGI, так и ISAPI модуль.

6.4. WEB 435
Страница может быть создана как файл формата HTML, при первом
к нему обращении процессор генерирует эквивалентный по функциональности код в виде класса Cache Object Script. Дальнейшая работа по
генерации HTTP ответа выполняется этим классом. Если по странице
CSP сгенерирован и скомпилирован соответствующий ей класс, то дальше можно обращаться не только к файлу, но и к самому классу, точно
таким же образом, но указывая расширение CLS. Более того, если класс
создан по определенным правилам, то файл CSP не требуется.
Все HTML теги, встреченные в странице процессором CSP, обрабатываются с заменой на вызов соответствующих этим тегам классов. Любой
из HTML тегов можно переопределить. В зависимости от определения
того, на что заменять тег, он может быть заменен на вывод просто текста командой WRITE или на обращение к определенному классу, чтобы
его функции вывели необходимое содержание. У тега поддерживаются
атрибуты, также передаваемые соответствующим классам.
Разработчики могут определить собственные правила как необходимо обрабатывать определенные теги, задав эти правила в CSR. Это файл
определения класса в специальной разметке, где указано при каких ситуациях какие действия по генерации кода необходимо выполнять. Действия могут быть отнесены как на этап компиляции, так и на этап выполнения. Правило обработки тега CSR получает и атрибуты, и содержание
тега, и контекст его работы. Также можно определять обработчик тега
в зависимости от того, в какой из тегов он вложен.
Разработчики могут определить через CSR большой набор компонентов таким образом, чтобы указывать на странице CSP не громоздкий
код, а компактный собственный тег. В какой-то мере стандартные теги
HTML также заданы набором таких правил CSR.
Генерируемый по файлу CSP класс содержит набор методов, вызываемых для обработки определенного фрагмента страницы. Разработчики
в самой странице CSP могут также определить собственные методы для
будущего класса. В теле самой страницы разработчики могут свободно
смешивать код HTML, код JavaScript, передаваемый клиентской стороне
и код Cache Object Script, используемый либо для генерации страницы,
либо для обработки событий страницы.
В случае если по CSP странице получается очень большой класс (по
объему кода), то компилятор классов автоматически переносит часть
кода по нескольким рутинам.
В состав технологии CSP входит кроме обработки страниц также
работа с авторизацией, поддержка сессий, передача обработки событий
с клиента на сервер.
Процессор CSP кроме обработки тегов также поддерживает макро-

436 ГЛАВА 6. ВНЕШНИЙ МИР
подстановки и специальные макроподстановки CSP.
Положим, в коде CSP страницы есть фрагмент:
<b>Hello!</b>
При его обработке получается выполняющийся на стороне сервера
при генерации HTTP ответа код
Write "<b>Hello!</b>",!
Этот код уже генерирует отдаваемый клиенту фрагмент
<b>Hello!</b>
Если встречаются специальные символы макроподстановок то они
рассматриваются либо как подстановки этапа компиляции либо подстановки этапа выполнения. Если встречается код вида
##(expr)##
То он вызывается однократно на этапе компиляции и результат вставляется в вывод страницы:
This page was compiled on:
<b>##($ZDATETIME($H,3))##</b>
заменяется на
Write "This page was compiled on:",!
Write "<b>2000-08-10 10:22:22</b>",!
Если же встречается конструкция вида
#(expr)#
то она заменяется на вычисление выражения expr при выполнении каждый раз:
This page was executed on:
<b>##($ZDATETIME($H,3))##</b>
заменяется на
Write "This page was compiled on:",!
Write "<b>",$ZDATETIME($H,3),"</b>",!

6.4. WEB 437
Кроме кода на языке Cache Object Script, разработчик может добавить
классу SQL запрос, объявив его тегом
<script language=SQL>
и используя в дальнейшем в функциях на COS.
За счет того, то каждый из тегов HTML, встреченных при обработке,
заменяется на соотвветствующим образом определенный ему код, поддерживается набор тегов управления CSP:IF / CSP:WHILE / CSP:LOOP.
Кроме генерации содержания HTTP ответа, разработчику CSP страниц также доступно управление заголовками HTTP ответа с тем, чтобы
веб клиент колучал корректное описание ответа. В частности, можно
указать что передается не HTML страница (тип ответа по умолчанию),
а XML или графический файл. Путем обращения к методам базового
класса, от которого наследуется CSP класс, можно управлять куками,
перенаправлять на другую страницу, и управлять другими операциями,
характерными для HTTP протокола.
Одной из значимых возможностей технологии CSP является встроенная поддержка HiperEvent - передача обработчиков событий с клиента на сервер. Если на CSP странице процессор встречает обращение
из JavaScript кода к серверному методу, то на страницу автоматически
помещается код вызова такого события. Код обращается к серверу без
перезагрузки всей страницы, вызывая специальную страницу брокера запросов. CSP процессор автоматически генерирует для него код передачи
параметров и приема возвращаемого значения.
Технология CSP используется во множестве как Intranet проектов,
так и Internet сайтов.
6.4.7 Проблемы HTTP
К общим проблемам применения MUMPS систем для генерации HTTP
ответов относятся следствия самой природы обмена данными по HTTP
и они не связаны со спецификой собственно самих MUMPS систем. К
ключевым проблемам могут быть отнесены следующие, хотя в каких-то
ситуациях могут иметь значение и другие:
1. Работа в недоверительной среде Internet, когда в параметрах запроса могут прийти непредусмотренные разработчиками данные.
2. Непредсказуемое количество процессов для обслуживания потока
запросов, в отличие от Intranet приложений с прогнозируемой активностью.

438 ГЛАВА 6. ВНЕШНИЙ МИР
3. Отсутствие постоянного соединения в течении всего времени работы Internet - приложения и соединение с сервером только для
генерации отдельных порций.
При работе в среде интернет к приложению предъявляются дополнительные требования, о которых разработчики иногда не задумываются. При небрежном отношении к проектированию программного интерфейса и к входным данным могут создаваться уязвимости. Входные
данные, принимаемые через параметры запроса, присылаются внешними
средствами. Неправильно будет полагать, что параметры будут присланы только и исключительно со страниц разрабатываемого веб приложения. Формально говоря, на стороне сервера невозможно достоверно
установить даже то, что запрос пришел именно от браузера, поскольку произвольные запросы могут быть сформированы любой программой,
работающей с сокетами TCP/IP.
На серверной стороне при приеме параметров необходимо в любом
случае, даже в самой незначительной на первый взгляд странице, внимательно относиться к использованию значений параметров. В среде
выполнения MUMPS, как и во многих других с возможностью динамически конструировать выполняемое или вычисляемое выражение, зачастую с целью облегчения работы параметры могут быть использованы
как часть синтаксической конструкции. На языке MUMPS к таким конструкциям относятся команды XECUTE, косвенность команд и меток,
а также возможные нюансы поведения определенных версий MUMPS
систем.
После написания обработчика веб страницы, а еще лучше до, необходимо проверить, как обработчики используют недоверительные данные.
Нужно проверить все команды XECUTE, которые выполняют строки команд, сконструированные с использованием входных параметров. Программисту нужно оценить, можно ли в такие параметры вписать код, не
предусмотренный разработчиком так, чтобы он выполнился. Точно также
необходимо проверить все синтаксические конструкции, использующие
косвенность.
Приведем простой пример. Положим, что в параметре запроса
http://server/dir/page?id=1234
значение параметра id используется для подстановки
; значение переменной id получено из параметра
x "s abc="_id

6.4. WEB 439
В этом случае в параметрах можно передать произвольные выполня-
емые команды, например
http://server/dir/page?id=1234%20k%20^DATA
что в результате выполнения команды XECUTE приведет к выполнению
кода
s abc=1234 k ^DATA
В случае использования косвенности команд также существует возможность выполнения постороннего кода. У MUMPS систем могут быть
нюансы выполнения косвенности команд, в частности существуют системы, которые выполняют косвенную форму команды как вариант команды
XECUTE, например в одной из систем может выполняться:
USER>s @"a=123 w 123"
<SYNTAX> :SET ARGUMENT: *a=123 w 123
и при этом тот же код в другой системе:
USER>s @"a=123 w 123"
123
Кроме того, в стандартном выполнении косвенности имен допускается
синтаксическая конструкция с вычислением значений индексов, например:
s @"a($h)"=123
Конечно, существует возможность принять параметр веб страницы
для конструирования полного имени:
s @"a("_id_")"=123
Но нужно понимать при этом, что в такой конструкции может исполняться произвольный передаваемый извне код, например пусть передано
http://server/dir/page?id=$v(FormatDiskCommand)
тогда будет выполнена системная функция с нехорошим побочным эффектом.
Если нужно подставить значение параметра в качестве индекса, то
нужно использовать значение переменной строго как значение индекса:

440 ГЛАВА 6. ВНЕШНИЙ МИР
s a(id)=123
или
s name=$na(a)
...
s @name@(id)=123
В таких случаях значение параметра не исполняется как команда и
не вычисляется как выражение.
При просмотре кода на предмет скользких мест необходимо также просмотреть его на предмет остальных форм косвенности, включая
применение косвенности меток, и сопоставить возможность подстановки в параметры непредусмотренных данных с поведением применяемой
MUMPS системы в таких случаях.
Уязвимости такого рода обычно называют уязвимостями класса Code
Injection, например SQL Injection или JavaScript Injection. В данном случае это будет MUMPS Injection.
Проблема непрогнозируемого количества запросов вызвана тем, что в
среде интернет может произойти наплыв посетителей на страницы сайта
по ссылкам с популярных ресурсов и на обслуживание могут понадобиться тысячи процессов сервера. Кроме проблемы физической способности используемого в качестве сервера компьютера выполнять столько процессов одновременно, также стоит вопрос о пределах лицензии
на применяемую MUMPS систему если это коммерческая система. При
эксплуатации в среде интернет серверов с лицензированием, конечно,
необходимо проверить, подходит ли выбранная лицензия или программные решения по ограничению входящих соединений для обслуживания
пика запросов.
К третьей проблеме веб приложений относится проблема отсутствия
постоянного соединения в том виде, как оно используется в клиент серверных или терминальных приложениях. Любая страница разработанного веб приложения может быть запрошена в любое время. И, вообще говоря, нет возможности принудить пользователей (а тем более
поисковые системы) попадать на страницы приложения строго в определенной последовательности и передавать строго определенные и только
предусмотренные параметры.
Передаваемые параметры могут не соответствовать реальным данным
в базе данных, и приложение должно относиться к ним как к возможно
несуществующим.
В приложениях, где используются авторизация пользователя либо
произвольная форма связывания контекста веб приложения с текущим
пользователем, необходимо применять дополнительные меры по работе
с куками или передавать дополнительные параметры.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
