File Coverage

blib/lib/Pgtools/Config_diff.pm
Criterion Covered Total %
statement 38 104 36.5
branch 0 10 0.0
condition n/a
subroutine 9 14 64.2
pod 0 7 0.0
total 47 135 34.8


line stmt bran cond sub pod time code
1             package Pgtools::Config_diff;
2 1     1   36067 use strict;
  1         2  
  1         21  
3 1     1   3 use warnings;
  1         1  
  1         25  
4              
5 1     1   306 use Pgtools;
  1         2  
  1         18  
6 1     1   250 use Pgtools::Conf;
  1         1  
  1         4  
7 1     1   293 use Pgtools::Connection;
  1         1  
  1         3  
8 1     1   436 use List::MoreUtils qw(uniq);
  1         7477  
  1         5  
9 1     1   405 use parent qw(Class::Accessor);
  1         1  
  1         4  
10             __PACKAGE__->mk_accessors(qw(argv));
11              
12             sub exec {
13 0     0 0 0 my $self = shift;
14 0         0 my $default = {
15             "host" => "localhost",
16             "port" => "5432",
17             "user" => "postgres",
18             "password" => "",
19             "database" => "postgres"
20             };
21 0         0 my @dbs, my @confs;
22 0         0 my $db_cnt = scalar(@{$self->argv});
  0         0  
23              
24 0         0 for(my $i=0; $i<$db_cnt; $i++) {
25 0         0 my $db = Pgtools::Connection->new($default);
26 0         0 $db->set_args($self->argv->[$i]);
27 0         0 $db->create_connection();
28              
29 0         0 my $c = get_db_config($self, $db);
30 0         0 my $v = get_db_version($self, $db);
31 0         0 my $obj = {
32             "version" => $v,
33             "items" => $c
34             };
35              
36 0         0 push(@dbs, $db);
37 0         0 push(@confs, Pgtools::Conf->new($obj));
38              
39 0         0 $db->dbh->disconnect;
40             }
41              
42 0         0 my $is_different = &check_version(\@confs);
43 0 0       0 &warn_difference() if $is_different == 1;;
44              
45 0         0 my $diff_keys = &get_different_keys(\@confs);
46 0 0       0 if(scalar(@$diff_keys) == 0) {
47 0         0 print "There is no differenct settings.\n" ;
48 0         0 return;
49             }
50 0         0 &print_difference(\@confs, \@dbs, $diff_keys);
51             }
52              
53             sub check_version {
54 0     0 0 0 my $confs = shift @_;
55 0         0 my $version = @$confs[0]->version;
56 0         0 for(my $i=1; $i<scalar(@_); $i++) {
57 0 0       0 if($version ne @$confs[$i]->version) {
58 0         0 return 1;
59             }
60             }
61 0         0 return 0;
62             }
63              
64             sub warn_difference {
65 0     0 0 0 print "************************\n";
66 0         0 print " Different Version !! \n";
67 0         0 print "************************\n";
68             }
69              
70             sub get_different_keys {
71 0     0 0 0 my $confs = shift @_;
72 0         0 my $db_cnt = scalar(@$confs);
73 0         0 my $tmp, my $tmp_item;
74 0         0 my @keys, my @diff_keys;
75              
76 0         0 for(my $i=0; $i<$db_cnt; $i++) {
77 0         0 $tmp = @$confs[$i]->items;
78 0         0 push(@keys, keys(%$tmp));
79             }
80 0         0 @keys = uniq(@keys);
81 0         0 @keys = sort(@keys);
82              
83 0         0 for my $key (@keys) {
84 0         0 for(my $i=0; $i<$db_cnt; $i++) {
85 0 0       0 if(!defined @$confs[$i]->items->{$key}){
86 0         0 @$confs[$i]->items->{$key} = "";
87             }
88             }
89              
90 0         0 $tmp_item = @$confs[0]->items->{$key};
91 0         0 for(my $i=1; $i<$db_cnt; $i++) {
92 0 0       0 if($tmp_item ne @$confs[$i]->items->{$key}) {
93 0         0 push(@diff_keys, $key);
94 0         0 last;
95             }
96             }
97             }
98 0         0 return \@diff_keys;
99             }
100              
101             sub print_difference {
102 0     0 0 0 my ($confs, $dbs, $diff_keys) = @_;
103 0         0 my $db_cnt = scalar(@$confs);
104 0         0 my $key_cnt = scalar(@$diff_keys);
105 0         0 printf("<Setting Name> ");
106 0         0 for(my $j=0; $j<$db_cnt; $j++) {
107 0         0 printf("%-24s", @$dbs[$j]->host);
108             }
109 0         0 printf("\n--------------------");
110 0         0 for(my $j=0; $j<$db_cnt; $j++) {
111 0         0 printf("------------------------");
112             }
113 0         0 printf("\n");
114 0         0 for(my $i=0; $i<$key_cnt; $i++) {
115 0         0 my $key = @$diff_keys[$i];
116 0         0 printf("%-24s ", $key);
117 0         0 for(my $j=0; $j<$db_cnt; $j++) {
118 0         0 printf("%-23s ", @$confs[$j]->items->{$key});
119             }
120 0         0 printf("\n");
121             }
122             }
123              
124             sub get_db_config {
125 1     1 0 12099 my ($self, $db) = @_;
126            
127 1         11 my $sth = $db->dbh->prepare("SELECT name, setting FROM pg_settings");
128 1         197 $sth->execute();
129              
130 1         44 my $items = {};
131 1         5 while (my $hash_ref = $sth->fetchrow_hashref) {
132 4         145 my %row = %$hash_ref;
133 4         4 $items = {%{$items}, $row{name} => $row{setting}};
  4         19  
134             }
135 1         25 $sth->finish;
136              
137 1         16 return $items;
138             }
139              
140             sub get_db_version {
141 1     1 0 2741 my ($self, $db) = @_;
142            
143 1         5 my $sth = $db->dbh->prepare("SELECT version()");
144 1         119 $sth->execute();
145              
146 1         37 my $ref = $sth->fetchrow_arrayref;
147 1         33 my @v = split(/ /, @$ref[0], -1);
148 1         4 $sth->finish;
149              
150 1         13 return $v[1];
151             }
152              
153              
154             1;
155