Добавил:
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.7. ВНЕШНИЕ ПРОЦЕССЫ 451
также для подготовки временных данных в виде файлов для внешних
трансляторов (LaTeX, XSL, языки программирования, и другие) и для
использования результатов работы внешних процессов. Во втором случае разработчики применяют специальные библиотеки обработки таких
специальных форматов файлов и приведения их кодировок к внутренней
текущей кодировке MUMPS системы.
6.7 Внешние процессы
Обращение к внешним процессам - это возможность, относящаяся не
столько к функционалу собственно СУБД, сколько к задаче интеграции с другими компонентами или организация взаимодействия с уже
готовыми подсистемами.
Внешний процесс запускается для выполнения определенной задачи.
Ему могут быть переданы параметры, получены результаты и вариантов
организации взаимодействия может быть множество, в зависимости от
исполнения запускаемой программы.
К вариантам запуска внешнего процесса могут быть отнесены следующие:
1. Запустить процесс и не дожидаться окончания его работы.
2. Запустить процесс и дождаться окончания его работы.
3. Запустить процесс и взаимодействовать с его стандартными каналами ввода - вывода как с устройством MUMPS.
При этом все три варианта допускают передачу процессу параметров
командной строки, а также возможность запуска тенологически различных процессов - exe, скриптов, командных файлов.
Первые две возможности обычно выполняются в MUMPS системах
как системные расширенные функции.
Третья возможность более интересная. Запускаемый процесс принимает аргументы командной строки и читает свой стандартный входной канал stdin, а результат пишет в свой стандартный выходной канал
stdout. Для MUMPS процесса открытие внешнего процесса как устройства означает запуск внешнего процесса с организацией взаимодействия
с его каналами. Запускающий MUMPS процесс пишет в его канал stdin,
а читает из его канала stdout.
Приведем пример такого устройства, запускающего встроенную в
операционную систему команду DIR, и читающий результат.
Для системы Cach´e это может быть такой вариант:

452 ГЛАВА 6. ВНЕШНИЙ МИР
cmd
s dev="dir c:\ /w /b"
o dev:("QR")
u dev
s $zt="end"
f r line u $p w line,! q:line="" u dev
end
c dev
q
Здесь ключевой элемент состоит в том, что устройство открывается с
опцией Q, поэтому читается не из файла dir, а выходной канал процесса,
запущенного внешней программой dir.
Для системы MiniM это может быть такой вариант:
dir ;
n zeof=$v("proc",5,0)
n dev="|PIPE|dir /w"
o dev:("rwt")
n result
u dev f q:$zeof r result($i(result))
u $p
c dev
i $v("proc",5,zeof)
zw result
q
Здесь ключевой элемент состоит в том, что используется устройство
типа |PIPE|, что и означает запуск внешнего процесса с организацией
чтения его выходного канала.
В системе GT.M это может быть такой вариант:
Set dev="MyProcs"
OPEN dev:(COMMAND="ls":READONLY)::"PIPE"
Здесь ключевой элемент состоит в том, что устройству указывается
область обработки "PIPE" и отдельно в опции устройства указывается
выполняемая команда.
Таким образом, используя запуск внешнего процесса, разработчики
могут подключать к разрабатываемой прикладной системе множество
уже готовых программ.
К плюсам выполнения задачи внешним процессом относится его готовность её выполнить и разработка запускаемой программы независимо от контекста её использования. В частности, трансляторы языков
программирования работают независимо от того, из какой программы

6.8. ПОРТЫ 453
их вызвали. Ко второму плюсу относится использование запущенным
процессом собственного адресного пространства, изолированного от запускающего. К третьему плюсу можно отнести возможность запускать
процесс, работающий в другой архитектуре, например из 64-х битной
MUMPS системы запускать и использовать процессы, выполненные как
32-х битные и наоборот, а также независимость от того, что внешний
процесс может быть как самостоятельным и запущенным из исполняемого файла, так и интерпретатором скриптового языка.
К минусам использования внешних процессов можно отнести возможно увеличенное время их запуска по сравнению с обращением к
такому же коду, выполненному в виде подключаемой DLL, и необходимость специальным образом готовить параметры и принимать результаты
работы. Возможно, может понадобиться специальный небольшой парсер
для разбора результата работы программы.
При использовании как внешних подключаемых DLL, так и внешних процессов в некоторых MUMPS системах может присутствовать
приостанов работы остальных JOB, если эта MUMPS система выполнена на собственном механизме переключения контекстов исполняющихся
JOB. При передаче управления внешним средствам из контекста, контролируемого таким интерпретатором, управление ему не возвращается,
пока запущенная функция не отработает полностью до возврата или до
возврата следующей порции.
Такие устаревшие и немасштабируемые MUMPS системы уже не развиваются и сняты с производства, хотя в эксплуатации еще могут находиться сервера под их управлением. Первоначально такие системы
были разработаны для работы под управлением операционных систем
без встроенной многозадачности, например класса DOS, и унаследовали
определенные архитектурные решения.
6.8 Порты
Под применением портов в отношении MUMPS систем понимают в широком смысле и последовательные и параллельные порты, а в узком
смысле практически всегда последовательные (а в еще более узком RS-232).
Первоначально, когда еще толком не было разработано сетевых соединений компьютеров с полноценной сетевой инфраструктурой, к компьютеру подключались терминалы. Это монитор с клавиатурой и приемопередающим блоком, а связь выполняется кабелем по последовательному
каналу.

454 ГЛАВА 6. ВНЕШНИЙ МИР
Характеристики связи были таковы, что именно последовательные
каналы связи с хорошими токами позволяли связать терминалы с самим компьютером на довольно большие расстояния. Объем передачи был
небольшой и пропускной способности таких каналов вполне хватало.
В настоящее время такие подключения практически не встречаются,
терминалы практически не используются, их заменили полноценные персональные компьютеры с полноценной сетевой инфраструктурой, поэтому первоначальное назначение последовательных портов как основного
коммуникационного средства ушло, но осталось применение последовательных портов для другого оборудования.
При появлении полноценных сетевых протоколов TCP/IP на смену
железным терминалам пришли телнет - клиенты, эмулирующие их работу и совместимые с передаваемыми форматами за тем исключением,
что данные передаются по каналу TCP/IP, а не по последовательному
каналу, и телнет клиент это не отдельная аппаратная конструкция, а
программа, которая может быть запущена на компьютере во множестве
экземпляров и для соединения с различными серверами по одному и
тому же сетевому подключению.
Самые различные устройства могут быть подключены к компьютеру
по последовательному порту - модемы, контрольно - кассовые машины,
считыватели штрихкодов, денежные ящики, приемники купюр.
Последовательные порты также могут быть использованы для оборудования, не работающего непосредственно через COM порты, в виде
виртуальных последовательных портов. В этом случае устанавливается
специальный драйвер виртуального порта. Также могут использоваться
аппаратные переходники с USB оборудования на COM порты.
Общий принцип работы с оборудованием по последовательному порту
состоит в том, что используется устройство для COM порта. Устройству
передаются опции открытия в команде OPEN или, при необходимости,
изменяются опциями команды USE, и чтение - запись выполняются командами READ - WRITE. При этом MUMPS система направляет все
указания устройству соответствующему аппаратному последовательному порту.
Для организации обмена с контрольно - кассовой аппаратурой нужно
записывать и читать из порта байты, описанные в протоколе обмена на
используемую аппаратуру. Обычно он выглядит примерно таким образом:
1. Записать байт начала команды.
2. Записать байт кода команды.

6.8. ПОРТЫ 455
3. Записать байт конца команды.
4. Записать 2 байта контрольной суммы.
После записи последовательности команд нужно прочитать из того
же устройства ответ о выполнении как определенную последовательность байт. В ней содержатся в указанном в протоколе кодировании
данные с ответом.
Различные ККМ используют различные протоколы, но общие прин-
ципы полностью аналогичны описанному - это определенная последовательность байт. Для корректной работы аппаратуры она также может
иметь особенности по настройке параметров порта для передачи - наличие стоповых бит, число бит в байте, паритетность, скорость передачи, интервалы задержек. Эти параметры устанавливаются или в опциях
команды OPEN, или в опциях команды USE, или вызовом отдельных
системных функций.
Несмотря на то, что последовательные терминалы в настоящее время
считаются устаревшим оборудованием, тем не менее такое оборудование
до сих пор находится в эксплуатации как чрезвычайно надежное и простое. Для подключения такой аппаратуры к MUMPS серверам используются различного рода мультиплексоры, создающие необходимое для
аппаратного подключения число последовательных портов, и в MUMPS
системе запускаются процессы, обслуживающие обмен данными по последовательным портам.
В настоящее время техническая поддержка такого последовательно-
го оборудования, подключение различного рода железных терминалов,
является отдельной и непростой задачей в силу очень малой распространенности такого оборудования, и в настоящее время под терминалами
с последовательными каналами специалисты скорее будут иметь в виду различного рода платежные терминалы, внутри которых находится
компьютер с набором последовательных портов и ККМ - оборудование
стойки, подключенное через них.
Отдельно нужно сказать о работе с принтерами. Работа с принтерами
может быть выполнена как вывод текста на тексто - ориентированное
устройство и как вывод PCL или PostScript команд на графически ориентированное устройство. Традиционно под работой с принтерами по
портам подразумевается первый вариант, когда программа на MUMPS
просто выводит текст в устройство, связанное с принтером. При этом
принтеры могут быть аппаратно выполнены как соединяемые и через
последовательный, и через параллельный порт.
В настоящее время современные MUMPS системы могут поддержи-
вать специальные устройства для работы с принтерами с поддержкой

456 ГЛАВА 6. ВНЕШНИЙ МИР
специализированных для принтеров опций - управление ориентацией
страницы, качеством печати, ее цветностью и другими. Тем не менее,
если принтер работает через обычный последовательный или параллельный порт, его можно использовать открыв программно соответствующий порт и посылая необходимые управляющие последовательности.
Для каждого из принтеров, по крайней мере, выпускавшихся раньше,
можно найти описание команд принтера для вывода на печать и текста
и графических примитивов.
В некоторой степени исторический факт, что именно такая технология использования новых моделей принтеров, без использования драйверов операционной системы, и применялась в различных прикладных
MUMPS системах. При необходимости подключения новой модели и
для графической печати для нее описывались команды вывода примитивов, посылающие последовательности байт в порт, или в некотором
роде драйвер принтера, написанный на языке MUMPS. По сути, вывод
на принтер производится либо выдачей текста, либо команд языка PCL
или PostScript. Для вывода же просто текстовых документов вполне достаточно обычных текстовых управляющих символов - перевод строки,
табулятор, перевод страницы.

Глава 7
Практика применения
7.1 Терминальный режим
Название терминальный происходит от терминалов, это такие полукомпьютеры, имеющие монитор, канал связи, клавиатуру, и простейшие
средства сопряжения по линии связи, например по COM портам.
Такие клиентские места подключались к компьютеру, который стоял
в отдельном помещении, или в большой стойке, или даже в нескольких.
Терминал отсылал компьютеру нажатие клавиш, а компьютер отвечал
командами что сделать с видеопамятью. В результате на экране отображались алфавитно-цифровые символы.
Обычно такие терминалы выполнялись на монохромной электроннолучевой трубке с зеленым люминофором. Но были терминалы и другого
физического исполнения, вместо экрана могли использоваться даже печатающие машинки. Общее название терминального интерфейса так и
было закреплено.
В настоящее время терминальные устройства почти не используются, их заменили программные средства, работающие на множестве операционных систем. При этом полностью сохранились принципы взаимодействия - отсылка нажатия клавиши от клиентской части серверу и
отсылка команды изменения экрана от сервера к клиентской части.
В настоящее время также можно встретить термин CHUI - CHaracter
User Interface как альтернатива названию GUI - Graphical User Interface.
В практически любой операционной системе присутствуют такие программы, в частности это обычные консоли, DOS - окна, графические
телнет клиенты, имитирующие алфавитно-цифровой интерфейс.
В таких программах взаимодействие с компьютером выполнено в виде
вывода символов, и, зачастую, с применением псевдографики, и ввода с
457

458 ГЛАВА 7. ПРАКТИКА ПРИМЕНЕНИЯ
клавиатуры. Терминальный интерфейс, по оценкам экспертов, позволяет
строить программы с наиболее оптимальным для ввода данных интерфейсом. В частности, при работе со счетами в банках, при вводе чека
в супермаркетах, при выписке билетов многие разработчики стараются
применить именно алфавитно-цифровой режим, как оптимальный для
клавиатурного ввода с большой скоростью.
Такие же программы можно выполнять на языке MUMPS, поскольку
клиентской части в общем-то все равно, какими программными средствами принимается символ и отдается команда изменения изображения.
Точно так же как на других языках, на языке MUMPS можно формировать символами псевдографики оконный интерфейс, поля ввода, кнопки,
и многое другое.
Современные MUMPS системы поддерживают терминально - ориентированные средства взаимодействия как минимум, зачастую с несколькими вариантами и способами физического соединения и исполнения.
В настоящее время все меньше MUMPS систем поддерживает ставшие физически экзотическими средства вроде COM портов на мультиплексорах, или LAT интерфейс. При этом как минимум поддерживаются
консольные и телнет-интерфейсы.
Консольным интерфейсом называется окно, принадлежащее непосредственно запущенному процессу, когда MUMPS процесс физически выводит в это окно и читает ввод с клавиатуры компьютера. Телнет интерфейсом называется программное взаимодействие MUMPS процесса
с телнет клиентом. Телнет клиент это специальная программа, отображающая окно и программно взаимодействующая с серверной частью по
сетевому протоколу поверх TCP/IP.
Запуск консольного варианта (если он поддерживается) выполняется или непосредственным запуском исполняемого файла с, возможно,
указанием необходимых параметров. Для запуска телнет клиента необходимо запустить саму программу и указать опции соединения - имя
компьютера и порт который обслуживается телнет-сервером MUMPS
системы. Например, запустив в Windows cmd.exe, в его окне набрать:
telnet localhost 23
Здесь localhost - это имя компьютера (локальный), 23 - номер обслуживаемого порта. При успешном соединении телнет клиент может
вводить команды и отображать результат работы.
В качестве телнет клиентов могут быть использованы произвольные
телнет клиенты, это могут быть как программы непосредственно консольного исполнения, так и графические, показывающие окно эмуляции.

7.2. РЕДАКТОРЫ РУТИН 459
Многие MUMPS системы предоставляют уже настроенное инсталлятором меню запуска терминального входа в MUMPS систему.
Собственно, сам запуск такой программы, соответствующей входу в
MUMPS систему, и является обычным и ежедневным делом для тех, кто
работает с MUMPS системами, и может вызвать затруднение у разработчиков, привыкших к только графическим средствам разработки. При
использовании MUMPS системы первое, что необходимо найти, это способ входа в нее в зависимости от версии, от используемой операционной
системы. Далее, в силу традиций и совместимости различных MUMPS
систем, все может выглядеть совершенно одинаково на совершенно разных реализациях.
Обычно слева в начале строки MUMPS система обычно пишет промпт
и сообщает в нем где находится текущий процесс, в какой из баз данных. После него ожидает ввода команд. При этом можно, нажав стрелки
вверх / вниз, выбрать предыдущий ввод. После ввода строки команд разработчик нажимает Enter и система выполняет введенные команды.
Протокол для телнет клиентов является открытым и данные передаются по сети как есть. Кроме него существуют возможности обратиться
к MUMPS системе по закрытому каналу, используя протокол SSH, и
различные SSH клиенты. По сути это примерно те же телнет клиенты,
но использующие шифрование для закрытия канала обмена данными.
Для настройки SSH канала необходимо либо обратиться к руководству
на используемую MUMPS систему, либо настроить SSH шлюз внешними средствами.
Обычно окно терминального интерфейса имеет стандартные размеры
80 по горизонтали на 25 по вертикали символов. При этом многие системы имеют возможность увеличить размер по вертикали, в том числе
с прокруткой.
Кроме символов псевдографики для оформления рамок и элементов
интерфейса CHUI программы могут использовать также цвета. Например, пакет программ AltNC может работать с рутинами и глобалами
различных MUMPS систем в стиле двухпанельного интерфейса Norton
Commander, как в консоли так и в телнете, с раскраской панелей и подсветкой синтаксиса рутин на языке MUMPS.
7.2 Редакторы рутин
Вторым основным средством для разработчиков на MUMPS являются
редакторы рутин. Рутина представляется в виде текста, как обычный
текстовый файл. Редактирование такого текста может выполняться как

460 ГЛАВА 7. ПРАКТИКА ПРИМЕНЕНИЯ
отдельной графической программой с полновесным MDI интерфейсом,
так и редатором написанным на самом MUMPS и редактирующим программу в терминальном окне.
Для практически всех современных MUMPS систем существуют средства редактирования текста, либо устанавливаемые в составе MUMPS
системы, либо устанавливаемые и настраиваемые отдельно.
Для систем Cach´e и MiniM в комплект MUMPS системы входят
графические MDI редакторы текста, для GT.M, Cach´e, DSM, M21 и
MSM возможно использование внешних средств Serenji, а также для
большинства MUMPS систем может быть использован редактор рутин,
входящий в консольный AltNC.
Если MUMPS система поддерживает хранение исходных текстов рутин в виде файлов файловой системы, то можно использовать произвольный текстовый редактор.
В большинстве случаев редакторы рутин поддерживают редактирование с подсветкой синтаксиса языка MUMPS и, возможно, с учетом
специфики MUMPS системы, ее дополнительных возможностей синтаксиса.
Кроме просто редактирования рутин редакторы также поддерживают обращение к компилятору рутин и показ результата трансляции с
возможными ошибками синтаксиса.
Редакторы рутин в большинстве случаев соединяются с MUMPS системой по протоколу выполненному поверх TCP/IP и могут работать как
с сервером запущенным на том же компьютере, так и с любым другим,
если к нему есть доступ по TCP/IP.
Зачастую редакторы рутин также содержат функцию экспорта и импорта рутин. При этом нужно понимать, на каком из компьютеров будет
сохраняться файл экспорта - на локальном, где работает редактор, или
на сервере, где работает MUMPS система.
Для организации работы нескольких разработчиков над одним проектом могут применяться самые различные способы. Необходимо учитывать, что исходный текст рутин не является файлами как таковыми,
чтобы использовать готовые средства контроля версий и, в зависимости от принятых в компании - разработчике программного обеспечения
внутренних правил это могут быть, например, такие:
1. Разработчики работают в одной базе данных и редактируют только
рутины, закрепленные за ними, либо те рутины, которые определены руководителем.
2. Разработчики работают в различных базах данных, в том числе и
на различных серверах и проводят экспорт и импорт измененных
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
