Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MUMPS СУБД. Практика применения и опыт программирования.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
1.1. КОМАНДЫ 41
всех команд выполняется неявный безаргументный quit. Если при вы­полнении команд выполнится команда GOTO, то дальнейший код дол­жен выполнить также безаргументную форму команды quit. Кроме того, в самом аргументе XECUTE может стоять команда quit, при ее выполне­нии выполнение самой команды xecute завершится с очисткой стекового фрейма.
К важным возможностям команды XECUTE относится то, что аргу­мент вычисляется как строка и может программно собираться для кон­струирования необходимого для выполнения набора команд и выраже­ний. В частности, это возможность вызвать подпрограмму, имя которой приходит в виде данных, в дополнение к косвенной форме вызова под­программ.
При программном конструировании аргумента команды XECUTE нуж­но лишь следовать синтаксическим соглашениям языка MUMPS.
Важной практической возможностью команды XECUTE является воз­можность вызвать код, являющийся специфическим для какой-либо ре­ализации или версии MUMPS системы. Пока аргумент является стро­кой, для транслятора это синтаксически корректная конструкция. Но в самой последовательности команд могут быть использованы синтакси­ческие конструкции, не поддерживаемые текущей реализацией. В част­ности, это используется в прикладных системах, которые должны ис­пользовать специфический и зависимый от реализации код, но в целом комплекс должен работать на любой системе и компилироваться без ошибок. Программа самостоятельно определяет какой код исполнять в аргументе XECUTE в зависимости от текущей версии MUMPS системы.
Другой важной возможностью команды XECUTE является исполне­ние строки данных, например специфический для текущего устройства ввода - вывода код для выполнения определенного действия. Причем для различных устройств этот код может отличаться. Более того, выполня­емый код может отличаться в зависимости от программы работающей с другой стороны ввода - вывода. Например, для одних телнет - клиен­тов могут потребоваться одни действия по формированию управляющих последовательностей, для других другие. При этом совокупность таких описанных действий может храниться в настройках в базе данных и использоваться в зависимости от текущего подключенного телнет - кли­ента.

1.1.4 Команды ввода-вывода

В MUMPS среде существует единая стандартная концепция ввода - вы­вода. Весь ввод-вывод производится с так называемыми устройствами
42 ГЛАВА 1. СРЕДА ИСПОЛНЕНИЯ
ввода - вывода посредством команд ввода - вывода. Устройство логиче­ски либо открыто и доступно процессу либо нет. Физически устройство может соответствовать самым разным способам ввода - вывода, напри­мер чтению с клавиатуры, выводу на консоль, файлу, сокету TCP/IP, межпроцессному каналу, магнитной ленте, и другим. Стандарт языка MUMPS никак не лимитирует, какие физические средства могут быть трактованы как устройства.
Все операции ввода - вывода выполняются лишь с текущим устрой­ством. Процесс может открыть несколько устройств, но команды непо­средственно посылающие или принимающие данные, будут использо­вать только текущий, и им нельзя явно указать, с каким из открытых устройств следует выполнять операции. Чтобы выполнить операцию с другим устройством, его нужно сначала сделать текущим.
Среда MUMPS стандартно поддерживает две системные перемен­ные $IO и $PRINCIPAL, которые возвращают соответственно текущее устройство и устройство по умолчанию. Устройство по умолчанию - это то, которое было автоматически создано при старте процесса, и в боль­шинстве систем MUMPS оно не может быть закрыто, но в некоторых реализациях может быть изменено. Устройство по умолчанию назначает­ся MUMPS процессу исполняющей средой автоматически, в зависимости от способа запуска процесса.
Исключение касается лишь текущего устройства для интерактивных типов устройств типа консоли, терминала, телнета. Если пользователь вводит команды для исполнения, то при их выполнении может переклю­читься текущее устройство ввода - вывода, но по окончании выполнения команд необходимо снова вернуть управление пользователю, поэтому в частных случаях MUMPS система, выполнив введенные интерактивно команды, самостоятельно переключает текущее устройство в устройство по умолчанию.
Для ввода - вывода среда MUMPS использует команды:
1. OPEN - открытие устройства с необязательными опциями откры­тия
2. USE - сделать устройство текущим и / или изменить опции ис­пользования устройства
3. CLOSE - закрыть устройство с необязательными опциями закрытия
4. WRITE - вывести строку или спецсимвол или отдельный байт в устройство
1.1. КОМАНДЫ 43
5. READ - прочитать из устройства строку или отдельный байт
Каждое из устройств должно быть как-то именовано. Система имено­вания стандартом не предусматривается, тут производители различных систем могут поступать как считают нужным. Состав и назначение оп­ций также стандартом не регламентируются.
Есть MUMPS системы, где устройства нумеруются, например для открытия файла надо открыть устройство номер 15, а для принтера номер
30.
Есть MUMPS системы, где устройства строго именуются с лидиру­ющим типом устройства, например для открытия файла нужно открыть устройство с именем
"|FILE|c:\temp\io.txt"
а для обмена по TCP/IP устройство с именем
"|TCP|www.yandex.ru:80"
Есть MUMPS системы где характер устройства определяется опцией, например открыть файл на запись в режиме добавления
open filename:APPEND
или запустить тот же файл на исполнение и обмениваться по стандарт­ным каналам с запущенным процессом:
open "file":(COMMAND="cat "_filename:READONLY)::"PIPE"
При этом в зависимости от реализации MUMPS системы открытые устройства могут быть во владении всеми процессами MUMPS системы, или только одним тем который открыл устройство. В зависимости от реализации MUMPS система может позволить или не позволить открыть процессу устройство если устройство с таким же именем уже открыто в другом процессе.
Нечеткость требований стандарта в отношении ввода - вывода, с од­ной стороны, позволили разработчикам MUMPS систем поддерживать множество самых различных способов ввода - вывода, но, с другой сто­роны, те разработчики кто использует MUMPS, должны сверять код с документацией на используемую MUMPS систему и проверять как именно поддерживается в ней открытие или использование устройства в
44 ГЛАВА 1. СРЕДА ИСПОЛНЕНИЯ
зависимости от его физического типа. Обычно такие фунции разработ­чики выносят в отдельные библиотечные рутины, зависимые от реали­зации. Для одной MUMPS системы выполняется один код, для другой ­другой.
Команда OPEN (O) открывает устройство. В случае если устройство с таким именем уже было открыто, то команда ничего не делает. Если не было открыто, то команда пробует открыть и при успехе имя устройства вносится в список открытых. Если указан таймаут ожидания открытия, то команда дополнительно взводит системную переменную $test в зна­чение 1 при успехе открытия за указанное время и в значение 0 при неуспехе.
Что интересно, открытое устройство не становится текущим. Чтобы далее прочитать из устройства или записать в него, нужно его сделать текущим.
Команда открытия может поддерживать дополнительные опции от­крытия устройства, в зависимости от реализации MUMPS системы и в зависимости от типа устройства. Например, в опциях могут быть указа­ны терминатор чтения строки или режим открытия файла для совмест­ного доступа.
Команда USE (U) делает устройство текущим. Если устройство уже было текущим, то оно остается текущим. Если такое устройство не было открыто, то команда генерирует ошибку.
Команда USE также может поддерживать дополнительные опции, чтобы указать как именно использовать устройство или применить к нему какие-то действия. Например, сменить терминатор чтения или из­менить позицию в файле.
И команда OPEN и команда USE может поддерживать назначение устройству мнемоник. Это внутренний механизм MUMPS системы для обработки мнемонических имен. Механизм мнемоник может быть реали­зован различным образом. Во многих MUMPS системах имя обработки мнемоник означает рутину, в которой впоследствии будут искаться мет­ки для обработки самих мнемоник. Как правило, это отдельная рутина, но это необязательное правило, различные MUMPS системы могут при­держиваться слегка отличающихся соглашений. В частности, при вызове
write /CUP(10,20)
указывается что для текущего устройства должна быть вызвана мнемо­ника CUP с двумя параметрами. В частности именно это имя (CUP) означает позиционирование каретки на экране консоли или телнета. Ес­ли для устройства телнета и консоли назначены соответствующие рути­ны обработки мнемоник, то для одного и того же кода
1.1. КОМАНДЫ 45
write /CUP(10,20)
но для разных устройств будет вызываться код, зависимый от устрой­ства.
Такой механизм позволяет организовать работу программного кода независимо от устройства и работать на самых различных типах тел­нет - клиентов и терминалов одними и теми же функциями, выполнив назначение рутины мнемоник при подготовке устройства.
Команда CLOSE (C) закрывает устройство и удаляет его из спис­ка открытых. Традиционно MUMPS системы придерживаются правила, что команда CLOSE не может закрыть устройство по умолчанию, эта операция просто игнорируется. Команда CLOSE также может поддер­живать дополнительные опции, означающие какие действия необходимо применить к физическому устройству при закрытии. Например, это мо­жет быть удаление используемого файла или усечение его размера по текущему положению, или по указанному размеру, или переименование, или что-то иное.
Многие современные MUMPS системы поддерживают нестандарт­ную безаргментную форму команды CLOSE. Но эта команда применяет­ся не к текущему устройству, а ко всем, кроме устройства по умолчанию ($PRINCIPAL). Хотя, если текущее устройство не является устройством по умолчанию, оно также неявно попадет под это правило.
При закрытии текущего устройства MUMPS системой не допускает­ся такая ситуация, что нет текущего устройства. Команда CLOSE в этой ситуации делает текущим то устройство, которое является устройством по умолчанию. В простых случаях, когда именно это и требуется, раз­работчики не принимают специальных мер по переключению текущего устройства, но в реальных функциях это обычно не приветствуется. Ре­комендуется либо до, либо после закрытия текущего устройства явно выполнять назначение текущим то, которое необходимо, либо то, кото­рое было текущим на момент начала выполнения функции.
Основная модель ввода - вывода в MUMPS системах - это модель последовательных устройств. В случае если физические принципы ис­пользованного канала являются блочно - ориентированными, команды чтения и записи для такого устройства все равно приводятся к чтению порций. При этом для позиционирования на нужный блок используется команда use с опциями позиционирования, либо система автоматически переходит к следующей порции.
Команда WRITE (W) записывает в текущее устройство строку или символ или специальную управляющую последовательность, или вы­зывает мнемонику. Для команды write синтаксически поддерживается
46 ГЛАВА 1. СРЕДА ИСПОЛНЕНИЯ
несколько специальных типов управляющих последовательностей:
1. write # - очистить текущий экран или перевести страницу в прин­тере, в зависимости от типа устройства
2. write *code - вычислить значение выражения code как целое число и вывести в устройство один байт с этим кодом
3. write ! - вывести перевод строки
4. write ?code - вычислить значение выражения code как целое число и вывести дополнение в виде пробелов или использовать иной способ позиционирования до указанной колонки в зависимости от типа устройства
5. write /MNEM или write /MNEM(param1,param2,...) - вызвать об­работчик мнемоники MNEM без параметров или с параметрами
Любые другие выражения команда write вычисляет как строку и по­лученную последовательность байт записывает в текущее устройство. С записью строки в различных реализациях MUMPS также могут быть нюансы, например система может поддерживать таблицу трансляций символов. В этом случае можно назначить такую таблицу трансляций что запись из программы на MUMPS ведется в одной кодировке, но благодаря автоматической трансляции реальная запись в физическое устройство (файл, сокет) ведется в другой кодировке.
Небольшой пример формирования простой странички html команда­ми WRITE:
write "<html>",! write "<head><title>Hello</title></head>",! write "<body>",! write "Hello, world!",! write "</body></html>",!
Если такое содержание вместе с соответствующим заголовком http ответа процесс отправит web-браузеру, то он примет ее как html страни­цу. Например, процесс может открыть устройство типа tcp соединения и при обнаружении входящих соединений читать заголовок http запро­са, выяснить что запрашивалось и сформировать командой write полный http ответ. В этом случае MUMPS процесс будет выполнять роль web ­сервера.
Команда READ (R) читает строку или код одного байта из текущего устройства. Команде read можно указывать имя переменной
1.1. КОМАНДЫ 47
read varname
для чтения строки или имя переменной со звездочкой
read *varname
для чтения одного байта и возврата в указанную переменную его кода.
Кроме того, команде read можно указывать константные строки (не числа, если требуется числа то должны быть в кавычках строки) и сим­волы специального форматирования:
1. read # - очистка экрана
2. read ! - вывод перевода строки
3. read ?code - вычисление значения code как числа и позиционирова­ние в соответствующую колонку в зависимости от типа устройства
Также как и для команды write, аргументы команды read могут быть
комбинированы через запятую последовательно:
read !,"Enter Your Name: ",name,!
Здесь команда read сначала переведет строку и с начала строки на­печатает строку "Enter Your Name: ", затем будет ожидать ввода строки, и по окончании ввода запишет введенный результат в переменную name, после чего снова выполнит перевод строки на экране.
По умолчанию для интерактивных устройств типа консоли, термина­ла или телнета, индикатором окончания ввода служит символ с кодом 10 как подтверждение ввода (Enter) либо символ Escape с кодом 27 как отмена ввода.
Кроме того, для устройства может быть явно назначен терминатор чтения, обычно это выполняется в опциях команде use. В этом случае команда read вводит все пока не встретит терминатор чтения целиком, все входящие в него байты в нужной последовательности.
Кроме того, команде чтения можно назначить время ожидания ввода. В этом случае команда будет вводить все что окажется в устройстве в течении указанного времени. По истечении времени команда возвращает управление.
Кроме того, команде read можно назначить явно длину чтения. На­пример, читать первые 12 символов.
Разработчик может скомбинировать все три условия, и терминатор чтения, заданный в команде use, и время ожидания, и длину ввода. В
48 ГЛАВА 1. СРЕДА ИСПОЛНЕНИЯ
этом случае команда read возвращает управление как только достигнуто любое из указанных условий, в зависимости от того, какое наступило раньше.
Большинство реализаций MUMPS систем поддерживает отключение режима эха при вводе строки, чтобы иметь возможность ввести пароль, не показывая его на экране. При необходимости выполнить такую функ­цию необходимо проверить в документации на используемую MUMPS систему как именно в ней отключается и снова включается режим эха.
Кроме стандартных команд для ввода - вывода многие реализации поддерживают свои собственные расширенные команды, например, в за­висимости от реализации это могут быть
1. PRINT, ZPRINT - вывод в текущее устройство текста или части текста рутины
2. ZWRITE - печать переменной со всеми ее узлами и значениями
3. ZZDUMP - печать значения в виде шестнадцатеричного дампа
Команды PRINT и ZPRINT относятся к устаревшим, и уже есть MUMPS системы, которые их не поддерживают из-за неактуальности. В те времена, когда основным средством доступа к компьютеру были даже не телнет по сетям TCP/IP, а соединение компьютеров по COM портам через платы мультиплексоров, алфавитно - цифровой режим доступа был основным. В настоящее время уже давно существуют полноценные раз­витые GUI средства разработки, показывающие рутины как необходимо, и командами типа PRINT и ZPRINT уже не пользуются.
Собственно, в сам стандарт языка команды PRINT и ZPRINT не входят, и эти команды были поддержаны различными реализациями са­мостоятельно с существенно совместимым друг с другом синтаксисом, чтобы дать возможность простым способом просматривать на терминаль­ном устройстве части рутины или рутину полностью.
Команды ZWRITE и ZZDUMP относятся к командам для разработ­чиков, чтобы показать в специальном виде переменные и их значения. Например, пусть есть глобальная переменная
USER>s ^ABC(3)=456
USER>s ^ABC(8,"width")=12.7
USER>s ^ABC("total")=45
тогда ее можно вывести с имеющимися в ней подиндексами и значения­ми:
1.1. КОМАНДЫ 49
USER>zw ^ABC ^ABC(3)=456 ^ABC(8,"width")=12.7 ^ABC("total")=45
Команда ZZDUMP выводит шестнадцатеричную распечатку значения так что разработчик может видеть точное значение каждого из байт входящих в строку:
USER>zzdump "string" 0000: 73 74 72 69 6E 67 string
USER>zzdump $lb(1,2,3)
0000: 03 04 01 03 04 02 03 04 03 .........
В любом случае разработчик должен свериться с документацией на используемую MUMPS систему, какие дополнительные команды ввода
- вывода поддерживаются.
В комплексе с командами ввода - вывода идут системные переменные ввода - вывода. К ним относятся:
1. $IO - переменная содержит имя текущего устройства по принятым в MUMPS системе правилам именования
2. $PRINCIPAL - переменная содержит имя устройства по умолчанию по принятым в MUMPS системе правилам именования
3. $X, $Y - переменные содержат значения координат каретки для текущего устройства
В зависимости от реализации также могут поддерживаться расши-
ренные системные переменные, например $ZEOF.
Если системная переменная $zeof поддерживается, то она содержит индикатор окончания данных в устройстве. Программа может проверять значение системной переменной вместо перехватывания ошибки чтения по истечении данных. Обычным соглашением для переменной $zeof яв­ляется то что она индицирует состояние конца данных для текущего устройства. Если сменить устройство на другое, то значение $zeof будет возвращаться уже для него.
Основные современные реализации MUMPS систем поддерживают вполне достаточное для комфортной работы количество различных ти­пов устройств, включая LPT, COM порты, принтеры, сокеты, файлы, межпроцессное взаимодействие, и другие.
50 ГЛАВА 1. СРЕДА ИСПОЛНЕНИЯ

1.1.5 Служебные команды

К служебным командам относятся команды управления процессами, их состоянием и взаимодействием между процессами. Под процессами здесь понимается процесс MUMPS системы, или логический job. В зависимо­сти от реализации логический job MUMPS системы может соответство­вать физическому процессу, физическому потоку или самостоятельно переключаемому контексту в операционной среде, архитектурно не яв­ляющейся многозадачной, такой как DOS.
Надо отметить, что стандарт MUMPS изначально ориентирован на многозадачный контекст MUMPS системы и изначально предусматрива­ет логическую многозадачность, даже если реализация MUMPS выпол­нена как однопользовательская. В этом случае система поддерживает все синтаксические конструкции, включая список процессов (состоящий из одного). Если система не может выполнить команду job, например, то она генерирует ошибку, но синтаксически эта команда поддерживается.
К служебным командам MUMPS относятся команды:
1. HANG - команда приостанавливает выполнение процесса на ука­занное время задержки
2. JOB - команда запускает другой процесс
3. LOCK - команда запрашивает или снимает блокировку
4. VIEW - команда обращается к внутренним зависимым от реализа­ции структурам данных процесса или MUMPS системы
Команда HANG (H) имеет обязательный аргумент. В случае если используется аббревиатура и безаргументная форма (одна буква H), то для MUMPS такая команда считается командой HALT.
Формально, в стандарте определено, что аргумент задает время при­останова выполнения процесса в секундах. Однако, в этом пункте у различных реализаций имеются расхождения в трактовке таймаута. Су­ществуют, по меньшей мере, такие трактовки таймаута для HANG:
1. Время используется в секундах и секунда считается единицей из­мерения, но величина может быть задана с точностью до миллисе­кунд.
2. Время округляется до целого числа секунд и секунда используется и как единица измерения и как точность задания таймаута.