psql
Вы получали
доступ к PostgreSQL
с достаточными правами. Тогда Вы можете пользоваться
pgoblin
без указания
параметров соединения с базой.
Можно параметрами задавать другую СУБД,
например, pgoblin -Bsqlite3
будет по умолчанию работать с sqlite3
.
Запросы можно указывать прямо в параметрах, например:
|
|
$TMPDIR/t
:
|
Угу. Уже неплохо.
Теперь для примера скрипт, который создает и заполняет временную таблицу именами файлов в текущем каталоге. Заодно и выведем ее:
|
/bin/ls
,
который запускается оператором #exec
,
и этот оператор направляет stdout
запускаемой команды в регистр ввода/вывода 2
.
Следующая команда, #getstr
, берет
поток из регистра ввода/вывода 2
,
преобразует его в вид, пригодный для скармливания команде COPY
и направляет преобразованный поток в регистр ввода/вывода 3
.
Следующая команда, #copyin
, берет поток
из регистра ввода/вывода 3
для
COPY
в заполняемую таблицу.
Как видно, в литерале к команде #copyin
перед SQL оператором COPY
при работе
с СУБД PostgreSQL
можно
задавать другие операторы, в данном случае SQL оператор для создания
таблицы, которая и будет заполняться. Не все СУБД позволяют это,
потому для универсальности так лучше не делать.
При выполнении #exec
надо
задавать выполняемой программе stdin
и stdout
независимор от того,
использует ли программа их. Если не задать из явно, то они будут
взяты из 0
го регистра ввода-вывода.
В начале выплнения pgoblin
там
обычно stdin
и stdout
самого
pgoblin
а, но гарантии, что всегда
в момент вызова #exec
они там будут,
нет, потому об этом надо заботиться специально.
Последний оператор - #strselect
,
он выводит получившуюся таблицу.
#strselect
отличается от
#select
тем, что он работает
в потоке, и при неограниченном размере выводимого в памяти будет
присутствовать только небольшая часть потока в процессе передачи.
Оператор #select
размещает весь результат целиком в памяти, что удобно для небольших
результатов, но опасно для неограниченных.
Еще один пример. В нем мы вводим строки из stdin
,
считаем каждую строку названием файла и проверяем, есть ли названный
файл в текущем каталоге:
|
#perform
для выполнения SQL команды без ввода/вывода. Так тоже можно. Даже лучше так.
Для того, что бы получить все файлы текущего каталога, в том числе с точкой
вначале, /bin/ls
запущен с флагами
-aA
. Таким образом можно задавать
любое количество параметров запускаемой программе.
Поскольку pgoblin
предназначен
для написания скриптов, а не для работы в диалоге, ввод/вывод
как правило буферизуется, и потому, скорее всего, результата
Вы не увидите, пока не закончите файл ввода. Если вводите
названия вручную, то в стандартных настройках конец файла
надо выдать с клавиатуры несколько раз (обычно 3), что бы
программа ввода поверила, что вводу конец.
Этим заведует библиотека mife
,
в документации к ней можно узнать подробности.
Теперь нарисуем скрипт, который запускается с 2мя параметрами, именем каталога и количеством файлов, которые оттуда надо изобразить:
|
#getarg
,
помещает в регистр ввода/вывода 2
поток параметров скрипта, которые и вводятся в третьем операторе.
4й оператор, #perform
, готовит
временную таблицу x
, в которой
дешифрованы все параметры скрипта. Далее, 5ым оператором
(#select
) в 4
ом
регистре ввода/вывода создаются строки (в данном случае только одна)
для 6го оператора - #exec
для
запуска внешних программ (в данном случае /bin/ls
с соответствующими параметрами. stdout
запущенной команды направляется в регистр 3
,
откуда он берется командой #getstr
и отправляется команде #copyin
через
2
й регистр, как ранее было уже рассмотрено.
Далее нечто новенькое: команда #select
создает во 2
ом регистре команду
SQL, которая и выполняется последней командой
скрипта - #strselect
.
В этом примере показано, как выполняются не статические,
а тут же построенные SQL команды.
На всякий случай запомните, что /bin/ls
тут используется для примера работы с потомками и потоками, для получения
каталога у pgoblin
имеется
команда #getdir
, которая аккуратно
обращается с, в частности, непечатными символами в названии файла.