Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3440[/thread]

$dbh->quote allociert Speicher bis zum Überlauf: Datenbank als SQL-Anweisungen in File



<< >> 2 Einträge, 1 Seite
steffenw
 2004-04-14 18:00
#32029 #32029
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Für ausgewählte MySQL-Datenbanken möchte ich die Erstellung der Tabellen und deren Inhalt als File mit SQL-Anweisungen täglich sichern.

Dabei bin ich auf das Problem mit dem $dbh->quote() gestoßen. Wenn ich das anstatt meiner eingenen sub benutzte, dann wird der ganze Speicher des PC allociert und das Programm bricht ab. Wenn ich meine eigene sub nehme, ist der Speicherbedarf dauerhaft ziemlich klein.

der wesentliche Ausschnitt aus dem Programm:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
for ('mysql', $db)
{ my $sth = $dbh->prepare("show tables from $_");
$sth->execute();
while (my $table = $sth->fetchrow_arrayref())
{ $table = $table->[0];
my $filename = "save_db_$_/$table.sql";
open FILE, "> $filename" or die "open $filename\n$!\n";
my $sth = $dbh->prepare("show create table $_.$table");
$sth->execute();
while (my $create = $sth->fetchrow_arrayref())
{ print "$_.$create->[0]\n";
$create = $create->[1];
print FILE
"use $_;\n",
"$create;\n"
or die "print $filename\n$!\n";
}
$sth->finish();
$sth = $dbh->prepare("select * from $_.$table");
$sth->execute();
while (my $value = $sth->fetchrow_arrayref())
{ print FILE
"insert into $table ("
.join(',', @{$sth->{NAME}})
.") values ("
# .join(',', map $dbh->quote($_), @$value) # das Problem
.join(',', map mysql_quote($_), @$value) # so funktioniert's
.");\n"
or die "print $filename\n$!\n";
}
$sth->finish();
close FILE or die "close $filename\n$!\n";
}
$sth->finish();
}
$dbh->disconnect();


eigene sub anstatt $dbh->quote()
Code: (dl )
1
2
3
4
5
6
7
8
sub mysql_quote
{ local $_ = shift;
 defined $_ or return 'NULL';
 s/\'/\\'/g;
 s/\x0d/\\r/g;
 s/\x0a/\\n/g;
 return "'$_'";
}
\n\n

<!--EDIT|steffenw|1081951620-->
$SIG{USER} = sub {love 'Perl' or die};
ptk
 2004-04-14 18:38
#32030 #32030
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Kann ich nicht bestaetigen. Hast du die neuesten DBI und DBD::mysql-Versionen? Im Changelog von DBD::mysql finde ich naemlich:

Code: (dl )
1
2
3
4
1999-08-22  Jochen Wiedmann  <joe@ispsoft.de> (1.2203)

* dbd/dbd.xs.in: Fixed a memory leak in $dbh->quote().
Arun Bhalla <abhalla@usgs.gov>
<< >> 2 Einträge, 1 Seite



View all threads created 2004-04-14 18:00.