Имеется 64 региста ввода/вывода, 64 регистра базы, 64 регистра работ, 64 регистра стиля.
Каждый регистр имеет односимвольное имя, символы для имен:
[0-9a-zA-Z_].
Этих имен всего 63 штуки, потому один из регистров в каждом наборе
поименован быть не может, потому недоступен. То есть зарезервирован
для расширений. Если он реально встречается в программе,
то в дампе он именуется символом -,
но именем этот символ не является.
Регистры ввода/вывода многофункциональны. В них может заноситься результат команды, из них могут браться входные данные команды и управление. В этих регистрах могут храниться следующие сущности:
Pf)
Pt)
Pq)
Pm)
Po)
Первые 4 сущности могут участвовать в преобразованиях значений. Если в регистре есть информация, то одна из форм помечается как первоисточник, другие формы в регистре являются производными. Если требуется приведение к форме, отсутствующей в регистре, то источником информации для новой формы может послужить как первоисточник, так и какая либо из производных имеющихся в регистре форм. Описание приведения в зависимости от использования регистра в команде приведено ниже.
Если в регистре ввода-вывода имеется выходной поток, то никакие значения в нем не удерживаются, а разгружаются в этот поток после исполнения каждой команды.
При запуске pgoblin
на 0й регистр ввода/вывода
помещаются входной поток (из стека, или, если пуст,
stdin)
и stdout.
Остальные регистры ввода-вывода при старте pgoblin
пусты, при форке все регистры ввода-вывода в родительском
и порожденном процессах идентичны.
Поскольку вывод (OUT),
управление (CTL)
и ввод (IN) - регистры одного
пула, то через эти регистры команды могут
передавать результаты на вход или управление последующим
командам. Поведение команд, у которых выходной регистр
ввода/вывода совпадает со входным или контрольным,
и при этом в регистрах используются не потоки, не определено.
При завершении pgoblin
все открытые на регистрах ввода/вывода
файлы, помеченные к закрытию, закрываются, все остальное
содержимое регистров ввода/вывода теряется.
В регистрах базы содержатся соединения с базами.
Там определена не только СУБД, но и конкретная база,
к которой отправляются запросы, и другие параметры.
Все параметры командной строки отправляются
в регистр базы 0.
Для остальных регистров СУБД регистра 0
является СУБД по умоляанию.
Соединение с базой устанавливается только когда оно
впервые потребовалось, на том регистре, на котором
оно затребовано. Параметры соединения сейчас можно
задавать для регистра 0
через стандартные опции pq
при вызове pgoblin.
Так же на все соединения действуют переменные окружения
в соответствии с клиентскими библиотеками СУБД.
Параметры соединений с базами на любом регистре могут
задаваться в соответствующей соманде #connect.
При запуске 0й регистр базы
заполняется параметрами соединения, но не открывается, пока не потребуется.
Вполне возможны программы на pgoblin,
которые работают без СУБД.
При форке порожденный процесс получает регистры баз с таким же содержимым, как и родитель, но все установленные соединения с СУБД помечаются как не "свои", и при завершении порожденного процесса они не будут закрыты.
При завершении pgoblin
все соединения с базами на открытых регистрах базы,
которые были открыты текущим процессом,
закрываются, если иное не задано в команде #exit.
Все регистры работ предназначены для интерфейса с ОС. Через них есть доступ к файловой системе, наблюдение за процессами-потомками, в них есть списки номеров процессов с кодами завершения (или -1, если код завершения (еще) не получен) и номерами команд, которые эти процессы породили. Длинна списка практически неограничена.
0й регистр работ
заполняется номерами родительского и текущего процессов.
Номера команд и коды завершения у них -1.
Процессы могут только добавляться в регистр работ, порядок процессов в регистре соответствует порядку, в котором процессы добавлялись.
Все процессы, порожденные неявным форком,
заносятся в 0й регистр работ.
Регистр стиля может содержать правила оформления выводимых таблиц
и коллекцию именованных значений. В регистре стиля 0
всегда содержится экземпляр стиля 0,
в котором коллекция именованных значений пуста, а таблицы выводятся
конкатенацией всех значений всех полей во всех строках по порядку.
Остальным регистрам стиля могут присваиваться произвольные стили.
Каждой команде передаются номера 6ти регистров
OUT)
CTL)
IN)
CON)
JOB)
STY)
Если какой либо регистр в команде должен использоваться, но не указан,
то используется регистр по умолчанию - 0.
Выполнение каждой команды начинается с подготовки регистров, с которыми команда работает. Последовательность подготовки регистров совпадает с последовательностью их записи в программе:
После подготовки регистров исполняется команда, возможно, с неявным форком, если это определено на этапе подготовки регистров.
Если в процессе подготовки или выполнения команды случилась
ошибка, то управление передается в секцию #trap,
если такая была определена до возникновения ошибки,
иначе выполняется #return.
Если команда помещает в выходной регистр ввода-вывода какое-либо
значение, и у этого регистра определен выход, то после выполнения
команды этот регистр разгружается. Регистр ввода-вывода 0
практически всегда имеет выход в stdout,
потому результаты, отправленные в этот регистр, выводятся.
OUT - выходной регистр ввода-вывода
В этот регистр, как правило, помещается результат (в описании
команд стоит пометка Po
в OUT),
но некоторые команды переоформляют этот регистр (без пометки
Po).
Команда может поместить в регистр текст (Po Pt),
имя файла (Po Pf),
таблицу (Po Pq)
или поток (Po Pm).
Если в регистре уже существовал Pt
или Pq, то они разрушатся.
Если в регистре существовал Pf,
то он преобразуется в поток (Pm)
в файл, заданный Pf.
Если имя файла внесено в регистр командой #file,
то файл замещается, если же командой #cat,
то файл дописывается.
Во вновь созданный или ранее существовавший поток Pm
произойдет выгрузка помещаемого значения
Pt
выгружается непосредственно.
Pf
выгружает файл с заданным именем.
Pq
выгружается стилем 0.
Если в регистре нет ни выходного потока, ни имени файла,
то при исполнении команды делается неявный форк
и поток создается с выхода команды на Pm
родительского процесса. Номер процесса при неявном форке помещается
в 0й регистр работ.
CTL - управляющий регистр ввода-вывода
Как правило, из этого регистра берется управляющая информация
для команды, например, SQL команды для обращающихся к СУБД команд
pgoblinа.
Если указан регистр 0,
то это текст - литерал, который следует за командой
pgoblinа.
Для команды exec,
которая требует Pq,
при использовании 0го
регистра значение собирается из литералов команды
и литералов пустых команд, непосредственно следующих
за командой exec.
В остальных случаях обработка регистра происходит так же,
как и входного регистра ввода-вывода.
IN - входной регистр ввода-вывода
Команда может затребовать на ввод значение одного из (по состоянию на момент описания) 4х видов, и храниться в регистре могут значения 4х пригодных для ввода видов. Беда в том, что они могут не совпадать, и тогда включается процедура приведения.
Если в регистре содержится Pq,
то его можно привести к Pt
конкатенацией всех ячеек Pq.
В свою очередь, Pt можно
привести к Pm, этот поток
отдаст все содержимое Pt.
Если в регистре содержится Pf,
то открывается файл с созданием Pm,
этот поток выдает все содержимое файла. Его можно считать целиком
и получить Pt.
Если регистр пуст, то создается поток в заданном регистре и заказывается форк, направление потока от родителя к порожденному процессу.
CON - регистр базы
Если соединения с СУБД нет, а оно требуется, то устанавливается в соответствии с параметрами, которые хранятся в регистре. Если в регистре уже есть установленное соединение, то используется существующее соединение.
JOB - регистр работ
Используется для обращения к файловой системе и в командах, порождающих процессы-потомки. В регистрах работ хранятся списки потомков.
STY - регистр стиля
Некоторые команды могут взять из стиля значение по имени, другие могут отправить стилю таблицу для преобразования в поток. Стили - это, по сути, программы на отдельном языке, описано отдельно.