Forum Webscript.Ru
Программирование => Perl => Тема начата: AnnA от 05 Октября 2005, 16:12:35
-
Всем осенний приветик. . :)
подскажите пож-ста, как сделать автоматическое отсоединение от бд?
пробую и END, и DESTROY, но где-то ошибаюсь исходя из того, что написано в логе:
[error] [client 127.0.0.1] …: Issuing rollback() for database handle
being DESTROY\'d without explicit disconnect() at dbtools.pm
line 71., referer: [url]http://localhost…[/url]
вот урывки скрипта который дает эту запись в лог:
#!/usr/bin/perl -w
END { &DESTROY($dbh) if $dbh }
use strict;
no strict \'refs\';
…
use dbtools;
в dbtools
…
our $dbh;
…
sub connect($$) {
my ($l, $p)=@_;
$dbh = DBI->connect ("DBI:mysql:host=$HOST_DB;database=$NAME_DB", $l, $p,
{PrintError => 0, RaiseError => 0, AutoCommit => 0});
71--> if ($dbh) {
$dbh->do(\'SET CHARACTER SET cp1251\') or die $DBI::errstr;
$dbh->do(\'SET NAMES cp1251\') or die $DBI::errstr;
return $dbh; }
else {return}
}
…
…
sub DESTROY {$dbh=shift; $dbh->disconnect(); }
-
dbmodule.pm
use strict;
use vars qw/@ISA @EXPORT $DBH/;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/
$DBH
&func_1
...
&func_n
/;
use DBI;
my $database = \'database\';
my $username = \'root\';
my $password = \'passw0rd\';
$DBH = DBI->connect("dbi:mysql:$database:localhost:3306", $username, $password, { RaiseError => 1, PrintError => 1 });
END { $DBH->disconnect() if $DBH }
sub func_1 {
...
}
...
sub func_n {
...
}
1;
script.pl
#!/usr/bin/perl
BEGIN { unshift @INC, \'/path/to/modules\' }
use strict;
use lib::dbmodule;
-
Wyclef
пасиба за ответ. :) "разжевали".
у меня в dbmodule есть как бы автоэкспортер:
# Экспортирует все функции в вызвавший пакет.
sub import {
while( my ( $k, $v ) = each( %{ __PACKAGE__."::" } ) ) {
next if substr( $k , -1 ) eq ":" || grep { $k eq $_ } qw(BEGIN import);
*{ caller()."::".$k } = $v;
}
}
$dbh объявлена глобальной, функция, использующая ее, в первом посте есть. :)
т.е. насколько я понимаю - дОлжно работать такой методе. ан нет.
так не хочется все переписывать.