From 55ee808310fc7b06031c8b848c0bb6c4e80c4fdd Mon Sep 17 00:00:00 2001 From: Brian Fraser Date: Tue, 31 Jan 2012 17:19:22 -0300 Subject: [PATCH] Bugfix for https://bugs.launchpad.net/percona-toolkit/+bug/903379 --- bin/pt-archiver | 13 ++---- t/pt-archiver/issue_903379.t | 78 ++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 t/pt-archiver/issue_903379.t diff --git a/bin/pt-archiver b/bin/pt-archiver index 004b5bee..86063377 100755 --- a/bin/pt-archiver +++ b/bin/pt-archiver @@ -3953,15 +3953,10 @@ sub main { # Open the file and print the header to it. if ( $archive_file ) { my $need_hdr = $o->get('header') && !-f $archive_file; - my $charset = lc $o->get('charset'); - if ( $charset ) { - $archive_fh = IO::File->new($archive_file, ">>:$charset") - or die "Cannot open $charset $archive_file: $OS_ERROR\n"; - } - else { - $archive_fh = IO::File->new($archive_file, ">>") - or die "Cannot open $archive_file: $OS_ERROR\n"; - } + my $charset = $o->get('charset'); + $charset = $charset ? ":" . Encode::resolve_alias($charset) : ''; + $archive_fh = IO::File->new($archive_file, ">>$charset") + or die "Cannot open $charset $archive_file: $OS_ERROR\n"; $archive_fh->autoflush(1) unless $o->get('buffer'); if ( $need_hdr ) { print $archive_fh '', escape(\@sel_cols), "\n" diff --git a/t/pt-archiver/issue_903379.t b/t/pt-archiver/issue_903379.t new file mode 100644 index 00000000..831ced18 --- /dev/null +++ b/t/pt-archiver/issue_903379.t @@ -0,0 +1,78 @@ +#!/usr/bin/env perl + +BEGIN { + die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n" + unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH}; + unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib"; +}; + +use strict; +use warnings FATAL => 'all'; +use English qw(-no_match_vars); +use Test::More; + +use PerconaTest; +use Sandbox; +require "$trunk/bin/pt-archiver"; + +my $dp = new DSNParser(opts=>$dsn_opts); +my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); +my $dbh = $sb->get_dbh_for('master'); + +if ( !$dbh ) { + plan skip_all => 'Cannot connect to sandbox master'; +} +else { + plan tests => 2; +} + +my $output; +my $rows; +my $cnf = "/tmp/12345/my.sandbox.cnf"; + +$sb->load_file('master', 't/pt-archiver/samples/issue_1152.sql'); + +# ############################################################################# +# Bug #903379: --file & --charset could cause warnings and exceptions +# ############################################################################# + +$output = output( + sub { + no warnings "syntax"; + pt_archiver::main( + '--source', 'h=127.1,P=12345,D=issue_1152,t=t,u=msandbox,p=msandbox', + '--dest', 'h=127.1,P=12345,D=issue_1152_archive,t=t', + '--columns', 'a,b,c', + '--where', 'id = 5', + qw( --nocheck-columns --replace --commit-each --bulk-insert --bulk-delete + --statistics + --no-check-charset ), + '--file', '/tmp/mysql/%Y-%m-%d-%D_%H:%i:%s.%t', + ) + }, +); +ok(1, "pt-archiver with an explicit --file works"); + +$output = output( + sub { + no warnings "syntax"; + pt_archiver::main( + '--source', 'h=127.1,P=12345,D=issue_1152,t=t,u=msandbox,p=msandbox', + '--dest', 'h=127.1,P=12345,D=issue_1152_archive,t=t', + '--columns', 'a,b,c', + '--where', 'id = 5', + qw( --nocheck-columns --replace --commit-each --bulk-insert --bulk-delete + --statistics + --no-check-charset ), + '--file', '/tmp/mysql/%Y-%m-%d-%D_%H:%i:%s.%t', + '--charset', 'latin1', + ) + }, +); +ok(1, "pt-archiver with an explicit --file & --charset works, even if the charset isn't official"); + +# ############################################################################# +# Done. +# ############################################################################# +$sb->wipe_clean($dbh); +exit;