Клиент Caché ODBC в Linux

от автора

Несколько лет назад заказчик, крупный медицинский центр федерального значения, поручил нам разработать софт, обслуживающий информационные киоски. Внешне киоск напоминает платёжный терминал (только без купюроприёмника), его основная функция, как следует из названия, — предоставление пациентам различной информации, такой как расписание приёма врачей, услуги и их стоимость, и так далее.
По понятным причинам для киоска потребовалось разработать упрощённый интерфейс пользователя, который было решено реализовать как web-приложение. Имея в штате опытных web-программистов, уверенно владеющих php, решили (для скорости) поручить им написание этого приложения, организовав связь с базой данных нашей медицинской системы. Рассматривалось 3 варианта взаимодействия:

  • ODBC
  • JDBC
  • web-сервисы.

Web-программисты предпочли ODBC как наиболее простой с их точки зрения вариант, и альфа-версия киоска довольно быстро увидела свет. Однако вскоре выяснилось (surprise!), что php-код должен работать не под Windows, как это было у разработчика, а под Linux, несмотря на то, что в те годы наша медицинская система эксплуатировалась заказчиком на платформе Windows 2008. Чтобы «подружить» всех членов триады (Linux – ODBC-драйвер Caché — php5) потребовались определённые усилия. Последовательность проделанных действий я зафиксировал в виде наброска к данной статье, которую и предлагаю вашему вниманию.

Установка драйвера ODBC

Это можно сделать несколькими способами, а именно, с помощью:

  • пользовательской установку Caché for Linux, выбрав ODBC Client как опцию;
  • клиентской установки (скрипт cinstall_client, имеется в DVD-версии дистрибутива);
  • отдельной установки (Stand-alone installation) клиента ODBC.

Ниже будет описан последний вариант как наиболее практичный, поскольку может быть выполнен как с .tar.gz-дистрибутива, так и с его полной DVD-версии, а также из дистрибутива ODBC-драйвера Caché, распространяемого в виде отдельного файла. Проверено в Ubuntu 9.10 и в Fedora 8 с ODBC-драйверами Caché 2008.1 и 2009.1.
Cмонтируйте dvd с дистрибутивами Caché для UNIX-ов и перейдите в каталог с дистрибутивами ODBC:

sudo mount /dev/dvd /media 

Если ваш дистрибутив не на DVD, а в виде .tar.gz-файла (например, cache-2009.1.2.602-lnxrhx64.tar.gz), распакуйте его куда-нибудь. Дальнейшее не зависит от варианта дистрибутива. Создайте (где вам удобно) папку для установки драйвера. Обозначим её $folder.

mkdir $folder 

Найдите в дистрибутиве драйвер под вашу платформу:

cd /media/dist/ODBC 

Если у вас x86_x64, выберите ODBC-lnxrhx64.tar.gz, если x86_x32, то — ODBC-lnxrhx86.tar.gz. Скопируйте архив в выбранную вами папку $folder и распакуйте его в ней, после чего запустите инсталлятор. Установка пройдёт в ту же папку, вопросов не будет.

cd $folder tar -xvf ODBC-lnxrhx86.tar.gz ./ODBCinstall 

Настройка источников данных

Далее, перейдите в mgr

cd $folder/mgr 

и отредактируйте файл cacheodbc.ini, изменив определения Driver, Host, Port (и, возможно, Password) в секциях описаний источников данных:

[Samples] Driver = $folder/bin/libcacheodbc.so Description = Cache ODBC driver Host = IP-адрес или DNS-имя сервера Caché Namespace = SAMPLES UID = _SYSTEM Password = SYS (если Caché установлена с минимальной безопасностью, то скорее всего, этот пароль подойдёт) Port = TCP-порт суперсервера Caché (обычно 1972) 

Для проверки драйвера и источника данных Samples выполните:

cd $folder/dev/odbc/samples/select ./select.sh # простейший select из таблицы Samples.Person 

Работа с источниками данных (DSN) Caché ODBC из apache2 / php5

Установка локализации CP1251

Надо сказать, что результирующий набор, возвращаемый Caché ODBC, всегда имеет кодировку CP1251 (вне зависимости от типа установки Caché — 8-бит (локализация RUW8) или Unicode (RUSW)). По крайней мере, я не знаю, как это изменить. Поэтому надо установить в Linux соответствующую локализацию. Например, в Ubuntu 9.10 это делается так:

sudo locale-gen ru_RU.CP1251 locale -a | grep 1251 

в списке локализаций появятся:

ru_RU.cp1251 

В RedHat-подобных дистрибутивах (проверено в Fedora Core 8, CentOS 5.x) локализация устанавливается так:

sudo localedef --no-archive -c -f CP1251 -i ru_RU ru_RU.CP1251 

Проверка наличия ru_RU.cp1251 выполняется аналогично:

locale -a | grep 1251 

Далее, чтобы из php можно было обращаться к DSN, надо прописать их в ODBC-менеджере. Наиболее известны следующие два: iodbc и unixodbc. Ниже — описание для unixodbc и Ubuntu 9.10.

Установка менеджера ODBC unixodbc (в Ubuntu 9.10)

Методика позаимствована из ru.php.net/manual/en/function.odbc-connect.php. А именно, установите:

sudo apt-get install <имя-пакета> 

следующие пакеты:

apache2 apache2-mpm-prefork apache2-utils apache2.2-common libapache2-mod-php5 odbcinst1debian1 php5 php5-cli php5-common php5-odbc unixodbc 

после чего перезапустите apache:

sudo /etc/init.d/apache2 restart 

Регистрация драйвера и DSN Caché ODBC в unixodbc

Вспомнив, что Caché ODBC был установлен в $folder, выполните:

cd $folder/dev/odbc/redist/unixodbc 

Скопируйте odbcinst_template.ini в odbcinst.ini и дважды пропишите в этом файле путь к драйверу ($folder/bin/libcacheodbc.so). Скопируйте odbc_template.ini в odbc.ini и пропишите в этом файла IP, Port, Namespace, UID и Password, соответствующие источнику данных. Повторите для каждого DSN, если их несколько. Для тестирования имеет смысл создать источник Samples (его заготовка присутствует в odbc_template.ini), используя те же параметры, что и в разделе «Настройка источников данных». Создайте также DSN, нацеленный на прикладную область (допустим, она называется QMS), добавив новую секцию в odbc.ini путем копирования секции [samples]. Назовите секцию так же, как называется область, и поменяйте — по отношению к Samples — всего один параметр:

[QMS] ... Namespace = QMS 

Все DSN могут быть описаны в одном файле odbc.ini.
Используемые значения Host, Namespace, Port, UID и Password должны соответствовать действительности, а именно, по этим реквизитам должны быть доступны области Caché, содержащие таблицы и/или хранимые процедуры. Способ проверки, понятное дело, зависит от вида хранимых данных. Если в вашей Caché сервис %Service_Bindings допускает вход без аутентификации, можно оставить реквизиты UID и Password пустыми (обязательно оба этих поля). В некоторых версиях Сache в примере odbc_template.ini задано неверное значение Password для суперпользователя _system, отличное от действующего по умолчанию при выборе минимальной безопасности в Caché (подсказка: пароль зависит от регистра). Кроме того, администратор Caché мог изменить пароль. И наконец, сохранять логин/пароль в DSN небезопасно, так поступать рекомендуется лишь в ходе тестирования; в процессе эксплуатации более целесообразно «зашить» их в php-приложение и передавать серверу при установлении соединения через ODBC.
Далее зарегистрируйте драйвер и все имеющиеся DSN:

sudo odbcinst -i -d -f odbcinst.ini sudo odbcinst -i -s -l -f odbc.ini 

После регистрации в файлах /etc/odbc.ini и /etc/odbcinst.ini должны появиться соответствующие записи.

Тестирование в php

Если вы всё сделали правильно и описали источник данных SAMPLES, заработает пример $folder/dev/odbc/samples/php/sample.php, установленный вместе с драйвером Caché ODBC. Если вы захотите попробовать что-нибудь русское (ну и наконец приступить к тестированию вашей разработки), не забудьте вставить поближе к началу вашего php-кода установку текущей локализации CP1251:

echo setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251'); 

Заключение

Напоследок несколько слов относительно общей архитектуры решения (браузер в киоске — php-приложение — БД Caché). В нашем случае она упростила разделение труда между web-разработчиками и прикладными программистами Caché и облегчила жизнь web-разработчикам, сохранив максимально привычную и комфортную для них среду. При этом мы, конечно, понимали, что прямое взаимодействие (браузер на клиенте — прикладной код в Caché) должно быть более эффективно как с точки зрения производительности, так и с точки зрения простоты конфигурации. Это понимание с годами только усилилось, и нашло отражение при создании полнофункционального web-интерфейса с нашей медицинской системой.
Тем не менее, ODBC-доступ к Caché по-прежнему занимает определённую «экологическую нишу», поскольку:

  • он отличается более высокой производительностью, чем многие другие методы доступа (например, SOAP);
  • он позволяет обращаться к таблицам напрямую, без промежуточных хранимых процедур;
  • это неплохой способ «формализовать отношения» в тех случаях, когда разработка специализированного внешнего интерфейса осуществляется сторонней командой.

ссылка на оригинал статьи http://habrahabr.ru/company/intersystems/blog/156321/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *