File Coverage

blib/lib/DBIx/QuickDB/Driver/MySQLCom.pm
Criterion Covered Total %
statement 32 76 42.1
branch 5 38 13.1
condition 0 21 0.0
subroutine 9 15 60.0
pod 2 5 40.0
total 48 155 30.9


line stmt bran cond sub pod time code
1             package DBIx::QuickDB::Driver::MySQLCom;
2 11     11   229755 use strict;
  11         25  
  11         450  
3 11     11   58 use warnings;
  11         26  
  11         898  
4              
5             our $VERSION = '0.000039';
6              
7 11     11   2152 use IPC::Cmd qw/can_run/;
  11         206220  
  11         914  
8 11     11   2065 use Capture::Tiny qw/capture/;
  11         35052  
  11         689  
9              
10 11     11   92 use parent 'DBIx::QuickDB::Driver::MySQL';
  11         43  
  11         90  
11 11     11   881 use DBIx::QuickDB::Util::HashBase;
  11         72  
  11         75  
12              
13 13     13 0 72 sub provider { 'MySQL Community Server' }
14              
15 27     27 0 56 sub dbd_driver_order { my $class = shift; $class->SUPER::dbd_driver_order($ENV{QDB_MYSQLD_DBD}) }
  27         182  
16              
17             sub init {
18 0     0 1 0 my $self = shift;
19              
20 0         0 my $binary = $self->server_bin;
21 0     0   0 my ($help) = capture { system($binary, '--help', '--verbose') };
  0         0  
22              
23 0 0       0 if ($help =~ m/--initialize/) {
    0          
24 0         0 $self->{+USE_BOOTSTRAP} = 0;
25             }
26             elsif ($help =~ m/--bootstrap/) {
27 0         0 $self->{+USE_BOOTSTRAP} = 1;
28              
29 0 0       0 $self->{+USE_INSTALLDB} = $self->install_bin ? 1 : 0;
30             }
31              
32 0         0 $self->SUPER::init();
33             }
34              
35             sub verify_provider {
36 0     0 0 0 my $class = shift;
37 0         0 my ($bin, $provider) = @_;
38              
39 0   0     0 $provider //= $class->provider;
40              
41 0     0   0 my ($v1, $v2) = capture { system($bin, '--help', '--verbose') };
  0         0  
42 0         0 my $v = $v1 . "\n" . $v2;
43 0 0       0 return 1 if $v =~ m/$provider/i;
44 0         0 return 0;
45             }
46              
47             sub viable {
48 27     27 1 51 my $this = shift;
49 27         60 my ($spec) = @_;
50              
51 27 50       242 my %check = (ref($this) ? %$this : (), $this->_default_paths, %$spec);
52              
53 27         65 my @bad;
54              
55 27 50       116 push @bad => "Could not load either 'DBD::MariaDB' or 'DBD::mysql', needed for everything"
56             unless $this->dbd_driver;
57              
58 27 50       51 if (!keys %{$this->provider_info}) {
  27         98  
59 27         106 push @bad => "Installed MySQL is not " . $this->provider;
60             }
61             else {
62 0 0       0 if ($spec->{bootstrap}) {
    0          
63 0 0 0     0 push @bad => "'mysqld' command is missing, needed for bootstrap" unless $check{server} && -x $check{server};
64             }
65             elsif ($spec->{autostart}) {
66 0 0 0     0 push @bad => "'mysqld' command is missing, needed for autostart" unless $check{server} && -x $check{server};
67             }
68              
69 0 0       0 if ($spec->{load_sql}) {
70 0 0 0     0 push @bad => "'mysql' command is missing, needed for load_sql" unless $check{client} && -x $check{client};
71             }
72             }
73              
74 27 50       86 if ($check{server}) {
75 0         0 my $version = $this->version_string;
76 0 0 0     0 if ($version && $version =~ m/(\d+)\.(\d+)\.(\d+)/) {
77 0         0 my ($a, $b, $c) = ($1, $2, $3);
78 0 0 0     0 push @bad => "'mysqld' is too old ($a.$b.$c), need at least 5.6.0"
      0        
79             if $a < 5 || ($a == 5 && $b < 6);
80             }
81             }
82              
83 27 50       87 return (1, undef) unless @bad;
84 27         169 return (0, join "\n" => @bad);
85             }
86              
87             sub bootstrap {
88 0     0     my $self = shift;
89              
90 0           my $init_file = $self->SUPER::bootstrap(@_);
91 0           my $data_dir = $self->{+DATA_DIR};
92              
93 0 0         if ($self->{+USE_BOOTSTRAP}) {
94 0 0         if ($self->{+USE_INSTALLDB}) {
95 0           local $ENV{PERL5LIB} = "";
96 0           $self->run_command([$self->install_bin, '--datadir=' . $data_dir]);
97             }
98 0           $self->write_config();
99 0           $self->run_command([$self->start_command, '--bootstrap'], {stdin => $init_file});
100             }
101             else {
102 0           $self->write_config();
103 0           $self->run_command([$self->start_command, '--initialize']);
104 0           $self->start;
105 0           $self->load_sql("", $init_file);
106             }
107              
108 0           return;
109             }
110              
111             sub _default_config {
112 0     0     my $self = shift;
113              
114 0           my %config = $self->SUPER::_default_config(@_);
115              
116 0           $config{mysql}->{'no-auto-rehash'} = '';
117              
118 0           return %config;
119             }
120              
121              
122             1;
123              
124             __END__