sql_forms - интерфейс для работы с базами данных...
Что можно делать
------------------------------------------
Ну в общем эта штуковина может:
- отображать таблички из БД вертикально/горизонтально,
- показывать текст (можно некоторые строчки цветами выделять),
- делать поиск в уже загруженных данных,
- сохранять данные в текстовом виде и в виде HTML,
- данные можно редактировать,
- воззможность поддержки различных русских кодировок
- удалять/вставлять/заменять и тд...,
- есть возможность интерактивного ввода данных,
- возможность выбора отображаемых колонок (через меню)
- возможность выбора порядка сортировки (через меню)
- возможность задания фильтров для поиска (а также их сохранение)
- возможность выполнять последовательно все запросы сохраняя или не сохраняя данных
- возможно использовать для просмотра данных внешние утилиты
- можно использовать как sql-shell
perl Makefile.PL make make install
все пути завязаны на /usr/local/[bin,lib]
в директории Example/schems лежат работающие примеры файла схем
скопируйте себе в домашнюю директорию в .db_view/
RAW_SQL.db,FIND_PATTERN.db - примеры макросов и фильтров для поиска
для макросов можно сделать дамп для наглядности...
Если скрипт будет ругаться на ошибки чтения то в Util/ лежит скрипт для сборки .db файлов
Example: create_DB RAW_SQL.src получим RAW_SQL.db
Создайте файл схему под свои нужды и положите в ~/.db_view/schems/
Для изменения языка сообщений и меню определите переменную LANG сейчас есть : 'ru_RU.KOI8-R', любой другой - английский
Отредактируйте файл /usr/local/lib/sql_schems/schema.pl пропишите туда корректные значения.
sql_forms [options] -N 'schema_name'
директория в которой лежат глобальные конфиги по умолчанию: /usr/local/lib/sql_forms
- запустить схему 'schema_name'
- директория в которой лежат файлы схем по умолчанию : ~/.db_view/schems
- ширина окна по умолчанию
- высота окна по умолчанию
- сохраняет все нажатия клавиатуры.
- загружает клавиши из файла.
- не блокировать файлы.
- записывать все SQL запросы в error.log
Допустимые имена обьектов для вывода данных
---------------------------------------------------
<LIST-ID>
Вывести данные в обьект 'LIST' с идентификатором 'ID'
<TEXT-ID>
Вывести данные в обьект 'TEXT' с идентификатором 'ID'
<LIST_FILE-ID>
Вывести данные в файл как список
<TEXT_FILE-ID>
Вывести данные в файл как текст
<NULL-ID>
Не принимать и не выводить данные от сервера
<MESG-ID>
Вывести сообщение о том что запрос выполнен
<MACROS-NAME>
Запустить макрос с именем 'NAME'
<MIME-ID-mime_type>
где ID - идентификатор (все что угодно кроме '-' и ';')
mime_type - миме тип описанный в ~/.db_view/mime.types
формат mime.types:
mime_type html 'links file://_FILE_'
где :
mime_type - миме тип
html - расширение файла
(используется при записи на диск)
'links file://_FILE_' - программа запускаемая для просмотра
_FILE_ - имя файла с данными
если хотите использовать _FILE_ для своих
целей то пишите __FILE_
Теги SQL запроса
---------------------------------------------------
<USER_NAME>
Имя пользователя указанное при регистрации в БД
<USER_NAME_RAW>
тоже самое но тип данных не распознается автоматически
<PERL_CODE>*</PERL_CODE>
Выполнить перл код. В SQL запрос подставляется значение
переменной $_, если $_ ссылка то тип данных определяется
автоматически.
<LIST_ID[colum]>
Данные из обьекта 'LIST' с идентификатором ID
из колонки 'column'
(тип данных распознается автоматически..)
<LIST_RAW_ID[colum]>
Данные из обьекта 'LIST' с идентификатором ID
из колонки 'column'
(тип не распознается автоматически..)
<TEXT_ID>
Данные из обьекта 'TEXT' с идентификатором ID
(тип данных распознается автоматически..)
<TEXT_RAW_ID>
Данные из обьекта 'TEXT' с идентификатором ID
(тип не распознается автоматически..)
<INPUT[40:10 ~%~Input SQL request~%~ ~%~~%~]>
Интерактивный ввод данных при выполнении запроса.
(тип данных распознается автоматически..)
<INPUT_RAW[40:10 ~%~Input SQL request~%~ ~%~~%~]>
Интерактивный ввод данных при выполнении запроса.
(тип данных не распознается автоматически..)
где:
40 - Длина диалогового окна
10 - Высота диалогового окна
'Input SQL request' - Приглашение ввода
'' - Значение по умолчанию
! - ID не должен содержать пробелов.
Приоритет раскрытия тегов:
1 - LIST
2 - TEXT
3 - USER_NAME
4 - INPUT
5 - PERL_CODE
Пример:
select * from <LIST_RAW_0[1]>..sysobjects where type =
<INPUT[30:1 ~%~Input Object type~%~ ~%~P~%~]>
Фильтры поиска
------------------------------------------
например: where .... group by ... и тд
Файл schema.pl
-------------------------------------------
Формат:
Perl код который вызывается через eval
-----------------------cut
$SCHEMA = {
'DBI_STR' =>
['Sybase:server=SYBASE;database=userdb',# Опции и _ПАРАМЕТРЫ_ DBI драйвера
'Сервер Sybase', # Комментарий для меню
'', # Имя пользователя (NULL)
'', # Пароль (NULL)
'set textsize 1000000', # Далее SQL запросы выполняемые
''], # сразу после регистрации в БД
'PERL_CODE_OK' => 1 # Разрешить/Запретить использование
# перл кода в запросах
'CODEPAGE' => [ 'KOI8-R',
'KOI8-R'], # Кодировка : ['сервер','клиент']
'COLOR' => ['white', # 'Палитра' цветов схемы
'black', # Foreground/Background
'red',
'black'],
'OUT_DATA_TYPE' => 'html', # Формат данных при записи
# в файл (txt/html)
'FIRST_PAGE' => 'LIST-0', # Первый загружаемый обьект
'DEF_LINES' => 250, # Кол-во строк экрана по умолчанию
'DEF_COLS' => 800, # Кол-во колонок экрана по умолчанию
'EDITOR' => 'vim', # Внешний редактор, если
# есть желание
'DBI_MULTI_SELECT' => 1, # Если 1 то в RAW_SQL будет
# разрешен выбор из всех DBI
# драйверов описанных в схеме,
# если 0 то используется DBI
# драйвер описанный в корне
# схемы
# Описание обьектов схемы
'LISTS' => { # Форматированные списки
'0' => { # Идентификатор '0'
'title' => 'Список групп', # Заголовок окна
'multipart' => 1, # Возможность выбора
# нескольких 'строк'
'decorations' => 1, # Окно с рамкой
'ypos' => 0, # Y координата окна
'xpos' => 0, # X координата окна
'lines' => 250, # Строк
'cols' => 800, # Колонок
'VIEW_FORMAT' => [0,1], # Столбцы которые выбираются
# из таблицы
'LIST_SIZE' => [60,15], # Ширина столбцов списка
'FIND_TITLE' => ['Наименование', # Имена используемые при
'ID'], # задании фильтров
'DBI_STR' => # Опции DBI драйвера
['Sybase:server=SYBASE;database=userdb',''],
'SORT_FORMAT' => [0], # Индекс столбца для сортировки
'IND' => 1, # Заполнять все столбцы
# с индексом меньшим или равным
'CHILD_ID' => 'LIST-1;LIST-3;MIME-0-text/html',
# Имена обьектов потомков
# которые заполняются
# при нажатии 'Enter'
# Если записаны через ';'
# то вызывается менюха
# и спрашивает куда идти.
'DB_COL' => ['grp.NAME', # Наименование столбцов
'grp.ID'], # таблицы БД
'TABLE_NAME' => ['grp'], # Имена таблиц
'TABLE_FULL_NAME' => # Полные имена таблиц
['userdb..NEWS_GROUP_NAME grp']
'OPTIONS' => [['where main.STREET IN (<LIST_0[1]>)',' and '],
['group by ',' , ']],
^^^ разделитель используемый
при соединении данных из
TABLE_OPTIONS
'TABLE_OPTIONS' => [['','main.STREET=street.ID'],
['1','2']] # Аргументы SQL запроса
# в зависимости от
# используемых таблиц
'VERTICAL_LIST' => 1, # Если 1 то вертикальный список
'list_size_2' => [55,22] # Ширина колонок вертикального
# списка
'SQL' => "select 1" # Если не undef то используется
# в запросе
'WARN_MSG' => '?', # Вывести предупреждение '?' перед
# выполнением запроса
'EDIT' => 1, # Разрешить редактировать
'EDIT_RULE' => [2,1,0,1], # правила редактирования
# 0 - столбец только для чтения
# 1 - любые значения
# 2 - значения из списка
'EDIT_LISTS' => ["select 'N'=ID,'Наименование товара'=NAME from userdb..MY_TOVAR",'',"select 'N'=ID,'4 измерения'=NAME from userdb..MY_EDIZM",'',"select 'N'=ID,'Партнеры'=NAME from userdb..MY_PARTNER"],
# используется для заполнения
# списка допустимых значений
'EDIT_SIZES' => [[4,38],'', # ширина колонок списка
[4,38],'', # допустимых значений
[4,38]],
'CODEPAGE' => ['KOI8-R','KOI8-R'],
# Кодировка...
# ['сервер','клиент']
},
'Next_id' => {
}
},
'TEXTS' => { # Текст
'0' => { # Идентификатор
'title' => 'Просмотр', # Заголовок окна
'xpos' => 0, # X
'ypos' => 0, # Y
'cols' => 80, # ..
'lines' => 25, # ..
'decorations' => 1, # ..
'EDIT' => 1, # Возможность редактирования
'COLOR' => {6=>['/^\s*\S{0,2}(>\s*){0}/','white:black'],
5=>['/^\s*\S{0,2}(>\s*){1}/','yellow:black'],
1=>['/^\s*\S{0,2}(>\s*){5}/','green:black'],
0=>['/^(From|Date|Subj|Newsgroup): /','red:blue']},
# ^^^^^^
# Комбинации цветов для текста
# Если найден образец то текст выделяется цветом
# ЦВЕТ_ШРИФТА:ЦВЕТ_ФОНА
# Ключи хеша используются для задания последовательности
# обработки образцов, вобщем специфическая завязка
# на базу с новостями...
'SQL' => "select 'From: '+user1.NAME+' <'+user1.MAIL+'>\nDate: '+convert(varchar(40),main.DATE,109)+'\nSubj: '+main.SUBJ+'\nNewsgroup: '+grp.NAME+'\n'+' \n',main.ARTICLE from userdb..NEWS_MSG main,NEWS_USER_NAME user1,NEWS_GROUP_NAME grp where main.FROM_ID = user1.ID and main.GROUP_ID = grp.ID and main.ID = <LIST_3[0]>"
# SQL строка запроса...
},
'Next_text_obj' => {
}
},
'MIMES' => {
'0-text/html' => {
'title' => 'Список тем/Внешний просмотр сообщения',
'SQL' => "select 'From: '+user1.NAME+' <'+user1.MAIL+'>\nDate: '+convert(varchar(40),main.DATE,109)+'\nSubj: '+main.SUBJ+'\nNewsgroup: '+grp.NAME+'\n'+' \n',main.ARTICLE from userdb..NEWS_MSG main,NEWS_USER_NAME user1,NEWS_GROUP_NAME grp where main.FROM_ID = user1.ID and main.GROUP_ID = grp.ID and main.ID = <LIST_2[0]>"
}
},
'MESGS' => {
'0' => {
'title' => 'Обновить запись...',
'SQL' => "update userdb..MY_SKLAD set TOVAR_ID = <LIST_4[1]>,IN_KOLVO = <LIST_4[2]>,EDIZM_ID = <LIST_4[3]>,PRICE = <LIST_4[4]>,PARTNER_ID = <LIST_4[5]>,DESCRIPTION = <LIST_4[8]> where ID = <LIST_4[0]>"
}
},
'NULLS' => {
'0' => {
'SQL' => "update userdb..MY_SKLAD set TOVAR_ID = <LIST_4[1]>,IN_KOLVO = <LIST_4[2]>,EDIZM_ID = <LIST_4[3]>,PRICE = <LIST_4[4]>,PARTNER_ID = <LIST_4[5]>,DESCRIPTION = <LIST_4[8]> where ID = <LIST_4[0]>"
}
}
};
----------------------cut
в примерах все описано.
Интерфейс :-)
------------------------------------------
Меню 'Главное':
----------------
Схемы - все доступные в данный момент схемы
Регистрация в БД - перерегистрироваться в БД
Перейти к ... - перейти к обьекту...
Сохранить - сохранить обьект...
Сохранить дерево - сохранить дерево обьектов (в формате html)
проходит по всем 'ссылкам' и делает дерево
html ссылок.
Выполнить все запросы с...
- пройти по всему дереву списка не сохраняя
данных (например можно использовать для
удаления/обновления/и тд всего списка)
Прочитать конфиги - перечитать конфигурационные файлы
Очистить данные - удалить содержимое обьекта
Выход - выход из программы
Меню 'Дополнительно': ---------------------
Шаблоны поиска - шаблоны/фильтры используемые для заполнения обьектов
Key:
'e' - (анг) редактировать шаблон
'p' - (...) имя шаблона
'd' - удалить выбранный шаблон
's' - сохранить шаблон
'w' - поиск в активной колонке
'/' - поиск
'a' - активизировать шаблон
'q' - выход
'tab' - сами поймете...
! - выход из режима редактирования при использовании
внутреннего редактора 'tab'
Raw Sql - макросы на SQL
Key:
'e' - (анг) редактировать макрос
'p' - (...) имя макроса
'd' - удалить выбранный макрос
'c' - редактировать имена обьектов потомков
's' - сохранить макрос
'a' - выполнить макрос
'v' - дамп макроса в файл
'w' - поиск в активной колонке
'/' - поиск
'q' - выход
'tab' - сами поймете...
! - выход из режима редактирования при использовании
внутреннего редактора 'tab'
! - Первым считается обьект _ПЕРВЫМ_ стоящий в списке
обьектов (список после первого нажатия 'tab')
! - В Raw_SQL можно использовать все тэги описанные
в 'SQL Запросы'
! - В имени макроса не должно использоваться ';',
(иначе он будет идентифицирован как несколько
обьектов...)
не должен начинаться на 'RAW_'
Перекодировать в код. клиента - перекодировать данные обьекта...
в кодировку по умолчанию для
клиента
Перекодировать в код. сервера - перекодировать данные обьекта...
в кодировку по умолчанию для
сервера
Меню 'Настройки':
---------------------
'Сортировка' - порядок сортировки в списках
'Формат заголовков' - выбор отображаемых столбцов таблицы БД
'Формат данных' - выбор txt/html
Используется при сохранении данных на диске
! - при сохранении дерева обьектов
всегда используется html
'Кодировка сервера' - кодировка данных на сервере
'Кодировка клиента' - кодировка данных клиента
! - если у обьекта не выбрана кодировка то
используется кодировка по умолчанию
Просмотр Обьектов LIST
------------------------------------------
Key:
'>' - перейти на одну колонку вправо
'<' - перейти на одну колонку влево
'/' - глобальный поиск можно использовать Perl шаблоны
символ '/' должен быть закоментирован
'w' - поиск в активной колонке
'q' - выход
'P' - предыдущее окно
'N' - следующее окно
'E' - редактировать ячейку (строка X столбец) (если разрешено)
'e' - редактировать всегда внешним редактором
(если разрешено)
'R' - перечитать список
'M' - вызвать меню
']' - сделать активным столбец справа
'[' - сделать активным столбец слева
'i' - выделить все строки (если включено multipart)
'u' - отменить выделение всего (если включено multipart)
'*' - инвертировать выделение (если включено multipart)
'space' - выделить/отменить_выделение текущей строки
(если включено multipart)
'enter' - выделить строку и выйти
'n' - перейти к следующему окну
если потомок TEXT_... то не выделять
текст цветом
'+' - увеличить ширину активного столбца
'-' - уменьшить ширину активного столбца
'Up' - вверх на одну строку
'Down' - вниз на одну строку
'PgDn' - вниз на страницу
'PgUp' - вверх на страницу
'Home' - на первую строку таблицы
'End' - на последнюю строку таблицы
Просмотр Обьектов TEXT
------------------------------------------
Key:
'Up' - вверх на одну строку
'Down' - вниз на одну строку
'PgDn' - вниз на страницу
'PgUp' - вверх на страницу
'Home' - на первую строку текста
'End' - на последнюю строку текста
'q' - выход
'P' - предыдущее окно
'E' - редактировать (если разрешено)
'e' - редактировать всегда внешним редактором
(если разрешено)
'R' - перечитать текст
'>' - перейти в начало строки
'<' - перейти в коней строки
'/' - поиск можно использовать Perl шаблоны
'L' - перейти к строке найденной при последнем
поиске
! - символ '/' должен быть закоментирован
Мелочи
------------------------------------------
! - при сохранении дерева запросов можно нажать Ctrl+C
для завершения этого процесса...
! - при выполнении перл кода в SQL запросе, код должен
возвратить результат в переменной $_
! - в индексах обьектов могут использоваться '/' тогда полу-
чится чтото типа дерева каталогов...
! - Троекратное нажатие Ctrl+C выход из программы...
! - Переключение кнопки/текст_сообщение tab'ом
! - Если у обьекта несколько прямых потомков то при
сохранении 'дерева' используется имя _ПЕРВОГО_
! - Если вы хотите использовать слова <LIST_*>, <PERL_CODE>
и тд то '<' замените на < ,
ну а если хотите пользовать < то так \<
! - Идентификаторы обьектов должны быть без пробелов
Известные баги.
------------------------------------------
--- ! ---
если послать неверное кол-во аргументов в $sth->execute(...),
то програмень падает (для Sybase, может и для других драйверов)
не смотря на вызов через eval...
Пример:
select ID,PRICE,TOVAR_ID from SKLAD where OWNER like '<USER_NAME>'
'<USER_NAME>' получается вроде как строка, но при разборе запроса
заменяется на ? (т.к. без _RAW), а число аргументов execute
увеличивается...
--- ! ---
в X терминале при выводе например вот такой строчки '≤c┘╠╦╔... '
или '≤c┘╠ё╔... ' происходят интересные весчи...
Начиная с версии 1.84 ( т.е. уже больше года ) ничего нового глобального ( в смысле стиля написания, новых фич и пр... ) не делается, а лиш правятся ошибки найденные в процессе эксплуатации. Это несмотря на то, что стиль написания sql_forms мне сейчас мягко говоря не нравится, но он работает и несколько проектов живут на нем, и поэтому, что либо серьезно менять у меня пока нет нужды ( хотя уже есть и переписанная часть скриптов... )
Okunev Igor V. mailto:igor@prv.mts-nn.ru
http://www.mts-nn.ru/~gosha