Forum Webscript.Ru

Программирование => Perl => Тема начата: denex от 24 Сентября 2002, 16:22:58

Название: Помогите с модулями!!!
Отправлено: denex от 24 Сентября 2002, 16:22:58
Нужно в программе создать объект БД (модуль DBI)
скажем $dbi = new....


package MyModule;
....
И этот же объект использовать в модуле скажем так:
$dbi->quote(...);

Помогите кто может! Все мозги сломал.
Название: Помогите с модулями!!!
Отправлено: NeoNox от 24 Сентября 2002, 17:18:33
Ничего не понял. :(
Подробнее расскажи.
Название: Помогите с модулями!!!
Отправлено: denex от 24 Сентября 2002, 18:07:25
У меня есть Perl скрипт somescript.cgi
В скрипте я с помощью модуля DBI соединяюсь с БД
my $dbh = DBI->connect(параметры соединения)
Получил объект $dbi.

Хочу передать этот объект своему модулю приблизительно так:
my $SomeObj = MyModule->new(\'DB\' => \\$dbh,
\'SomeParam\' => \'zxc\'
...
);


Далее я хочу использовать данный объект $dbi со всеми его методами в модуле (который сам написал) MyModule.pm
Как этого добиться?

Буду рад любой помощи.
Название: Помогите с модулями!!!
Отправлено: Serchey от 24 Сентября 2002, 18:44:55
Я делал не так.
В главной проге я ДБИ не подгружал, а делал это в своих модулях так:

package mod::dialup;
use strict;
use vars qw(@ISA @EXPORT $dbh);

use mod::common;
use Exporter;
use DBI;

@ISA = (\'Exporter\');
@EXPORT = qw();

sub get_inv {
 my $class = shift;
 my $self = {};
 %$self = @_;
 open(OLDERR,">&STDERR") or die "Couldn\'t dup STDERR: $!\\n";
 close(STDERR);
 eval \'$dbh = DBI->connect("DBI:mysql:$self->{dbname}:$self->{dbhost}",$self->{dbuser},$self->{dbpass});\';
 open(STDERR,">&OLDERR") or die "Couldn\'t dup OLDERR: $!\\n";
 close(OLDERR);
 open(STDERR,">>./error_log") or die "Couldn\'t rediect STDERR!: $!\\n";
 unless(defined $dbh){error("Database is not aviable",1);}
 $self->{rest_days} = {};
 $self->{holidays} = {};
 $self->{users} = {};
 $self->{users_id} = {};

 my $sth = $dbh->prepare(\'select * from settings;\');
 $sth->execute() or error("Can\'t execute the query \'select * from settings;\'");
 my $row;
 while($row = $sth->fetchrow_arrayref()){
  unless(exists $self->{$row->
   $self->{$row->
  }
 }
 $sth->finish();

 bless($self,$class);
 return $self;
}

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

sub finish {
 if(defined $dbh){$dbh->disconnect();}
}

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

При этом в главной программе делал вот что:

$dialup = mod::dialup->get_inv(%settings);

END {
 mod::dialup->finish();
}


Теперь с любого места в модуле можно просто, спокойно написать:

my $sth = $dbh->prepare(...
Название: Помогите с модулями!!!
Отправлено: Serchey от 24 Сентября 2002, 18:47:42
Да, то что я делал с STDERR вам делать не обязательно. Просто ДБИ использует die ".."(или croak) если че не получается, а я не хочу, чтоб моя прога вылетала с такими матами...
Название: Помогите с модулями!!!
Отправлено: denex от 25 Сентября 2002, 15:54:12
В общем все нормально, только мне для задачи нужно именно уже подготовленный объект $dbh из главной программы передать во внутрь модуля, как этого можно добиться?

Просто сам модуль не должен иметь пердставление о способе подключения к бд.
Название: Помогите с модулями!!!
Отправлено: Serchey от 25 Сентября 2002, 16:28:14
Тут такая штука - каждий модуль использующий ДБИ должен иметь в коде \'use DBI;\'.(имхо) Я так подумал, и пришел к выводу что это невозможно, т.к. мы работаем с ООП - со всеми вытекающими ;)
А какова задача?
Название: Помогите с модулями!!!
Отправлено: Ленивый гость от 26 Сентября 2002, 11:13:42
Огромное спасибо всем за помощь!
Разобрался и все получилось!!!!!!!
Название: Помогите с модулями!!!
Отправлено: Serchey от 26 Сентября 2002, 15:20:11
Напиши как - другим ведь тоже интересно!