Добавил:
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 - рутины
- •Планирование файлов
- •Память и сборка мусора

5.7. MINIM DEBUGGER 401
В этом разделе описания команд BREAK и ZBREAK приведены иллюстративно, чтобы составить предствление о характере их применения. Для применения на практике отладчика, основанного на командах
BREAK и ZBREAK, программисту необходимо ознакомиться с документацией на используемую MUMPS систему, включая возможные особенности ее версии.
Принцип отладки, основанный на применении команд BREAK, в действительности, несмотря на кажущуюся сложность, прост и позволяет
отлаживать CHUI программы или отдельные фрагменты кода в традиционном для MUMPS систем консольном режиме. К такому режиму относятся консоли, терминалы и различные телнет-клиенты. Фактически,
программист может вести отладку, соединившись с MUMPS системой
удаленно, и для работы такого отладчика не требуются дополнительные
программные средства.
5.7 MiniM Debugger
Отладчик MiniM Debugger встроен в редактор исходного кода MiniM
Routine Editor. Отладчик поставляется бесплатно в составе инсталлятора
MiniM и всегда соответствует по своей версии той же версии MiniM.
Использование отладчика MiniM Debugger из одной версии MiniM с
другой версией MiniM не рекомендуется из-за возможных отличий в
нюансах версий. При этом в остальном работа самого редактора MiniM
Routine Editor возможна с другими версиями сервера MiniM.
Клиентская часть отладчика MiniM Debugger работает под операционной системой Windows и выполнена как Win32 приложение. При
этом серверная часть может работать как на этом же, так и на другом
компьютере и быть как 32 битной так и 64 битной.
Отладчик MiniM Debugger может подключиться как к имеющемуся
процессу, так и запустить новый в виде консоли или фонового процесса,
причем для запуска консоли необходимо, чтобы серверная часть работала на том же компьютере. Кроме того, поддерживается опция автоматического присоединения к следующему процессу MiniM, который будет
запущен. В этом случае отладчик присоединяется к процессу независимо от способа его запуска, это может быть телнет доступ, обслуживание
страницы MWA, подключение через MiniM Server Connect от любой
клиентской программы, использующей его, или любой другой способ
запуска процесса.
Отладчик MiniM Debugger не использует устройства ввода-вывода
отлаживаемого процесса, и процесс исполняется в своем естественном

402 ГЛАВА 5. ОБРАБОТКА ОШИБОК
контексте, как есть.
Отсоединение от отлаживаемого процесса производится независимо
от способа его запуска, был ли запущен новый процесс или отладчик
присоединился к уже запущенному.
Точно также, независимо от способа запуска отлаживаемого процесса производится его принудительное завершение по команде отладчика.
Таким образом, отладчик MiniM Debugger может терминировать выполнение произвольного процесса.
К функциям отладчика MiniM Debugger относятся:
1. Attach - присоединение к имеющемуся процессу или запуск нового,
или ожидание запуска нового.
2. Run - продолжить выполнение процесса пока он не остановится на
точке останова.
3. Pause - остановить выполнение процесса в его текущей точке выполнения.
4. Reset - принудительно завершить процесс.
5. Detach - отсоединиться от отлаживаемого процесса, после чего процесс продолжает свое выполнение естественным образом, без остановов на точках останова.
6. Step Over - выполнить строку команд, либо выполнить строку команд без входа на более глубокий уровень стека, либо выйти на
предыдущий уровень стека в зависимости от хода выполнения процесса.
7. Step Into - выполнить строку команд, либо войти при ее выполнении на более глубокий уровень стека, либо выйти на предыдущий
уровень стека, в зависимости от хода выполнения процесса.
8. Run to Cursor - выполнять процесс пока не остановится на строке
где назодится курсор, без создания отдельной точки останова, либо
пока не остановится на иной заданной точке останова.
Отладчик MiniM Debugger показывает о процессе его состояние в
виде текущего стека исполнения, список установленных точек останова,
список вычисляемых выражений и их значения в процессе в состоянии
останова, и предопределенный список системных переменных процесса.
Точки останова могут быть объявлены или сняты независимо от того, исполняется ли отлаживаемый процесс, или остановлен отладчиком.

5.7. MINIM DEBUGGER 403
Если точки останова объявлены в редакторе MiniM Routine Editor, то
по завершению процесса и старте нового все они будут применены также к новому процессу и не будут утрачены с локальными переменными
завершившегося процесса.
Точки останова могут быть установлены только на строку в рутине,
и точке нельзя добавить условие срабатывания. Точки останова на изменение переменных не могут быть установлены.
Отладчик MiniM Debugger может отлаживать только непосредственный исполняемый код, и точки останова могут быть установлены только
в рутинах типа INT.
Выражения для просмотра их значений (Watch) могут быть добавлены как из списка выражений, так и из редактора кода командой основного меню.
Отладчик MiniM Debugger может показывать значения локальных
переменных и выражений во всплывающей строке подсказки в состоянии останова. Значение показывается при наведении курсора на имя локальной переменной или при наведении на выделенный фрагмент текста.
В случае если синтаксически это выражение соответствует значимому
с точки зрения языка MUMPS и вычисляется как строка, то значение
показывается во всплывающей подсказке (Tooltip Evaluation).
Эта функциональность использует лишь фрагмент текста, если он
синтаксически является именем локальной переменной (в этом случае
выделение текста необязательно), либо выделенный фрагмент текста без
учета какой именно синтаксической конструкции он принадлежит. В
частности, может быть выделен фрагмент имени рутины как несколько символов, но Tooltip Evaluation получит в качестве синтаксической
конструкции последовательность латинских символов, что синтаксически соответствует имени локальной переменной. Tooltip Evaluation может
вычислить как простые значения, так и значения выражений произвольной сложности.
Вычисление выражений производится в контексте отлаживаемого процесса, и, если при вычислении выполняется побочное действие, то оно
также останется в контексте процесса, например модификация глобальных или локальных переменных при вычислении выражения с функцией
$INCREMENT(). Таким образом, программист может написать дополнительные собственные функции на языке MUMPS, чтобы при их вычислении производился побочный эффект в виде присваивания, для модификации переменных из отладчика, равно как и специальные функции
декодирования данных для показа значений в необходимом программисту виде.
Отладчик MiniM Debugger работает в режиме только построчного

404 ГЛАВА 5. ОБРАБОТКА ОШИБОК
пошагового исполнения отлаживаемого процесса, или переходит либо на
уровень стека ниже, либо на уровень стека выше.
По клавишным комбинациям отладчик MiniM Debugger максимально
приближен к продуктам Borland (Delphi, C++ Builder).
5.8 Cach´e Debugger
Отладчик Cach´e Debugger встроен в редактор исходного кода Cach´e
Studio. Отладчик поставляется бесплатно в составе инсталлятора Cach´e
и всегда соответствует по своей версии той же версии Cach´e. Использование отладчика Cach´e Debugger из одной версии Cach´e с другой версией
Cach´e не рекомендуется из-за возможных отличий в нюансах версий.
Интерфейс отладчика выполнен как часть Cach´e Studio, соответственно вне зависимости от версии операционной системы на которой
работает сервер, отладчик работает на операционной системе Windows.
При этом отладчику не важно, выполняется отлаживаемый процесс на
том же или на другом компьютере.
Отладчик Cach´e Debugger может подключиться к имеющемуся на
сервере процессу Cach´e, запустить новый процесс, или запустить новый
для выполнения ZEN или CSP страницы.
Новый процесс, запущенный с указанной метки, выполняется как
новый JOB, и имеет устройством ввода-вывода по умолчанию такое, которое используется отладчиком Cach´e Debugger для показа вывода процесса. Обычно таким устройством является устройство типа |TCP| или
терминал. Если отлаживаемый процесс обращается к команде READ, то
выполнение такой команды останавливает процесс и переводит в ожидание, в котором программист не может ничего ввести. Для этого случая
есть команда отладчика Interrupt, выполнение которой прерывает выполнение текущей исполняемой команды с переходом к следующей. Команды WRITE выполняются корректно, и весь вывод, включая служебный
вывод отладчика, отображается в специальном окне Output.
К функциям отладчика Cach´e Debugger относятся:
1. Attach - присоединиться к указанному имеющемуся процессу.
2. Go - запустить выполнение процесса далее пока не сработает условие останова. Если не было текущего отлаживаемого процесса, то
отладчик запускает новый, как указано в опциях запуска нового
процесса.

5.8. CACH´E DEBUGGER 405
3. Restart - завершает выполнение текущего процесса и запускает
новый как указано в опциях запуска нового процесса.
4. Stop - заканчивает текущую сессию отладки в зависимости от способа присоединения к отлаживаемому процессу - если было присоединение к уже имеющемуся, то процесс продолжает работу без
отладчика, если был запущен новый, то процесс завершает работу.
5. Break - остановить выполнение процесса в его текущей точке выполнения, где бы он ни находился.
6. Interrupt - прервать выполнение текущей выполняемой команды.
7. Step Into - выполнить очередную команду и остановиться перед
следующей, а также выполнить вход в процедуру или функцию на
один уровень стека глубже или на следующую итерацию цикла.
8. Step Over - выполнить текущую команду и остановиться перед
следующей, при этом пропустить вызов процедуры или функции,
создающей при выполнении уровень стека, или остановиться на команде, следующей за блоком команд (после безаргументной формы
DO).
9. Step Out - выполнить шаг на один уровень стека выше для блока
команд или вызова функции или процедуры, и остановиться на
следующей команде на предыдущем уровне стека.
10. Run to Cursor - выполнять процесс пока не остановится на строке
где назодится курсор, без создания отдельной точки останова, либо
пока не остановится на иной заданной точке останова.
Отладчик Cach´e Debugger показывает о процессе его состояние в
виде текущего стека исполнения, список установленных точек останова,
список вычисляемых выражений и их значения в процессе в состоянии
останова.
Точки останова могут быть установлены как на место в коде, так и
на локальные переменные. Точка останова по строке проверяется при
передаче управления на первую команду в этой строке, а точка останова по локальной переменной проверяется при любом изменении этой
локальной переменной, любого ее узла. Оба типа точек останова могут иметь необязательные условия останова, при выполнении которых
отладчик останавливает процесс. Если условие останова не указано, то
условие считается всегда истинным. Если указано, то рассматривается

406 ГЛАВА 5. ОБРАБОТКА ОШИБОК
как выражение на языке Cache Object Script и вычисляется. В этом случае точка останова активируется, если это выражение вычислилось как
истина.
Точки останова могут быть объявлены или сняты независимо от того, исполняется ли отлаживаемый процесс, или остановлен отладчиком.
Если точки останова объявлены в редакторе Cach´e Studio, то по завершению процесса и старте нового все они будут применены также к новому
процессу и не будут утрачены с локальными переменными завершившегося процесса.
Старшие версии Cach´e Debugger могут использовать для установки
точек останова не только рутины типа INT, но и рутины препроцессора
типа MAC, и корректно относиться к строкам, которые после препроцессирования не присутствуют в получаемой INT рутине.
Для добавления в список выражений для просмотра их значений надо
включить показ окна Watch, и переместить путем Drag-n-Drop фрагмент
текста в список окна Watch. Этот фрагмент текста впоследствии можно
отредактировать.
Отладчик Cach´e Debugger работает в режиме пошагового прохождения по отдельной команде, или переходит либо на уровень стека ниже,
либо на уровень стека выше.
По клавишным комбинациям отладчик Cach´e Debugger максимально
приближен к продукту Microsoft Visual Studio.
Отладчик Cach´e Debugger всегда доступен разработчику при установке клиентской части Cach´e под Windows и при работе с сервером
Cach´e той же версии. Сервер Cach´e при этом может работать под любой
поддерживаемой Cach´e операционной системой.
5.9 Serenji Debugger
Serenji Debugger - это самостоятельный коммерческий продукт, появившийся много лет назад, и работающий с различными MUMPS системами. На момент написания книги он поддерживает следующие MUMPS
системы:
1. Cach´e 4.0 или старше
2. GT.M 4.3-000 или старше
3. DSM 7.1 или старше
4. M21 2.14 или старше

5.9. SERENJI DEBUGGER 407
5. MSM 4.4 или старше
Кроме функций отладчика этот продукт является также полноценным GUI редактором исходного кода с подсветкой синтаксиса и может
работать с поддерживаемыми MUMPS системами как локально, так и
удаленно по TCP/IP.
К возможностям отладчика Serenji Debugger относится возможность
отладки самых различных типов процессов, это могут быть терминальные процессы, фоновые процессы, а также процессы, обслуживающие
WEB страницы ZEN, CSP и WebLink в Cach´e, MSM-Activate в MSM, и
приложения Visual M.
Клиентская часть Serenji Debugger выполнена в виде стандартного
многооконного Windows приложения и работает на множестве операционных систем Windows. В настоящее время продукт непрерывно развивается и совершенствуется, и часть ранних операционных систем Windows
снята с поддержки из-за отказа Microsoft их далее официально поддерживать.
По клавишным комбинациям отладчик Serenji Debugger максимально
приближен к продукту Microsoft Visual Basic.
Отладчик поддерживает установку и снятие отладочной точки останова, просмотр стека, локальных переменных, список установленных точек
останова, и возможность ввода и исполнения команд в контексте останова. При этом вывод исполняемых команд может быть показан в окне
отладчика.
К функциям прохождения отлаживаемого процесса относятся функции:
1. Step in
2. Step over
3. Step out
4. Run to cursor
5. Go
6. Fast forward
К интересной возможности отладчика относится возможность переключения пошагового исполнения между режимами по каждой команде
и по каждой строке команд.
Точки останова отладчика могут быть установлены с условиями:

408 ГЛАВА 5. ОБРАБОТКА ОШИБОК
1. Условие в виде выражения, при выполнении которого точка останова приводит к останову и переключению в отладчик.
2. Отложенный останов на заданное число срабатываний, после которого останов выполняется.
3. Точка останова на условие изменения данных.
4. Обычная точка останова, срабатывающая всегда.
5. Останов при переходе процесса в состояние ошибки.
6. Останов при начале выполнения процесса.
7. Однократный останов без запоминания точки останова (Run to
cursor).
Точки останова могут быть установлены или сняты независимо от того, исполняется ли отлаживаемый процесс, или остановлен отладчиком,
при этом нет ограничения на число установленных точек останова. Если
точки останова объявлены в редакторе Serenji Debugger, то по завершению процесса и старте нового все они будут применены также к новому
процессу и не будут утрачены с локальными переменными завершившегося процесса.
Как уже было сказано, отладчик Serenji Debugger является активно
развиваемым продуктом и его разработчики тщательно и очень внимательно относятся к выявляемым в продукте проблемам и к самым малейшим нюансам совместимости с различными реализациями как MUMPS
систем, так и операционных систем. Продукт выпускается независимо от
производителей MUMPS систем, и с выходом новых их версий при необходимости повторно адаптируется под возможные изменения в версиях
MUMPS систем и операционных систем.

Глава 6
Внешний мир
6.1 Общие принципы
С самого начала в языке MUMPS присутствовали встроенные в язык
команды ввода-вывода, команды открытия, закрытия и переключения
устройств ввода-вывода. За многие годы развития компьютерных систем
MUMPS системы применяли появлявшиеся новые технологии и способы
взаимодействия программ в виде все тех же устройств ввода-вывода.
При появлении в будущем других новых технологий взаимодействия они
также могут быть использованы в MUMPS системах путем добавления
еще одного типа устройства и, с большой долей вероятности, с полным
сохранением общей модели ввода-вывода.
Как уже было описано в разделе команд ввода-вывода, в MUMPS
системах основная модель ввода-вывода - это модель последовательных
устройств. Устройство в зависимости от его физического типа и способа открытия может поддерживать запись (данные выходят за пределы
процесса), чтение (данные поступают в процесс) или и чтение и запись.
При и чтении и записи устройство производит автоматическое позиционирование в потоке на длину прочитанных или записанных данных.
В отдельных специальных случаях так называемых блочных устройств
или при открытии устройства в блочном режиме чтение и запись приводят к чтению и записи одного блока. Размер одного блока задается либо
типом устройства либо режимом его открытия. Вне зависимости от того, что устройство является последовательным, команде чтения строки
можно указать длину последовательности, которую необходимо прочитать.
В отличие от обычных функций нижнего уровня распространенных
языков программирования, команда чтения строки в MUMPS при ука-
409

410 ГЛАВА 6. ВНЕШНИЙ МИР
зании длины чтения действительно ожидает приема входных данных
на всю указанную длину, а команда записи записывает всю указанную
строку.
Что интересно, для команды чтения может быть указан таймаут ожидания, и команда вернет прочитанную последовательность либо если
получена указанная длина, либо если истек таймаут. Таким образом, в
MUMPS можно соединить пространство и время. Чтение с таймаутом
используется, например, в интерактивном вводе в терминальных программах - процесс время от времени читает что было нажато с указанием таймауа, и если не было нажатий то продолжает отображение или
обработку данных, иначе переходит к обработке нажатой клавиши.
Кроме штатно поддерживаемых устройств ввода-вывода, для тех случаев, когда нет способа организовать обмен данными последовательно из-за физического принципа действия, например UDP/IP, или когда
необходимо обращаться к устройству для чтения его параметров состояния, в MUMPS системах используются либо специальные системные
функции, либо обращение к функциям во внешних подключаемых модулях (DLL, SO), либо MUMPS система может предоставить тот же
интерфейс через SSVN.
В модели устройств MUMPS инициатором обмена данными всегда
выступает процесс MUMPS, переходя к чтению или записи данных. В
случае если необходимо организовывать обмен данными по инициативе
сторонней программы, нужно организовать процесс MUMPS так, чтобы
он проверял, нет ли входных данных для обработки. Нужно учитывать,
что в модели процессов MUMPS в настоящее время отсутствует многопоточность в понимании выполнения нескольких последовательностей
команд в рамках одного процесса или событийность с прерываниями.
Модель событий и асинхронной активации MUMPS процессов предлагалась и рассматривалась в комитете по стандартизации MDC, и частично модель описана в стандарте как предложение к применению, но
ни одна MUMPS система в действительности таких способов активации
и выполнения не поддерживает.
6.2 Терминальный интерфейс
Отдельно и несколько особняком от общего ввода-вывода стоит терминальный интерфейс. В нем команда чтения выполняется внутренним кодом процесса, при этом для терминального интерфейса переход к исполнению введенной команды и возврат управления заканчивается восстановлением текущего устройства, чтобы можно было ввести следующую
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
