45a3b096afaed072fc1500bf7f8874737b68f98d
[BackupPC.git] / lib / BackupPC / Config / Db / MySQL.pm
1 package BackupPC::Config::Db::MySQL;
2
3 use base 'BackupPC::Config::Db';
4 use warnings;
5 use strict;
6
7 use DBI;
8 use DBD::mysql;
9
10 our %Db;
11
12 %BackupPC::Config::Db::gConfigTypeField =
13     (BOOLEAN   => 'valueBit',
14      INT       => 'valueInt',
15      FLOAT     => 'valueFloat',
16      STRING    => 'valueString',
17      MEMO      => 'valueMemo',
18     );
19
20 sub ConnectData
21 {
22     my($self) = @_;
23     return if $self->{dbh};
24     
25     my($mesg, %db, $parm, @missing);
26     
27     %db = $self->GetDbConnInfo;
28     return $self->{errstr} if $self->{errstr};
29
30     foreach $parm (qw(host database user passwd)) {
31         push(@missing, $parm) if !exists $db{$parm}
32     }
33     
34     if (@missing) {
35         $mesg = "Missing Db connection parameters: "
36             . join(", ", @missing);
37         return $mesg;
38     }
39         
40     my $dsn = "DBI:mysql:database=$db{database};host=$db{host}";
41
42     $self->{dbh} = DBI->connect($dsn, $db{user}, $db{passwd}, {RaiseError => 1,
43                                 AutoCommit => 1,});
44     
45     return;
46 }
47
48
49 sub ConfigMTime
50 {
51     my($self) = @_;
52     my $cmd = "SHOW TABLE STATUS LIKE 'Config'";
53     my $sth = $self->{dbh}->prepare($cmd);
54  
55     $sth->execute;
56     my $row = $sth->fetchrow_hashref || return time();
57     my $mtime;
58  
59     if (defined($mtime = $row->{'Update_time'})) {
60        $mtime =~ m/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
61          || return time();
62        return &Date_SecsSince1970($2,$3,$1,$4,$5,$6);
63     } else {
64        return time();
65     }
66 }
67
68 sub HostsMTime
69 {
70     my($self) = @_;
71     my $cmd = "SHOW TABLE STATUS LIKE 'Client'";
72     my $sth = $self->{dbh}->prepare($cmd);
73  
74     $sth->execute;
75     my $row = $sth->fetchrow_hashref || return time();
76     my $mtime;
77  
78     if (defined($mtime = $row->{'Update_time'})) {
79        return &Date_SecsSince1970($mtime);
80     } else {
81        return time();
82     }
83 }
84
85 # Date subs borrowed from Date::Manip.
86 # Copyright (c) 1995-2001 Sullivan Beck.  All rights reserved.
87 # This program is free software; you can redistribute it and/or modify it
88 # under the same terms as Perl itself.
89
90 sub Date_SecsSince1970
91 {
92     my($mysqlDate) = @_;
93     $mysqlDate =~ m/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
94       || return time();
95     my($y,$m,$d,$h,$mn,$s) = ($1,$2,$3,$4,$5,$6);
96     my($sec_now,$sec_70,$Ny,$N4,$N100,$N400,$dayofyear,$days)=();
97     my($cc,$yy)=();
98   
99     $y=~ /(\d{2})(\d{2})/;
100     ($cc,$yy)=($1,$2);
101   
102     $Ny=$y;
103   
104     $N4=($Ny-1)/4 + 1;
105     $N4=0         if ($y==0);
106   
107     $N100=$cc + 1;
108     $N100--       if ($yy==0);
109     $N100=0       if ($y==0);
110   
111     $N400=($N100-1)/4 + 1;
112     $N400=0       if ($y==0);
113   
114     my(@days) = ( 0, 31, 59, 90,120,151,181,212,243,273,304,334,365);
115     my($ly)=0;
116     $ly=1  if ($m>2 && &Date_LeapYear($y));
117   
118     $dayofyear=$days[$m-1]+$d+$ly;
119     $days= $Ny*365 + $N4 - $N100 + $N400 + $dayofyear;
120     $sec_now=($days-1)*24*3600 + $h*3600 + $mn*60 + $s;
121     $sec_70 =62167219200;
122     return ($sec_now-$sec_70);
123 }
124
125 sub Date_LeapYear
126 {
127     my($y)=@_;
128     return 0 if $y % 4;
129     return 1 if $y % 100;
130     return 0 if $y % 400;
131     return 1;
132 }
133
134
135
136 1;