From 05f7de70195edff91548dfc0c166b396e2fe7dd2 Mon Sep 17 00:00:00 2001 From: "eseyman%linagora.com" <> Date: Thu, 26 Jun 2008 14:36:07 +0000 Subject: Bug 394574: bzdbcopy should avoid reading entire tables into memory Patch by Olav Vitters r=mkanat a=mkanat --- contrib/bzdbcopy.pl | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'contrib/bzdbcopy.pl') diff --git a/contrib/bzdbcopy.pl b/contrib/bzdbcopy.pl index 5f5800d88..eade75683 100755 --- a/contrib/bzdbcopy.pl +++ b/contrib/bzdbcopy.pl @@ -54,6 +54,14 @@ print "Connecting to the '" . SOURCE_DB_NAME . "' source database on " . SOURCE_DB_TYPE . "...\n"; my $source_db = Bugzilla::DB::_connect(SOURCE_DB_TYPE, SOURCE_DB_HOST, SOURCE_DB_NAME, undef, undef, SOURCE_DB_USER, SOURCE_DB_PASSWORD); +# Don't read entire tables into memory. +if (SOURCE_DB_TYPE eq 'Mysql') { + $source_db->{'mysql_use_result'}=1; + + # MySQL cannot have two queries running at the same time. Ensure the schema + # is loaded from the database so bz_column_info will not execute a query + $source_db->_bz_real_schema; +} print "Connecting to the '" . TARGET_DB_NAME . "' target database on " . TARGET_DB_TYPE . "...\n"; @@ -87,8 +95,10 @@ foreach my $table (@table_list) { @table_columns = map { s/^\Q$ident_char\E?(.*?)\Q$ident_char\E?$/$1/; $_ } @table_columns; + my ($total) = $source_db->selectrow_array("SELECT COUNT(*) FROM $table"); my $select_query = "SELECT " . join(',', @table_columns) . " FROM $table"; - my $data_in = $source_db->selectall_arrayref($select_query); + my $select_sth = $source_db->prepare($select_query); + $select_sth->execute(); my $insert_query = "INSERT INTO $table ( " . join(',', @table_columns) . " ) VALUES ("; @@ -119,8 +129,7 @@ foreach my $table (@table_list) { print "Writing data to the target '$table' table on " . TARGET_DB_TYPE . "...\n"; my $count = 0; - my $total = scalar @$data_in; - foreach my $row (@$data_in) { + while (my $row = $select_sth->fetchrow_arrayref) { # Each column needs to be bound separately, because # many columns need to be dealt with specially. my $colnum = 0; -- cgit v1.2.3-24-g4f1b