среда, 16 января 2008 г.

Компиляция TOra в Debian

TOra - расшифровывается как "Toolkit For Oracle" и представляет из себя IDE для таких СУБД как Oracle, MySQL, PostgreSQL. На данный момент является одной из трех полноценных Oracle IDE под Linux (остальные две - это "SQL Developer" от Oracle и "Aqua Data Studio" от AquaFold). Концептуальное отличие - язык программирования исходного кода: "SQL Developer", "Aqua Data Studio" - Java, "TOra" - C++.

На днях пришлось собирать ее из исходных кодов, так как по лицензионным причинам, в стандартной сборке TOra из репозитария Debian GNU/Linux не включена поддержка Oracle.

Все работы велись в Debian Lenny:
$ uname -a
Linux Debian4Test 2.6.22-3-686 #1 SMP Mon Nov 12 08:32:57 UTC 2007 i686 GNU/Linux


Версия TOra:
$ ls -l /usr/src/tora-1.3.22/
-rw-r--r-- 1 root src 3496227 2008-01-15 18:19 tora-1.3.22.tar.gz


Итак... поехали...

  1. Получение Oracle Instant Client
  2. Скачиваем следующие пакеты:
    Или, как вариант, можно скачать соответствующие *.rpm пакеты с сайта Oracle и с помощью утилиты "alien" преобразовать их в *.deb.

  3. Установка Oracle Instant Client

  4. $ sudo dpkg -i oracle-instantclient-basic_10.2.0.3-2_i386.deb
    $ sudo dpkg -i oracle-instantclient-devel_10.2.0.3-2_i386.deb
    $ sudo dpkg -i oracle-instantclient-sqlplus_10.2.0.3-2_i386.deb


    Проверяем, куда был установлен клиент Oracle:
    $ whereis oracle
    oracle: /usr/lib/oracle /usr/include/oracle /usr/share/oracle


  5. Создание файла TNSNAMES.ORA
  6. Создаем файл /usr/lib/oracle/tnsnames.ora и заполняем его необходимыми данными для соединения с экземплярами БД Oracle.

  7. Настройка кэша динамических библиотек
  8. В файл /etc/ld.so.conf добавляем следующую строку:
    /usr/lib/oracle/10.2.0.3/client/lib

    После чего перегружаем кэш:
    $ sudo ldconfig

  9. Настройка переменных окружения
  10. Добавляем следующие строки в файл /etc/profile:
    LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib:$LD_LIBRARY_PATH
    TNS_ADMIN=/usr/lib/oracle
    export LD_LIBRARY_PATH TNS_ADMIN


  11. Получение и распаковка исходных кодов TOra
  12. Исходный код можно загрузить с оф. сайта:
    $ sudo mkdir /usr/src/tora
    $ cd /usr/src/tora
    $ wget http://switch.dl.sourceforge.net/sourceforge/tora/tora-1.3.22.tar.gz
    $ sudo tar zxvf tora-1.3.22.tar.gz


  13. Подготовка к пересборке TOra
  14. Устанавливаем необходимые модули:
    $ sudo aptitude install g++ gcc autoconf automake flex zlib1g-dev docbook-xsl
    $ sudo aptitude install libqt3-mt-dev libqt3-compat-headers


  15. Сборка TOra
  16. Переходим в директорию с исходным кодом и выполняем конфигурацию:
    $ cd /usr/src/tora/tora-1.3.22/
    $ ./configure --with-oracle=$ORACLE_HOME --with-oci-version=10G CC=gcc-4.2 --without-kde --with-xinerama


    В результате последней операции получаем сообщение об ошибке:
    ...
    checking whether uic supports -nounload ... yes
    checking if STL implementation is SGI like... yes
    checking for oracle... checking oci works... yes
    checking for qscintilla... configure: error: Couldn't compile a simple QScintilla application. See config.log or specify its location with --with-qscintilla-includes
    make: *** [configure-stamp] Ошибка 1


    То есть, в системе не оказалось пакета "libqscintilla-dev". Скачиваем его и повторяем попытки компиляции:
    $ wget http://ftp.pl.debian.org/debian/pool/main/q/qscintilla/libqscintilla-dev_1.7.1-2_all.deb
    $ sudo dpkg -i libqscintilla-dev_1.7.1-2_all.deb
    $ ./configure --with-oracle=$ORACLE_HOME --with-oci-version=10G CC=gcc-2.95 --without-kde --with-xinerama
    $ make
    $ sudo make install

    На этот раз ошибок не появилось.

  17. Запуск TOra
  18. Проверяем, где располагается TOra:
    $ whereis tora
    tora: /usr/bin/tora /usr/lib/tora /usr/local/tora /usr/share/tora /usr/share/man/man1/tora.1.gz


    Запускаем IDE:
    /usr/bin/tora


22 комментария:

Анонимный комментирует...

в 5 пункте вроде ошибка
LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.1/client/lib:$LD_LIBRARY_PATH
наверное вместо 10.2.0.1 должно быть 10.2.0.3

Timoshinin Evgeny комментирует...

Спасибо, уважаемый Анонним.
Fixed.

Анонимный комментирует...

конфиг успешно прошёл только с --with-instant-client вместо --with-oracle=$ORACLE_HOME.

Andrewsha комментирует...

Спасибо за статью!
так же помогло сообщение о --with-instant-client вместо --with-oracle=$ORACLE_HOME

Andrewsha комментирует...
Этот комментарий был удален автором.
Andrewsha комментирует...

сработало с:
./configure --prefix=/usr --with-instantclient --with-oracle-includes=/usr/include/oracle/10.2.0.3/client --without-kde --without-rpath --disable-new-check --enable-libsuffix=

мешал gcc-2.95

Виталий А комментирует...

Огромное спасибо автору за этот небольшой HOWTO.
У меня есть небольшой вопросик. Не сталкивались ли вы с проблемой подключения с помощью tora не сервер oracle где установлена кодировка RUSSIAN_RUSSIA.UTF8 ? tora сообщает об ошибке, смысл которой "instant client не поддерживает данную кодировку".

Timoshinin Evgeny комментирует...

Приветствую, Виталий.

В том случае, когда мне понадобилось собирать Tora, я использовал БД с AMERCIAN_AMERICA.AL32UTF8. Проблем с коннектом замечено не было.

Вы уверены, что локаль совпадает с локалью БД? Попробуйте установить нужную локаль на уровне сессии:

$ NLS_LANG=RUSSIAN_RUSSIA.UTF8 ./sqlplus user/pasword@database

Виталий А комментирует...

ERROR:
ORA-12737: Instant Client Light: unsupported server character set CL8ISO8859P5

не помогло.. причем "CL8ISO8859P5" - не понимаю что это..

Timoshinin Evgeny комментирует...

Судя по всему, кодировка на сервере совсем не UTF-8.

Проверить это можно следующим запросом:

select value
from nls_database_parameters
where parameter = 'NLS_CHARACTERSET'

Виталий А комментирует...

VALUE CL8ISO8859P5
хмм.. что посоветуете сделать с локалью чтобы всё было нормально.. я теперь даже не понимаю в какой кодировке там всё хранится :/

Анонимный комментирует...

Здравствуйте... не подскажете - почему при компиляции могут выводиться ошибки:
../ext/loki/loki-0.1.6/src/SmallObj.cpp:296: error: 'UCHAR_MAX' was not declared in this scope
../ext/loki/loki-0.1.6/src/SmallObj.cpp: In member function 'bool Loki::Chunk::IsCorrupt(unsigned char, size_t, bool) const':
../ext/loki/loki-0.1.6/src/SmallObj.cpp:428: error: 'UCHAR_MAX' was not declared in this scope
../ext/loki/loki-0.1.6/src/SmallObj.cpp:428: error: template argument 1 is invalid
../ext/loki/loki-0.1.6/src/SmallObj.cpp:428: error: invalid type in declaration before ';' token
../ext/loki/loki-0.1.6/src/SmallObj.cpp:460: error: request for member 'set' in 'foundBlocks', which is of non-class type 'int'
../ext/loki/loki-0.1.6/src/SmallObj.cpp:475: error: request for member 'test' in 'foundBlocks', which is of non-class type 'int'
../ext/loki/loki-0.1.6/src/SmallObj.cpp:486: error: request for member 'count' in 'foundBlocks', which is of non-class type 'int'
../ext/loki/loki-0.1.6/src/SmallObj.cpp: In member function 'bool Loki::Chunk::IsBlockAvailable(void*, unsigned char, size_t) const':
../ext/loki/loki-0.1.6/src/SmallObj.cpp:522: error: 'UCHAR_MAX' was not declared in this scope
../ext/loki/loki-0.1.6/src/SmallObj.cpp:522: error: template argument 1 is invalid
../ext/loki/loki-0.1.6/src/SmallObj.cpp:522: error: invalid type in declaration before ';' token
../ext/loki/loki-0.1.6/src/SmallObj.cpp:527: error: request for member 'set' in 'foundBlocks', which is of non-class type 'int'
../ext/loki/loki-0.1.6/src/SmallObj.cpp:536: error: request for member 'test' in 'foundBlocks', which is of non-class type 'int'
make[3]: *** [tora-SmallObj.o] Ошибка 1
make[3]: Leaving directory `/opt/soft/nix/oracle/tora-1.3.22/src'
make[2]: *** [all] Ошибка 2
make[2]: Leaving directory `/opt/soft/nix/oracle/tora-1.3.22/src'
make[1]: *** [all-recursive] Ошибка 1
make[1]: Leaving directory `/opt/soft/nix/oracle/tora-1.3.22'
make: *** [all] Ошибка 2

...пробовал разные версии торы и gcc :(

Анонимный комментирует...

Может кто сталкивался с подобным (впервые ставлю тору) - соединение с сервером происходит нормально, но далее в броузере не отображается список таблиц базы - http://s54.radikal.ru/i144/0809/8d/9ece673b122d.jpg
...а проблему кодировок, описанную выше, решил использованием другого клиента:
deb http://oss.oracle.com/debian unstable main non-free

wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | apt-key add -


$ apt-get update
$ apt-get install oracle-xe-client


добавляем в /etc/profile:
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client
export NLS_LANG=AMERICAN_AMERICA.UTF8
#export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
export SQLPATH=$ORACLE_HOME/sqlplus
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

Timoshinin Evgeny комментирует...

... Может кто сталкивался с подобным (впервые ставлю тору) - соединение с сервером происходит нормально, но далее в броузере не отображается список таблиц базы - ...
А таблицы-то вообще есть у пользователя, под которым выполняется соединение?

Проверить можно так:

select * from user_tables;

Анонимный комментирует...

Timoshinin Evgeny, все гут с таблицами - с венды под plsql developer'ом нормально все отображает, а здесь не понятно...
...причем когда запускаю дебагер, то он отображает "сломанные" пэкеджи, а вот "живые" никак не видно :(

Анонимный комментирует...

Получается, что с одними параметрами через pl/sql developer я вижу все объекты, а тут только пользовательские?
...подскажите, плиз, как тогда увидеть все - похоже моя чего-то не понимать :(

Анонимный комментирует...

Прошу прощения... я само тупило :(

Анонимный комментирует...

вопрос к анонимному:

как исправили ошибку с loki-0.1.6 ?

заранее спасибо

CaMypau комментирует...

надо в файле SmallObj.cpp добавить
заголовочный файл climits в include
и по идее все должно скомпилиться

Макс комментирует...

Tora 2.1.3
oracle 11g

при компиляции выскакивает ошибка:
tora-toawr.o: In function `~toAWR': /tmp/tora/tora-2.1.3/src/toawr.cpp:381: undefined reference to `vtable for toAWR' /tmp/tora/tora-2.1.3/src/toawr.cpp:381: undefined reference to `vtable for toAWR' /tmp/tora/tora-2.1.3/src/toawr.cpp:381: undefined reference to `vtable for toAWR' /tmp/tora/tora-2.1.3/src/toawr.cpp:381: undefined reference to `vtable for toAWR' /tmp/tora/tora-2.1.3/src/toawr.cpp:381: undefined reference to `vtable for toAWR' tora-toawr.o:/tmp/tora/tora-2.1.3/src/toawr.cpp:381: more undefined references to `vtable for toAWR' follow tora-toawr.o: In function `toAWR::tr(char const*, char const*)': /tmp/tora/tora-2.1.3/src/toawr.h:57: undefined reference to `toAWR::staticMetaObject' collect2: ld returned 1 exit status make[3]: *** [tora] Ошибка 1 make[3]: Выход из каталога `/tmp/tora/tora-2.1.3/src' make[2]: *** [all] Ошибка 2 make[2]: Выход из каталога `/tmp/tora/tora-2.1.3/src' make[1]: *** [all-recursive] Ошибка 1 make[1]: Выход из каталога `/tmp/tora/tora-2.1.3' make: *** [all] Ошибка 2 maks@maks-nb:/tmp/tora/tora-2.1.3$


лечиться либо скачать версию из транка или так:
в файле tora-2.1.3/src/Makefile.am
в секции BUILT_SOURCES зарегистрировать файл moc_toawr.cpp.

Denius комментирует...

Что-то не удается победить src/toawr.h:57: undefined reference to `toAWR::staticMetaObject'
Из транка скачиваю, эта ошибка не вылазит, но там куча других. А если по рекомендации с регистрацией cpp-файла, то не компилится, все та же ошибка.

Denius комментирует...

Помогло добавление строки в файл tora-2.1.3/src/Makefile.in