Forum Webscript.Ru

Программирование => Perl => Тема начата: AnnA от 05 Октября 2005, 16:12:35

Название: $dbh->disconnect();
Отправлено: 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(); }
Название: $dbh->disconnect();
Отправлено: Wyclef от 09 Октября 2005, 13:37:35
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;
Название: $dbh->disconnect();
Отправлено: AnnA от 10 Октября 2005, 11:56:07
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 объявлена глобальной, функция, использующая ее, в первом посте есть. :)
т.е. насколько я понимаю - дОлжно работать такой методе. ан нет.
так не хочется все переписывать.