Test-mysqld-DatadirDumper

 view release on metacpan or  search on metacpan

lib/Test/mysqld/DatadirDumper.pm  view on Meta::CPAN

package Test::mysqld::DatadirDumper;
use 5.008001;
use strict;
use warnings;

our $VERSION = "0.01";

use Carp qw/croak/;
use DBI;
use DBIx::FixtureLoader;
use File::Spec;
use Test::mysqld;

use Class::Accessor::Lite (
    new => 1,
    ro  => [qw/ddl_file datadir fixtures/],
);

sub dump {
    my $self = shift;

    my $datadir = $self->datadir;
    unless ( File::Spec->file_name_is_absolute($datadir) ) {
        $datadir = File::Spec->rel2abs($datadir),
    }

    my $mysqld = Test::mysqld->new(
        my_cnf   => {
            'skip-networking' => '',
            datadir => $datadir,
        },
    ) or die $Test::mysqld::errstr;

    my $dsn = $mysqld->dsn;
    my $dbh = DBI->connect($dsn, '', '', {
        RaiseError          => 1,
        PrintError          => 0,
        ShowErrorStatement  => 1,
        AutoInactiveDestroy => 1,
        mysql_enable_utf8   => 1,
    });

    my $source = do {
        local $/;
        open my $fh, '<', $self->ddl_file or die $!;
        <$fh>
    };
    my @statements = map { "$_;" } grep { /\S+/ } split ';', $source;
    for my $statement (@statements) {
        $dbh->do($statement) or croak $dbh->errstr;
    }

    if (my @fixtures = @{ $self->fixtures || [] }) {
        my $loader = DBIx::FixtureLoader->new(dbh => $dbh);
        $loader->load_fixture($_) for @fixtures;
    }
}

1;
__END__

=encoding utf-8

=head1 NAME

Test::mysql::DatadirDumper - Dump mysql data directory for Test::mysqld

=head1 SYNOPSIS

    use Test::mysql::DatadirDumper;
    my $datadir = 'path/to/datadir';
    Test::mysqld::DatadirDumper->new(
        datadir  => $datadir,
        ddl_file => 't/data/ddl.sql',
        fixtures => ['t/data/item.yml'],
    )->dump;

    # $datadir is usable as follows
    my $mysqld = Test::mysqld->new(
        my_cnf => {
          'skip-networking' => '',
        },
        copy_data_from => $datadir,
    );

=head1 DESCRIPTION

Test::mysql::DatadirDumper is to dump data directory of mysql.
The directory is useful for L<Test::mysql>'s C<copy_data_from> option.

=head1 CONSTRUCTOR

C<new> is constructor and following options are available.

=over

=item C<datadir:Str>

Required. Data directory to be dumped.



( run in 1.791 second using v1.01-cache-2.11-cpan-995e09ba956 )