NAME

 

sql_forms - интерфейс для работы с базами данных...


DESCRIPTION

 

               Что можно делать
    ------------------------------------------

Ну в общем эта штуковина может:

- отображать таблички из БД вертикально/горизонтально,

- показывать текст (можно некоторые строчки цветами выделять),

- делать поиск в уже загруженных данных,

- сохранять данные в текстовом виде и в виде HTML,

- данные можно редактировать,

- воззможность поддержки различных русских кодировок

- удалять/вставлять/заменять и тд...,

- есть возможность интерактивного ввода данных,

- возможность выбора отображаемых колонок (через меню)

- возможность выбора порядка сортировки (через меню)

- возможность задания фильтров для поиска (а также их сохранение)

- возможность выполнять последовательно все запросы сохраняя или не сохраняя данных

- возможно использовать для просмотра данных внешние утилиты

- можно использовать как sql-shell


INSTALLATION

 

 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 пропишите туда корректные значения.


OPTIONS

 

sql_forms [options] -N 'schema_name'

-H 'dir_name'

директория в которой лежат глобальные конфиги по умолчанию: /usr/local/lib/sql_forms

-N 'schema_name'

- запустить схему 'schema_name'

-D 'dir'

- директория в которой лежат файлы схем по умолчанию : ~/.db_view/schems

-COLS x

- ширина окна по умолчанию

-LINES x

- высота окна по умолчанию

-DUMPKEY file_name

- сохраняет все нажатия клавиатуры.

-LOADKEY file_name

- загружает клавиши из файла.

-NOLOCK 1

- не блокировать файлы.

-DEBUG 1

- записывать все SQL запросы в error.log


TUTORIAL

 

           Допустимые имена обьектов для вывода данных
       ---------------------------------------------------

    <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>
           и тд то '<' замените на &lt; ,
           ну а если хотите пользовать &lt; то так \&lt;

    !    - Идентификаторы обьектов должны быть без пробелов

                     Известные баги.
        ------------------------------------------
    --- ! ---
    если послать неверное кол-во аргументов в $sth->execute(...),
    то програмень падает (для Sybase, может и для других драйверов)
    не смотря на вызов через eval...

    Пример:
    select ID,PRICE,TOVAR_ID from SKLAD where OWNER like '<USER_NAME>'

    '<USER_NAME>' получается вроде как строка, но при разборе запроса
    заменяется на ? (т.к. без _RAW), а число аргументов execute
    увеличивается...

    --- ! ---
    в X терминале при выводе например вот такой строчки '≤c┘╠╦╔... '
    или '≤c┘╠ё╔... ' происходят интересные весчи...


NOTES

 

Начиная с версии 1.84 ( т.е. уже больше года ) ничего нового глобального ( в смысле стиля написания, новых фич и пр... ) не делается, а лиш правятся ошибки найденные в процессе эксплуатации. Это несмотря на то, что стиль написания sql_forms мне сейчас мягко говоря не нравится, но он работает и несколько проектов живут на нем, и поэтому, что либо серьезно менять у меня пока нет нужды ( хотя уже есть и переписанная часть скриптов... )


AUTHOR

 

 Okunev Igor V.  mailto:igor@prv.mts-nn.ru
                 http://www.mts-nn.ru/~gosha