Программа интерфейс между базой данных Oracle и веб сервером Apache
"Web Agent" версия 1.4 от 13.08.1999.
Скачать rar архив (96 Kb)

Для чего предназначена данная программа?
Данная программа предназначена для связывания самого попу-
лярного веб сервера Apache и самого популярного сервера 
баз данных Oracle. Почему не связка Perl+DBD+Apache+Oracle? 
Каждый конечно решает сам, но для меня это во первых
слишком длинная связка (чем больше составляющих, тем легче
сломаться), во вторых если у меня возникнут проблемы я
просто задам вопрос знающим людям в терминах пакетов
и операторов Oracle, а не Perl+DBD. Программа точно
работает на операционках linux & solaris & NT. И судя по 
коду ничего ей не помешает работать на любой операционке (в 
ней нет специфических вызовов). Точно работает с 
web server Apache(ver. 1.2-1.3.4) и Oracle (ver. 7-8).

Каков принцип работы?
Программа просто передает на исполнение и забирает
результат родных Oracl'овских пакаджей для работы с 
OWS ver. 2.1 - htp.* & htf.* Так что вся разработка идет в
терминах Oracl'овских фирменных пакаджей и внутри самого 
Oracle.

Инсталляция программы.
Программа написана на Си с использование OCI вызовов.
Программа вешается на 404 ошибку веб сервера Apache. Сделано 
это для того, что бы не указывать все время имя_пакаджа.имя_процедуры,
а анализируя переменную окружения PATH_INFO вычленять данные из 
нее. Для ее установки надо прописать несколько параметров в APACHE

1)Файл conf/httpd.conf
  SetEnv ORACLE_HOME /home/oracle/product/80
  SetEnv LD_LIBRARY_PATH /home/oracle/product/80/lib
  SetEnv NLS_LANG American_America.CL8MsWin1251
  SetEnv ORA_NLS33 /home/oracle/product/80/ocommon/nls/admin/data
  эти параметры конечно же у каждого указывают на свой путь :-)

2)Файл conf/srm.conf
  ErrorDocument 404 /cgi-bin/ppo #имя и местоположение нашего модуля 
  натравленного на 404 ошибку (not found)
  (этот кусочек адреса всегда будет присутствовать в URL браузера)

3)Положить откомпилированный модуль под именем указанным в
  ловушке ErrorDocument 404 файла conf/srm.conf в нашем примере
  это /cgi-bin/ppo 

  установить ему пользователя и группу указанные в файл conf/httpd.conf
  через переменные
  User value
  Group value
  Например:
  User nobody
  Group nogroup
  в нашем примере chown nobody /cgi-bin/ppo; chgrp nogroup /cgi-bin/ppo;

4)Создать файл описывающий метод доступа к Oracle.
  Файл должен лежать в пути описанном в через #define AGENT_CFG в файле ppo.c
  Файл должен быть структурирован так:
  #service user password sid port_apache log_file error_page
   lob igor latency ambasador 80 /kwjfkj/jhfi /lksgk/kjk
  Где
     lob           имя сервиса - указывается в строке браузера
     igor          пользователь oracle
     latency       пароль пользователя oracle
     ambasador     идентификатор базы Oracle (алиас из tnsnames.ora)
     80            порт по которому можно соединятся с данным http сервером Apache 
                   (то есть можно разных пользователей посадить на разные порты)
     /kwjfkj/jhfi  имя лог файла (пока ничего никуда не пишется)
     /lksgk/kjk    имя страницы ошибок (пока не используется)

5) Откомпилировать в oracle пакаджи htp.* и htf.* - это родные от фирмы Oracle !!!
   (прилагается в каталоге OWS21).
   Откомпилировать в oracle интерфейсную процедуру между программой и
   htp.* htf.* пакаджем, лежит она в файле print_ht.sql (прилагается).
   Имя процедуры задается в файле ppo.c через #define DRAW_OUT
    (Обычно я делаю это так: 
       а] создаю пользователя oracle зайдя в svrmgrl
          SVRMGR> connect internal
          SVRMGR> create user apache identified by 12345 default tablespace users temporary tablespace temp;
          SVRMGR> grant connect, resource to apache;
          SVRMGR> exit;
       б] компилирую пакеты для вновь созданного пользователя зайдя в sqlplus
          sqlplus apache/12345
          SQL> @ows21/owains
          SQL> @print_ht
          SQL> exit;
       в] раздаю полномочия на выполнение данных пакетов зайдя в sqlplus.
          в данном случае предоставим полномочия другому пользователю
          Oracle - например пользователю igor
          sqlplus apache/12345
          SQL> grant execute on htp to igor;
          SQL> grant execute on htf to igor;
          SQL> grant execute on owa to igor;
          SQL> grant execute on owa_util to igor;
          SQL> grant execute on get_htp_page to igor;
          SQL> exit;
          или можно дать всем сразу указывая не to igor, а  to public
       г] создадим для пользователя igor синонимы зайдя в sqlplus
          sqlplus igor/latency
          SQL> create synonym htp for apache.htp;
          SQL> create synonym htf for apache.htf;
          SQL> create synonym owa for apache.owa;
          SQL> create synonym owa_util for apache.owa_util;
          SQL> create synonym get_htp_page for apache.get_htp_page;
          или опять же можно создать общедоступные синонимы к объектам
          зайдя в sqlplus привилегированным пользователем sys
          sqlplus sys/пароль
          SQL> create public synonym owa_util for apache.htp
          то есть для каждого пакета указать public synonym
     Пункты в] и г] надо выполнить для всех пользователей Oracle, которые
     будут создавать программы работы через WWW, если не был указан public.
    )

6) Перестартануть APACHE и вперед !!!
   Для нашего примера надо будет ввести примерно такую строчку
   www.сервер.ru:номер_порта/cgi-bin/имя_исполнимого_модуля/имя_сервиса_из_cfg_файла/имя_пакаджа.имя_процедуры
   реально работающий пример:
   http://db.raid.ru/cgi-bin/ppo/amk/interes_links.show_links
   (обратите внимание номер порта можно опускать если он стандартный)
   
7) Для отладки ваших Oracl'овых процедур и показа переменных
   окружения Apache можно разкомментарить в файле ppo.c
   #define DEBUG_ENVIROMENT

   для отладки (вдруг понадобится) в файле ppo.c можно разкомментарить
   #define DEBUG

8) Необязательный раздел.
   В конфигурационном файле Apache conf/httpd.conf есть параметр
   TimeOut 300
   Данный параметр указывает через сколько секунд ожидания убить
   коннекцию. Соответственно если Ваши запросы долгие и длинные
   то необходимо увеличить данный параметр.
   В конфигурационном файле Oracle .../network/admin/sqlnet.ora
   есть параметр
   sqlnet.expire_time = 59
   Данный параметр указывает через сколько секунд производятся
   проверки на то жива ли сессия клиента и если мертва то связь
   разрывается, что бы не нагружать Oracle мертвыми (по каким 
   либо причинам) сессиями.

Программа работает у нас уже около 1.5 лет и нареканий
не вызывает :-)

Вроде ничего не забыл.
Павел (ppo@raid.ru)

P.S.: Все замечания предложения исправления приму с благодарностью.
      Приму также мэйк_файлы для различных операционных систем.