Использование open source ПО c продуктами IBM: Cборка Libodbc++ на AIX5L

Источник: developerworks
Артис Уолкер, консультант, IBM Цзы-Хва Цзен, консультант по разработке программного обеспечения, IBM

Введение

Время программного обеспечения с открытым исходным кодом наконец-то пришло. Несмотря на мнение конкурентов о разрушительности этой технологии, на протяжении более двадцати лет она уверенно набирает силу. IBM - лидер ИТ-индустрии, активно поддерживающий сообщество Open Source. В середине июня 1998 года IBM решила поддерживать открытый web-сервер Apache и включила его в свое ПО WebSphere. С этого времени приверженность IBM ПО Open Source существенно возросла, начиная с вклада в разработку ядра Linux и до возможности использования Linux в качестве основной операционной системы в старших моделях серверов IBM pSeries eServers.

ODBC - это открытая спецификация, введенная Microsoft в начале 1990-х годов, чтобы обеспечить предсказуемое API для доступа к общим источникам данных. За прошедшие несколько лет эта спецификация фактически стала промышленным стандартом для разработчиков приложений, который дает возможность беспрепятственного соединения и обмена данными между приложениями и системами управления реляционными базами данных (СУБД). В типичной системе с ODBC диспетчер драйверов обеспечивает интерфейс для приложения. Он динамически загружает необходимый драйвер (или драйверы) для СУБД, с которой соединяется приложение. Существует несколько стандартных вариантов диспетчера драйверов для ODBC с открытым исходным кодом. На январь 2004 года для UNIX имеются следующие варианты:

  • IODBC. Версия 2.50.3 и выше.
  • unixODBC. Версия 1.8.4 и выше.

libodbc++ и диспетчер драйверов

libodbc++ - это открытая библиотека классов C++, которая дает разработчикам объектно-ориентированный доступ к общим источникам данных в среде C++. Она была разработана с учетом стандартов, поэтому предоставляет подмножество хорошо известного JDBC 2.0 и работает поверх диспетчера драйверов ODBC, из которого должна запускаться libodbc++. Из диспетчеров драйверов, как платных, так и свободных, IBM рекомендует использовать диспетчер драйверов unixODBC и настроить его для работы с libodbc++. Информацию по настройке unixODBC на AIX5L можно найти в статье IBM embraces open source: How to setup unixODBC on AIX5L. На рисунке внизу показана типичная ODBC-система с libodbc++ и unixODBC в качестве диспетчера драйверов.

Следует отметить, что libodbc++ является тонким клиентом, который находится между приложением и диспетчером драйверов ODBC (unixODBC). Поскольку она проектировалась с учетом стандартов ODBC, она никак не влияет на производительность. Она просто обеспечивает объектно-ориентированный подход для доступа к любому общему источнику данных с помощью драйвера ODBC. На рисунке выше показано приложение, осуществляющее доступ к двум общим источникам данных и источнику данных DB2.

Системные требования

Таблица 1. Загрузка/использование - требуется пять отдельных команд

Операционная система AIX 5.1 и выше
Компилятор IBM VisualAge 5.0 и выше
Диспетчер драйверов ODBC unixODBC 1.8.4 и выше
Утилита конфигурирования (./configure --version) Версия, которую выдает autoconf версии 2.13
Проверенные источники данных DB2 UDB 8.1, MySql -3.23.49 Oracle 8i.

Загрузка и сборка из исходного кода

libodbc++ можно загрузить по этой ссылке. На момент написания этой статьи на AIX5L успешно собрана и сконфигурирована версия 0.2.2. Для AIX рекомендуется использовать libodbc++ версии 0.2.2 и выше. Исходный текст в настоящее время доступен в формате gzip, tar. Это означает, что необходимо:

  1. Загрузить файл libodbc++-0.2.x.tar.gz туда, где можно создавать файлы и каталоги.
  2. gunzip libodbc++-0.2.x.tar.gz. Этим создается файл libodbc++-0.2.x.tar
  3. tar -xvf libodbc++-0.2.x.tar. Создается исходный код.

Для установки libodbc++ используется GNU autoconf. Для установки с параметрами по умолчанию нужно запустить следующие команды:

  1. ./configure (утилита конфигурирования среды сборки).
  2. make
  3. make install

По умолчанию, configure ищет GNU-компилятор для сборки libodbc++ и конфигурирует сборку для установки ее в /usr/local. GNU-компилятор можно загрузить по этой ссылке. Чтобы увидеть все параметры конфигурирования для сборки libodbc++, нужно запустить следующую команду:

./configure --help
 

Требования для сборки с помощью VisualAge C++

На AIX5L можно собрать libodbc++ с помощью компилятора VisualAge C++ (VACPP) версии 5.0 и выше. При сборке с помощью VACPP необходимо сконфигурировать переменные среды операционной системы и запустить утилиту конфигурирования со следующими настройками:

Окружение

CC (не обязательно. Компилятора C++ должно быть достаточно) xlc Компилятор VACPP C
CXX xlC_r Компилятор REENTRANT VACPP C++
CXXFLAGS -O Выполнить оптимизацию
-qmaxmem=-1 Неограниченное использование памяти для оптимизации

Директивы препроцессора

HAVE_LONG_LONG VACPP поддерживает long long (64bit)
ODBCXX_HAVE_ISO_CXXLIB Использовать VACPP basic_streambuf для сборки ODBC DataStreamBuf

Параметры компоновки

-blibsuff:so Искать сначала библиотеки с расширением .so
-bexpall Экспортировать все глобальные символы, включая те, на которые нет ссылок
-bh:5 Подавить выдачу предупреждений о дублировании символов (Duplicate Symbol Warnings)
-lpthread Скомпоновать с библиотекой pThreads

Утилита конфигурирования (команда ./configure) для libodbc++

--enable-threads Собрать thread safe библиотеки (пригодные для многопоточных приложений)
--enable-shared Собрать разделяемые библиотеки
--sysconfdir=/etc Где искать данные системной конфигурирации AIX

Команда конфигурирования VACPP

Для облегчения настройки предлагается образец сценария в качестве примера, его следует использовать только для конфигурирования libodbc++ с компилятором VACPP. Этот сценарий можно редактировать в соответствии со своими задачами и приспособить его к конкретной среде разработки на VACPP.

#! /bin/sh

##################################################################
#  Sample Configuration Script for setting up libodbc++ build    # 
#   with VisualAge C++ 5.0 or higher compiler.  This script      # 
#   configures libodbc++ to look for the required unixODBC       #
#   libraries in /unixodbc/install/build.  Otherwise, it will    #
#   look for the Driver Mgr in the default location; /usr/local. #
#                                                                #
# As with Open Source this script is distributed in the hope     #
# that it will be useful, but WITHOUT ANY WARRANTY; without even #
# the implied warranty of MERCHANTABILITY or FITNESS FOR A       #
# PARTICULAR PURPOSE.                                            #
#                                                                #
# Author: Artis Walker walkerar@us.ibm.com                       #
##################################################################
CC="xlc" CXX="xlC_r" CXXFLAGS="-O -qmaxmem=-1 -DHAVE_LONG_LONG -DODBCXX_HAVE_ISO_CXXLIB" LDFLAGS="-blibsuff:so -bexpall -bh:5" LIBS="-lpthread" ./configure --with-odbc=/unixodbc/install/build             --sysconfdir=/etc             --enable-threads              --enable-shared 

Изменения в libtool VACPP

Не секрет, что утилита конфигурирования собирает системную информацию и использует ее для создания необходимых файлов Makefile, которые используются для сборки библиотек libodbc++, но это далеко не все, что она делает. Она создает также сценарии поддержки и ответные файлы, предназначенные для конкретной платформы (например, AIX). В свою очередь, полученные файлы Makefile используют эти сценарий и файлы в качестве входных для правильной сборки библиотек libodbc++ под целевую платформу. Одной из создаваемых утилит является libtool. Libtool обеспечивает зависящую от платформы обобщенную поддержку сборки библиотек для создания разделяемых и архивированных библиотек. Makefile вызывает libtool непосредственно, вместо использования команд ar и ld. Однако, по состоянию на январь 2004 года, утилита конфигурирования собирает libtool неправильно при использовании VACPP, и, чтобы сборка работала, необходимо сделать следующие изменения перед запуском команды make.

Нужно отредактировать сценарий libtool и изменить следующие команды:

Номер строки (примерно) Команда Изменить на
50 build_old_libs=no build_old_libs=yes
185 archive_expsym_cmds="\$CC
\${wl}-bM:SRE -o
\$output_objdir/\$soname
\$libobjs \$deplibs
\$compiler_flags
\${allow_undefined_flag}
~\$AR -crlo
\$objdir/\$libname\$release.a
\$objdir/\$soname"
archive_expsym_cmds="\xlC_r -
qmkshrobj -blibsuff:so -bh:5 -o
\$output_objdir/\$soname
\$libobjs \$deplibs
\$compiler_flags
\${allow_undefined_flag} ~\$AR -
crlo
\$objdir/\$libname\$release.a
\$objdir/\$soname"

Нужно сохранить изменения и продолжить сборку libodbc++, выполняя следующие команды:

  • make
  • make install

Как при любой сборке открытого ПО, по умолчанию результат помещается в /usr/local или в каталог, указанный с помощью параметра --prefix утилиты конфигурирования. После успешной сборки библиотека и заголовочные файлы будут помещены в каталоги lib и include соответственно в указанном каталоге.

Известные ошибки компиляции VACPP

Если на этом этапе возникнут какие-либо ошибки, это будут незначительные предупреждения и ошибки неопределенных типов C из-за невключенных заголовочных файлов. На момент написания этой статьи была замечена только одна ошибка, которую необходимо исправить, чтобы собрать libodbc++ 0.2.2 на AIX5L с помощью VACPP 5.0 или выше:

  • Нужно добавить #include "errorhandler.h" в файле include/odbc++/drivermanager.h.

Проверка возможности соединения с источником данных

После того как все успешно скомпилировалось, может потребоваться проверить возможность связи с источником данных. Чтобы это сделать, нужно зайти в каталог libodbc++ SOURCE/tests, найти файл README и прочитать его. Там находятся три из пяти утилит, которые можно использовать для проверки функциональности и соединения источников данных:

  1. dbtest: перечисляет имеющиеся источники данных и драйверы ODBC.
  2. db2metadata: возвращает информацию об имеющихся источниках данных.
  3. scroll: делает попытку вставить 1000 записей и вернуть их в виде прокручиваемого набора данных. Проверяет прокрутку полученного набора данных в обратном направлении и возможность выполнения команды Prepared Statement.

Например, в случае источника данных на DB2, можно проверить соединение с тестовой базой данных. Для источника данных на DB2 необходимо экспортировать переменную DB2INSTANCE=<instance id>, если не сделан вход в систему под идентификатором экземпляра базы данных (instance id), и добавить текст профиля экземпляра db2profile в переменные окружения.

В зависимости от среды, в которой устанавливается соединение, во время выполнения этих тестов могут случаться ошибки, но их не следует пугаться. Важно, чтобы была возможность подключиться к источнику данных, и чтобы этот источник данных в списке вывода dbtest был помечен как доступный. Если не удается получить соединение с источником данных или его нет в списке вывода dbtest, необходимо найти и устранить ошибки и вновь выполнить тест. Обычно эти ошибки вызваны неправильным синтаксисом SQL-запросов, это можно исправить с помощью необходимых изменений в исходном тексте тестов и их перекомпиляцией. В конце концов, это же программное обеспечение с открытым исходным текстом - его можно изменить…

Пример сценария сборки

Этот пример сценария может быть использован для сборки libodbc++ версии 0.2.2 с помощью VACPP 5.0 или выше на AIX5L. В момент написания этой статьи сценарий делает все необходимые изменения. Можно поместить этот сценарий в верхний каталог исходных текстов libodbc++ и запустить его.

************************************************************************
#! /bin/sh
##################################################################
#  Sample Configuration Script for setting up libodbc++ build    # 
#   with VisualAge C++ 5.0 or higher compiler.  This script      # 
#   configures libodbc++ to look for the required unixODBC       #
#   libraries in /unixodbc/install/build.  Otherwise, it will    #
#   look for the Driver Mgr in the default location; /usr/local. #
#                                                                #
# As with Open Source this script is distributed in the hope     #
# that it will be useful, but WITHOUT ANY WARRANTY; without even #
# the implied warranty of MERCHANTABILITY or FITNESS FOR A       #
# PARTICULAR PURPOSE.                                            #
#                                                                #
# Author: Artis Walker, IBM, walkerar@us.ibm.com                 #
##################################################################
CC="xlc" CXX="xlC_r" CXXFLAGS="-O -qmaxmem=-1 -DHAVE_LONG_LONG -DODBCXX_HAVE_ISO_CXXLIB" LDFLAGS="-blibsuff:so -bexpall -bh:5" LIBS="-lpthread" ./configure --prefix=/libodbc++/install             --with-odbc=/unixodbc/install/build             --sysconfdir=/etc             --enable-threads              --enable-shared 
###################################
#  Раздел для модификации libtool #
###################################

# копировать полученный libtool в libtool_bkup 
cp libtool libtool_bkup

# Изменить три команды 
sed 's/build_old_libs=no/build_old_libs=yes/' libtool > temp1
sed 's/archive_expsym_cmds=\"\\\$CC \\\${wl}-bM:SRE/       archive_expsym_cmds=\"\\xlC_r -qmkshrobj -blibsuff:so -bh:5/'        temp1 > temp2

# Копировать измененные файлы обратно в libtool
cp temp2 libtool

##############################
#  Изменить install-sh         #
##############################
# копировать полученный install-sh в install-sh_bkup 
cp install-sh install-sh_bkup
sed 's/cpprog=\"\${CPPROG-cp}\"/cpprog=\"\${CPPROG-cp} -r\"/' install-sh > temp1
sed 's/rmprog=\"\${RMPROG-rm}\"/rmprog=\"\${RMPROG-rm} -rf\"/' temp1 > temp2

# Копировать измененный файл обратно в install-sh
cp temp2 install-sh

#################################################
#  изменить include/odbc++/drivermanager.h        #
#################################################
cp include/odbc++/drivermanager.h include/odbc++/drivermanager.h_bkup

echo '.....Изменение drivermanager.h'
sed -e '/^#include <odbc++\/types.h>/p' -e '/^#include <odbc++/types.h>/s/<odbc++\/types.h>/\"errorhandler.h\"/' <include/odbc++/drivermanager.h > temp1
echo 'Успешно изменен drivermanager.h'
#  Получить исправленное содержимое
cp temp1 include/odbc++/drivermanager.h

# Удалить временные файлы

rm temp1 temp2 

#  Продолжить сборку библиотеки libodbc++
make
make install

************************************************************************

Резюме

Что осталось сказать об open source такого, что еще не сказано? Оказывается, многое! С момента его рождения прошло примерно двадцать лет, и нет ничего такого, чего нельзя было бы найти в сообществе open source для решения возникшей проблемы, и разработка библиотеки libodbc++, бесспорно, является доказательством этого. Она так же надежна, как и спецификация ODBC API, являющаяся промышленным стандартом, и в то же время ее иерархия классов достаточно гибкая, чтобы дать возможность сохранить всю выразительность и стиль C++. Нет сомнений, что она создана для "упертого" разработчика на C++. Она обеспечивает уровень абстракции, который дает возможность разработчикам на C++ полностью разделить особенности различных СУБД и определить типы данных, которые инкапсулируют их возможности. И тот факт, что libodbc++ может быть собрана с помощью VACPP, не ограничивает эти возможности. Наоборот, среди всего прочего мы видели здесь, как могут быть использованы преимущества оптимизации компилятора VACPP, что проявляется в меньшем размере библиотеки.

Заключение

Эта статья показала, как IBM поддерживает сообщество open source, предоставив пошаговые инструкции по настройке libodbc++ на AIX5L. Кроме того, приведены инструкции о том, как собрать libodbc++ с помощью VACPP и с использованием unixODBC в качестве диспетчера драйверов. Для удобства был предоставлен настроечный сценарий, который может быть использован для сборки библиотеки libodbc++. Этот сценарий может быть выполнен в каталоге, где находится исходный текст libodbc++. Дополнительную информацию можно получить в статье "IBM Embraces Open Source: How to set up unixODBC on AIX5L" и в источниках, перечисленных в разделе Ресурсы.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=19542