Имеется 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
- регистр стиля
Некоторые команды могут взять из стиля значение по имени, другие могут отправить стилю таблицу для преобразования в поток. Стили - это, по сути, программы на отдельном языке, описано отдельно.