Клиент Caché ODBC в Linux

в 13:52, , рубрики: Ensemble, intersystems cache, linux, odbc, php5, Администрирование баз данных, Блог компании InterSystems, метки: , , , ,

Несколько лет назад заказчик, крупный медицинский центр федерального значения, поручил нам разработать софт, обслуживающий информационные киоски. Внешне киоск напоминает платёжный терминал (только без купюроприёмника), его основная функция, как следует из названия, — предоставление пациентам различной информации, такой как расписание приёма врачей, услуги и их стоимость, и так далее.
По понятным причинам для киоска потребовалось разработать упрощённый интерфейс пользователя, который было решено реализовать как 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);
  • он позволяет обращаться к таблицам напрямую, без промежуточных хранимых процедур;
  • это неплохой способ «формализовать отношения» в тех случаях, когда разработка специализированного внешнего интерфейса осуществляется сторонней командой.

Автор: AlexeyMaslov

Источник

Поделиться

* - обязательные к заполнению поля