Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MUMPS СУБД. Практика применения и опыт программирования.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
Е. Каратаев
MUMPS СУБД
Практика применения
и опыт программирования
СОЛОН-ПРЕСС
2021
УДК 621.396.218 ББК 32.884.1
Каратаев Е.
MUMPS СУБД. — М.: СОЛОН-ПРЕСС, 2021. — 550 с.
Книга описывает среду исполнения, принципы организации данных в MUMPS системах и технически евопросы их применения. Описываются языковые средства, принципы обработки ошибок, алгоритмика работы с ин­дексами, принципы внешнего взаимодействия и многое другое.
Книга может быть полезна как квалифицированным разработчикам в ви­де справочника, так и изучающим компьютерные технологии.
Издание интересно преподавателям и студентам профильных специаль­ностей вузов.
УДК 621.396.218 ББК 32.884.1
Сайт журнала «Ремонт & Сервис»: www.remserv.ru
Сайт издательства «СОЛОН-ПРЕСС»: www.solon-press.ru
КНИГА ПОЧТОЙ
Книги издательства «СОЛОН-ПРЕСС» можно заказать наложенным платежом (оплата
при получении) по фиксированной цене. Заказ оформляется одним из трех способов:
1. Послать открытку или письмо по адресу: 123001, Москва, а/я 82.
2. Оформить заказ можно на сайте www.solon-press.ru в разделе «Книга — почтой».
3. Заказать по тел. (495) 617-39-64, (495) 617-39-65. Каталог издательства высылается по почте бесплатно.
При оформлении заказа следует правильно и полностью указать адрес, по которому долж­ны быть высланы книги, а также фамилию, имя и отчество получателя. Желательно указать дополнительно свой телефон и адрес электронной почты.
Через Интернет вы можете в любое время получить свежий каталог издательства «СОЛОН-ПРЕСС», считав его с адреса www.solon-press.ru/kat.doc.
Интернет-магазин размещен на сайте www.solon-press.ru.
По вопросам приобретения обращаться:
ООО «ПЛАНЕТА АЛЬЯНС»
Тел: (499) 782-38-89,
www.alians-kniga.ru
ISBN 978-5-91359-174-6 © Обложка «СОЛОН-ПРЕСС», 2021
© Каратаев Е., 2021
Оглавление
Предисловие 9
Введение 11
1 Среда исполнения 13
1.1 Команды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.1 Команды присваивания . . . . . . . . . . . . . . . . 18
1.1.2 Условные команды . . . . . . . . . . . . . . . . . . . 26
1.1.3 Команды передачи управления . . . . . . . . . . . . 33
1.1.4 Команды ввода-вывода . . . . . . . . . . . . . . . . 41
1.1.5 Служебные команды . . . . . . . . . . . . . . . . . . 50
1.1.6 Постусловия . . . . . . . . . . . . . . . . . . . . . . 53
1.2 Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
1.3 Переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
1.4 Числа и строки . . . . . . . . . . . . . . . . . . . . . . . . . 67
1.5 Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
1.5.1 $DATA . . . . . . . . . . . . . . . . . . . . . . . . . 74
1.5.2 $GET . . . . . . . . . . . . . . . . . . . . . . . . . . 76
1.5.3 $ORDER . . . . . . . . . . . . . . . . . . . . . . . . 77
1.5.4 $NEXT . . . . . . . . . . . . . . . . . . . . . . . . . 79
1.5.5 $QUERY . . . . . . . . . . . . . . . . . . . . . . . . 80
1.5.6 $NAME . . . . . . . . . . . . . . . . . . . . . . . . . 83
1.5.7 $QLENGTH . . . . . . . . . . . . . . . . . . . . . . 85
1.5.8 $QSUBSCRIPT . . . . . . . . . . . . . . . . . . . . 86
1.5.9 $ASCII . . . . . . . . . . . . . . . . . . . . . . . . . 88
1.5.10 $CHAR . . . . . . . . . . . . . . . . . . . . . . . . . 91
1.5.11 $EXTRACT . . . . . . . . . . . . . . . . . . . . . . . 93
1.5.12 $PIECE . . . . . . . . . . . . . . . . . . . . . . . . . 94
1.5.13 $LENGTH . . . . . . . . . . . . . . . . . . . . . . . 96
1.5.14 $REVERSE . . . . . . . . . . . . . . . . . . . . . . . 98
1.5.15 $FIND . . . . . . . . . . . . . . . . . . . . . . . . . 98
3
4 ОГЛАВЛЕНИЕ
1.5.16 $TRANSLATE . . . . . . . . . . . . . . . . . . . . . 99
1.5.17 $JUSTIFY . . . . . . . . . . . . . . . . . . . . . . . 102
1.5.18 $FNUMBER . . . . . . . . . . . . . . . . . . . . . . 104
1.5.19 $TEXT . . . . . . . . . . . . . . . . . . . . . . . . . 106
1.5.20 $RANDOM . . . . . . . . . . . . . . . . . . . . . . . 108
1.5.21 $VIEW . . . . . . . . . . . . . . . . . . . . . . . . . 109
1.5.22 $SELECT . . . . . . . . . . . . . . . . . . . . . . . . 109
1.5.23 $STACK . . . . . . . . . . . . . . . . . . . . . . . . . 111
1.6 Списковые функции . . . . . . . . . . . . . . . . . . . . . . 113
1.7 Битовые функции . . . . . . . . . . . . . . . . . . . . . . . 119
1.8 Модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
1.9 Рутины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
1.10 Передача параметров . . . . . . . . . . . . . . . . . . . . . 131
1.11 Неопределенные значения . . . . . . . . . . . . . . . . . . . 135
1.12 Шаблоны . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
1.13 Косвенность . . . . . . . . . . . . . . . . . . . . . . . . . . 143
1.13.1 Косвенность имени . . . . . . . . . . . . . . . . . . 146
1.13.2 Косвенность индексов . . . . . . . . . . . . . . . . . 147
1.13.3 Косвенность метки . . . . . . . . . . . . . . . . . . . 149
1.13.4 Косвенность аргумента . . . . . . . . . . . . . . . . 151
1.13.5 Косвенность шаблона . . . . . . . . . . . . . . . . . 153
1.14 Интерпретатор . . . . . . . . . . . . . . . . . . . . . . . . . 154
1.15 Голая ссылка . . . . . . . . . . . . . . . . . . . . . . . . . . 163
1.16 Очередность выполнения . . . . . . . . . . . . . . . . . . . 167
1.16.1 Очередность вычисления выражений . . . . . . . . 168
1.16.2 Очередность вычисления имен . . . . . . . . . . . . 169
1.17 Стекование $test . . . . . . . . . . . . . . . . . . . . . . . . 172
1.18 Комментарий . . . . . . . . . . . . . . . . . . . . . . . . . . 175
1.19 Стандарт и расширения . . . . . . . . . . . . . . . . . . . . 177
2 Глобалы 183
2.1 B-дерево . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
2.2 Кодирование индексов . . . . . . . . . . . . . . . . . . . . . 187
2.3 Размер блока . . . . . . . . . . . . . . . . . . . . . . . . . . 193
2.4 Кеширование блоков . . . . . . . . . . . . . . . . . . . . . . 198
2.5 Структуры . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
2.6 Индексация . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
2.7 Группировка . . . . . . . . . . . . . . . . . . . . . . . . . . 210
2.8 Каноничность индексов . . . . . . . . . . . . . . . . . . . . 220
2.9 Маппинг . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
ОГЛАВЛЕНИЕ 5
3 Индексация данных 227
3.1 Общие принципы . . . . . . . . . . . . . . . . . . . . . . . . 227
3.2 Механизм поддержки индекса . . . . . . . . . . . . . . . . 228
3.3 Простой индекс . . . . . . . . . . . . . . . . . . . . . . . . . 230
3.4 Составной индекс . . . . . . . . . . . . . . . . . . . . . . . 233
3.5 Покрывающий индекс . . . . . . . . . . . . . . . . . . . . . 237
3.6 Кластерный индекс . . . . . . . . . . . . . . . . . . . . . . 241
3.7 Хеш-индекс . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
3.8 Битмап индекс (bitmap) . . . . . . . . . . . . . . . . . . . . 247
3.9 Битслайс индекс (bitslice) . . . . . . . . . . . . . . . . . . . 252
3.10 Нормирование значений . . . . . . . . . . . . . . . . . . . . 260
3.11 Выборки по индексу . . . . . . . . . . . . . . . . . . . . . . 262
3.12 Многоиндексная выборка (zig-zag) . . . . . . . . . . . . . . 265
3.13 Дифференциальное индексирование . . . . . . . . . . . . . 269
3.14 Индексация длинных атрибутов . . . . . . . . . . . . . . . 272
3.15 Межтабличный индекс . . . . . . . . . . . . . . . . . . . . 275
3.16 Индекс с условием на вставку . . . . . . . . . . . . . . . . 279
3.17 Индекс на вычисляемый атрибут . . . . . . . . . . . . . . . 282
3.18 Индекс поиска по фрагменту . . . . . . . . . . . . . . . . . 284
3.19 Индексация для шаблона (like) . . . . . . . . . . . . . . . . 287
3.20 Индексация уникального атрибута . . . . . . . . . . . . . . 292
3.21 Массовое перестроение индексов . . . . . . . . . . . . . . 295
3.22 Операции с древовидными индексами . . . . . . . . . . . . 298
3.23 Операции с битовыми индексами . . . . . . . . . . . . . . 303
3.24 Совмещение древовидных и битовых индексов . . . . . . . 308
3.25 Сортировка по индексу . . . . . . . . . . . . . . . . . . . . 312
3.26 Статистики и кардинальность . . . . . . . . . . . . . . . . 318
4 Конкурентный доступ 323
4.1 Параллельность выполнения . . . . . . . . . . . . . . . . . 323
4.2 Блокировки . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
4.3 Транзакции . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
4.4 Блокировки в транзакциях . . . . . . . . . . . . . . . . . . 336
4.5 Функция $INCREMENT . . . . . . . . . . . . . . . . . . . 340
4.6 Функция $BIT . . . . . . . . . . . . . . . . . . . . . . . . . 343
4.7 Дедлоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
4.8 TSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
6 ОГЛАВЛЕНИЕ
5 Обработка ошибок 353
5.1 Состояние ошибки . . . . . . . . . . . . . . . . . . . . . . . 353
5.2 ZTRAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
5.2.1 Cach´e . . . . . . . . . . . . . . . . . . . . . . . . . . 358
5.2.2 MSM . . . . . . . . . . . . . . . . . . . . . . . . . . 364
5.2.3 DTM . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
5.2.4 M3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
5.2.5 GT.M . . . . . . . . . . . . . . . . . . . . . . . . . . 365
5.2.6 MiniM . . . . . . . . . . . . . . . . . . . . . . . . . . 369
5.3 ETRAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
5.3.1 Определение . . . . . . . . . . . . . . . . . . . . . . 371
5.3.2 $ETRAP . . . . . . . . . . . . . . . . . . . . . . . . 372
5.3.3 $ECODE . . . . . . . . . . . . . . . . . . . . . . . . 375
5.3.4 $ESTACK . . . . . . . . . . . . . . . . . . . . . . . . 379
5.3.5 Ошибки в обработчике ошибок . . . . . . . . . . . 381
5.4 $STACK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
5.5 Трассировка . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
5.6 BREAK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
5.7 MiniM Debugger . . . . . . . . . . . . . . . . . . . . . . . . 401
5.8 Cach´e Debugger . . . . . . . . . . . . . . . . . . . . . . . . 404
5.9 Serenji Debugger . . . . . . . . . . . . . . . . . . . . . . . . 406
6 Внешний мир 409
6.1 Общие принципы . . . . . . . . . . . . . . . . . . . . . . . . 409
6.2 Терминальный интерфейс . . . . . . . . . . . . . . . . . . . 410
6.3 Сокеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
6.4 WEB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
6.4.1 HTTP клиент . . . . . . . . . . . . . . . . . . . . . . 424
6.4.2 Вебсервер на MUMPS . . . . . . . . . . . . . . . . 425
6.4.3 CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
6.4.4 WebLink . . . . . . . . . . . . . . . . . . . . . . . . . 430
6.4.5 MWA . . . . . . . . . . . . . . . . . . . . . . . . . . 433
6.4.6 CSP . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
6.4.7 Проблемы HTTP . . . . . . . . . . . . . . . . . . . . 437
6.4.8 Поверх HTTP . . . . . . . . . . . . . . . . . . . . . 441
6.5 Подключаемые DLL (SO) . . . . . . . . . . . . . . . . . . . 444
6.6 Файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
6.7 Внешние процессы . . . . . . . . . . . . . . . . . . . . . . . 451
6.8 Порты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
ОГЛАВЛЕНИЕ 7
7 Практика применения 457
7.1 Терминальный режим . . . . . . . . . . . . . . . . . . . . . 457
7.2 Редакторы рутин . . . . . . . . . . . . . . . . . . . . . . . . 459
7.3 Экспорт и импорт . . . . . . . . . . . . . . . . . . . . . . . 461
7.4 Препроцессор . . . . . . . . . . . . . . . . . . . . . . . . . . 471
7.5 Формат $HOROLOG . . . . . . . . . . . . . . . . . . . . . 478
7.6 Опции устройств . . . . . . . . . . . . . . . . . . . . . . . . 482
7.7 $X и $Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
7.8 Возврат результатов . . . . . . . . . . . . . . . . . . . . . . 486
7.8.1 Возврат по значению ($$) . . . . . . . . . . . . . . 487
7.8.2 Возврат по ссылке . . . . . . . . . . . . . . . . . . . 488
7.8.3 Запись в предопределенную переменную . . . . . . 489
7.8.4 Возврат значений косвенно . . . . . . . . . . . . . . 490
7.8.5 Итеративный возврат . . . . . . . . . . . . . . . . . 492
7.8.6 Потоковый возврат . . . . . . . . . . . . . . . . . . . 493
7.9 %Z - рутины . . . . . . . . . . . . . . . . . . . . . . . . . . 494
7.10 Планирование файлов . . . . . . . . . . . . . . . . . . . . . 496
7.11 Память и сборка мусора . . . . . . . . . . . . . . . . . . . . 498
7.12 Предсказуемость . . . . . . . . . . . . . . . . . . . . . . . . 504
7.13 Переносимость . . . . . . . . . . . . . . . . . . . . . . . . . 505
A Команды MUMPS 515
B Системные переменные MUMPS 517
C Системные функции MUMPS 519
D Стандартные коды ошибок 521
E ASCII Table 523
F Mнемоники ANSI X3.64 527
G ANSI Escape Sequences (ENG) 531
H ANSI Escape Sequences - VT100 / VT52 (ENG) 539
Предметный указатель 544
Литература 549

Предисловие

Во многом современный мир становится более разнообразным, чем был раньше. История знает периоды, когда становились доминирующими од­ни концепции систем баз данных, потом другие. И, пройдя сквозь мно­гие годы, технология систем баз данных, заложенная в системах клас­са MUMPS, показала свою практичность и нацеленность на результат. Многие системы баз данных черпали из неё идеи и концепции, реализуя отдельные части её возможностей и основываясь на вполне прочном и проверенном фундаменте.
В настоящее время в практику применения входят самые разнооб­разные концепции систем баз данных и самые разнообразные принципы и способы их организации. И все это время, с момента создания при­мерно 40 лет назад, разработчики на языке MUMPS применяли разви­тые концепции и обеспечивали долгую жизнь своим разработкам. Видя современные, и не очень, принципы организации данных, выдаваемые за новые, многие из MUMPS программистов воспринимают их как су­щественно урезанные по возможностям, чем давно применяемые ими MUMPS системы.
Много лет назад, видя сколь редко выходят книги по системам баз данных MUMPS, мне хотелось, чтобы появилась такая книга, которая бы могла быть использована и как обзорная для квалифицированных разработчиков, перед которыми стоит задача выбора, и как справочная по отдельным техническим вопросам для программистов, которым необ­ходимо разобраться в редких малоописанных темах, и как ознакомитель­ная для изучающих компьютерные технологии в области баз данных.
Со временем пришло решение взяться за написание такой книги са­мостоятельно. В основу книги легли как набор статей по техническим вопросам применения MUMPS систем, так и статьи с описанием языка и среды исполнения.
Многому, отраженному в книге, я научился у тех, с кем вместе ра­ботал, и описанный в книге материал отражает опыт многих людей и решенных головоломок в самых различных проектах.
9
10 ОГЛАВЛЕНИЕ
По своему образованию я не писатель, а разработчик, и, конечно, вижу мир со специфической стороны. Отдельные части книги писались намного более дотошно, чем другие, что отражает предпочтения в систе­ме ценностей разработчика. Не являясь преподавателем, я не ставил це­лей получить полноценный учебник с поучающими разделами "Резюме" и с разделами контрольных вопросов. Думается, что хороший задачник с примерами еще должен быть написан.
Написание книги на языке, не являющемся языком программирова­ния, для программистов - это большая работа, и в ней важна была мо­ральная поддержка тех, с кем работал и с кем знаком. Как это принято при написании предисловий, выражаю благодарность всем, к то поддер­живал и одобрял эту работу.
Надеюсь, что книга получилась и интересной, и полезной.
Евгений Каратаев
Москва, 2012.