Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBD::Oracle и tnsnames.ora, Вытянуть из tnsnames.ora все алиасы 
:(
    Опции темы
AlexPet
Дата 25.12.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Добрый день!
Конфигурация: Windows XP + Perl 5.8.8 от Active State. Установлен DBD::Oracle, вроде последний.
Также независимо от перла установлен клиент для Oracle (вместе с Perl PL\SQL Developer) версии ниже, чем для DBD::Oracle (10 и 8, вроде). На сервере Oracle 10.
Есть файл TNSNAMES.ORA, в котором записаны alias'ы для БД (включающие такую необходимую инфу как Port, Host и SID).
Что хотелось бы: вытаскивать в массив всю структуру из tnsnames для последующего использования в диалоге подключения под Tk, типа выпадающий список, выбираем alias,  набираем имя\пароль и, используя данные из полученного массива, делать connect к соотв. базе.
Ситуация осложняется тем, что приложение будет запускаться (возможно) не на одном компьютере, и путь, по которому находится TNSNAMES.ORA, может разниться от компа к компу.
Какие существуют методы для вытягивания инфы из TNSNAMES.ORA? 

Самый в лоб, который я вижу, это брать откуда-то (возможно, из реестра... либо парсить PATH на предмет вхождения orant) полный путь к файлу и парсить его самостоятельно. Может, есть какие-нибудь пути поизящнее? Поделитесь опытом smile
PM MAIL ICQ Jabber   Вверх
ZeeLax
Дата 25.12.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



Хм.. Насколько помню, поиск tsnames.ora выполняется относительно пути, указанном в ORACLE_HOME.


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
AlexPet
Дата 26.12.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Дело в том, что в переменных окружения такой переменной нет.
НО: Orac-alpha-1.2.6 прекрасно находит все алиасы (да и компонента под Дельфи тоже), хотя единственная переменная, в которой есть упоминание об Oracle - это PATH.
PM MAIL ICQ Jabber   Вверх
shamber
Дата 27.12.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



AlexPet, смотри в реестре.

Код


Go to HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 

If an ORACLE_HOME definition exists here, ensure that it is defined to the proper path (for example, C:\Oracle\Ora81). You can change the value by double-clicking on the ORACLE_HOME name. 

You may find, under the ORACLE folder, folders such as HOME0 and HOME1. If the contents of one of these has paths all pointing to the "wrong" middleware location, and the other folder's contents all point to the "right" middleware, right-click on the "wrong" middleware folder and delete it.

PM MAIL Jabber   Вверх
AlexPet
Дата 28.12.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



shamber, спасибо.
Значит, смотрю в HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ORACLE_HOME корневой адрес, делаю конкатенацию с "\NET80\ADMIN\TNSNAMES.ORA" и получаю имя файла.
Далее, видимо (если я ошибаюсь, поправьте), будем парсить вручную smile
PM MAIL ICQ Jabber   Вверх
AlexPet
Дата 17.1.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



В общем, сегодня вернулся к данной проблеме и сделал так:
Код

#!/usr/bin/perl

use Tk;
use DBI;
use strict;
use warnings;
use Win32::TieRegistry;

use encoding "cp-1251";

use Tk::DialogBox;
use Tk::JComboBox;

my $mw = MainWindow->new(-title => 'Проверка соединения');
my ($sql, $dbh);

connect_dialog();

MainLoop();

sub err {
    $mw->Label(-text => 'Ошибка авторизации. Пожалуйста, перезапустите программу.')->pack();
}

sub noerr {
        $mw->Label(-text => 'Соединение прошло успешно!')->pack();
    $mw->Button( -text=>'Выход', -command=>\&doExit )->pack(-side=>'bottom');
}

sub doExit {
   $dbh->disconnect(  );  
   exit;
}

sub alias_hash {
    $Registry->Delimiter("/");
    my $tns = $Registry->{"HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE//NET80"};
    $tns .= '\ADMIN\TNSNAMES.ORA';
    $tns =~ s/\\/\\\\/g;
    open my $fil, '<', $tns;
    my ($str, $alias, %h);
    while (chomp($str = <$fil>)) {
        $alias = $1 if $str =~ /^\s*(\w+)\s*=\s*$/;
        $h{$alias}{'host'} = $1 if $str =~ /Host\s*=\s*([\w.]+)\)/;
        $h{$alias}{'port'} = $1 if $str =~ /Port\s*=\s*(\d+)\)/;
        $h{$alias}{'sid'} = $1 if $str =~ /SID\s*=\s*(\w+)\)/;
    }
    close ($fil);
    return %h;
}

sub connect_dialog {
    my %h = alias_hash();
    my ($login, $pwd);

    my $db = $mw->DialogBox(-title => 'Авторизация Oracle', -buttons => ['Ok'], -default_button => 'Ok');
    $db->add('Label', -text => 'Подключиться к')->grid(-column => 0, -row =>0);
    my $jcb = $db->add('JComboBox', -choices => [sort keys %h])->grid(-column => 1, -row =>0, -sticky => 'e');
    $db->add('Label', -text => 'Логин')->grid(-column => 0, -row =>1);
    $db->add('Entry', -textvariable => \$login)->grid(-column => 1, -row =>1);
    $db->add('Label', -text => 'Пароль')->grid(-column => 0, -row =>2);
    $db->add('Entry', -textvariable => \$pwd, -show => '*')->grid(-column => 1, -row =>2);
    $jcb->setSelectedIndex(0);
    $db->Show( );
    
    my $alias = $jcb->getItemNameAt($jcb->getSelectedIndex());
    my ($host, $sid, $port) = ($h{$alias}{'host'}, $h{$alias}{'sid'}, $h{$alias}{'port'});
    my $flag = 0;
    $dbh = DBI->connect( "dbi:Oracle:host=$host;sid=$sid;port=$port", $login, $pwd ) or $flag = 1;
    noerr() unless $flag;
    err() if $flag;
}

Может, кому понадобится (по-моему, получилось как в компоненте для Delphi smile)
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.