/[BackupPC]/trunk/bin/BackupPC_updatedb
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/bin/BackupPC_updatedb

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 38 by dpavlin, Fri Aug 19 15:27:27 2005 UTC revision 65 by dpavlin, Sun Aug 21 23:25:47 2005 UTC
# Line 1  Line 1 
1  #!/usr/local/bin/perl -w  #!/usr/local/bin/perl -w
2    
3  use strict;  use strict;
 use DBI;  
4  use lib "__INSTALLDIR__/lib";  use lib "__INSTALLDIR__/lib";
5    
6    use DBI;
7  use BackupPC::Lib;  use BackupPC::Lib;
8  use BackupPC::View;  use BackupPC::View;
9  use Data::Dumper;  use Data::Dumper;
# Line 10  use Getopt::Std; Line 11  use Getopt::Std;
11  use Time::HiRes qw/time/;  use Time::HiRes qw/time/;
12  use File::Pid;  use File::Pid;
13  use POSIX qw/strftime/;  use POSIX qw/strftime/;
14    
15  use constant BPC_FTYPE_DIR => 5;  use constant BPC_FTYPE_DIR => 5;
16    
17  my $debug = 0;  my $debug = 0;
18  $|=1;  $|=1;
19    
20    my $start_t = time();
21    
22  my $pidfile = new File::Pid;  my $pidfile = new File::Pid;
23    
24  if (my $pid = $pidfile->running ) {  if (my $pid = $pidfile->running ) {
# Line 22  if (my $pid = $pidfile->running ) { Line 26  if (my $pid = $pidfile->running ) {
26  } elsif ($pidfile->pid ne $$) {  } elsif ($pidfile->pid ne $$) {
27          $pidfile->remove;          $pidfile->remove;
28          $pidfile = new File::Pid;          $pidfile = new File::Pid;
         $pidfile->write;  
         print STDERR "$0 using pid ",$pidfile->pid," file ",$pidfile->file,"\n";  
29  }  }
30    $pidfile->write;
31    print STDERR "$0 using pid ",$pidfile->pid," file ",$pidfile->file,"\n";
32    
33  my $t_fmt = '%Y-%m-%d %H:%M:%S';  my $t_fmt = '%Y-%m-%d %H:%M:%S';
34    
# Line 34  my %Conf = $bpc->Conf(); Line 38  my %Conf = $bpc->Conf();
38  my $TopDir = $bpc->TopDir();  my $TopDir = $bpc->TopDir();
39  my $beenThere = {};  my $beenThere = {};
40    
41  my $dsn = "dbi:SQLite:dbname=$TopDir/$Conf{SearchDB}";  my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";
42    my $user = $Conf{SearchUser} || '';
43    
44  my $dbh = DBI->connect($dsn, "", "", { RaiseError => 1, AutoCommit => 0 });  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
45    
46  my %opt;  my %opt;
47    
48  if ( !getopts("cdm:v", \%opt ) ) {  if ( !getopts("cdm:v:", \%opt ) ) {
49          print STDERR <<EOF;          print STDERR <<EOF;
50  usage: $0 [-c|-d] [-m num]  usage: $0 [-c|-d] [-m num] [-v|-v level]
51    
52  Options:  Options:
53          -c      create database on first use          -c      create database on first use
54          -d      delete database before import          -d      delete database before import
55          -m num  import just num increments for one host          -m num  import just num increments for one host
56            -v num  set verbosity (debug) level (default $debug)
57  EOF  EOF
58          exit 1;          exit 1;
59  }  }
# Line 55  EOF Line 61  EOF
61  ###################################create tables############################3  ###################################create tables############################3
62    
63  if ($opt{c}) {  if ($opt{c}) {
64            sub do_index {
65                    my $index = shift || return;
66                    my ($table,$col,$unique) = split(/_/, $index);
67                    $unique ||= '';
68                    $index =~ s/,/_/g;
69                    $dbh->do(qq{ create $unique index $index on $table($col) });
70            }
71    
72          print "creating tables...\n";          print "creating tables...\n";
73                
74          $dbh->do(qq{          $dbh->do(qq{
75                  create table hosts (                  create table hosts (
76                          ID      INTEGER         PRIMARY KEY,                          ID      SERIAL          PRIMARY KEY,
77                          name    VARCHAR(30)     NOT NULL,                          name    VARCHAR(30)     NOT NULL,
78                          IP      VARCHAR(15)                          IP      VARCHAR(15)
79                  );                              );            
# Line 67  if ($opt{c}) { Line 81  if ($opt{c}) {
81                                
82          $dbh->do(qq{          $dbh->do(qq{
83                  create table shares (                  create table shares (
84                          ID      INTEGER         PRIMARY KEY,                          ID      SERIAL          PRIMARY KEY,
85                          hostID  INTEGER         NOT NULL references hosts(id),                          hostID  INTEGER         NOT NULL references hosts(id),
86                          name    VARCHAR(30)     NOT NULL,                          name    VARCHAR(30)     NOT NULL,
87                          share   VARCHAR(200)    NOT NULL,                          share   VARCHAR(200)    NOT NULL,
# Line 79  if ($opt{c}) { Line 93  if ($opt{c}) {
93                  create table backups (                  create table backups (
94                          hostID  INTEGER         NOT NULL references hosts(id),                          hostID  INTEGER         NOT NULL references hosts(id),
95                          num     INTEGER         NOT NULL,                          num     INTEGER         NOT NULL,
96                          date    DATE,                          date    integer         NOT NULL,
97                          type    CHAR(1),                          type    CHAR(4)         not null,
98                          PRIMARY KEY(hostID, num)                          shareID integer         not null references shares(id),
99                            PRIMARY KEY(hostID, num, shareID)
100                  );                              );            
101          });          });
102    
103            #do_index('backups_hostid,num_unique');
104    
105          $dbh->do(qq{          $dbh->do(qq{
106                  create table dvds (                  create table dvds (
107                          ID      INTEGER         PRIMARY KEY,                          ID      SERIAL          PRIMARY KEY,
108                          num     INTEGER         NOT NULL,                          num     INTEGER         NOT NULL,
109                          name    VARCHAR(255)    NOT NULL,                          name    VARCHAR(255)    NOT NULL,
110                          mjesto  VARCHAR(255)                          mjesto  VARCHAR(255)
# Line 96  if ($opt{c}) { Line 113  if ($opt{c}) {
113    
114          $dbh->do(qq{              $dbh->do(qq{    
115                  create table files (                  create table files (
116                          ID      INTEGER         NOT NULL PRIMARY KEY,                            ID      SERIAL          PRIMARY KEY,  
117                          shareID INTEGER         NOT NULL references shares(id),                          shareID INTEGER         NOT NULL references shares(id),
118                          backupNum  INTEGER      NOT NULL references backups(num),                          backupNum  INTEGER      NOT NULL,
119                          name       VARCHAR(255) NOT NULL,                          name       VARCHAR(255) NOT NULL,
120                          path       VARCHAR(255) NOT NULL,                          path       VARCHAR(255) NOT NULL,
121                          fullpath   VARCHAR(255) NOT NULL,                          date       integer      NOT NULL,
                         date       TIMESTAMP    NOT NULL,  
122                          type       INTEGER      NOT NULL,                          type       INTEGER      NOT NULL,
123                          size       INTEGER      NOT NULL,                          size       INTEGER      NOT NULL,
124                          dvdid      INTEGER      references dvds(id)                              dvdid      INTEGER      references dvds(id)    
125                  );                  );
126          });          });
127    
128          print "creating indexes...\n";          print "creating indexes:";
129    
130          foreach my $index (qw(          foreach my $index (qw(
131                  hosts_name                  hosts_name
# Line 123  if ($opt{c}) { Line 139  if ($opt{c}) {
139                  files_date                  files_date
140                  files_size                  files_size
141          )) {          )) {
142                  my ($table,$col) = split(/_/, $index);                  print " $index";
143                  $dbh->do(qq{ create index $index on $table($col) });                  do_index($index);
144          }          }
145            print "...\n";
146    
147            $dbh->commit;
148    
149  }  }
150    
151  if ($opt{d}) {  if ($opt{d}) {
152          print "deleting ";          print "deleting ";
153          foreach my $table (qw(hosts shares files dvds backups)) {          foreach my $table (qw(files dvds backups shares hosts)) {
154                  print "$table ";                  print "$table ";
155                  $dbh->do(qq{ DELETE FROM $table });                  $dbh->do(qq{ DELETE FROM $table });
156          }          }
157          print " done...\n";          print " done...\n";
158    
159            $dbh->commit;
160  }  }
161    
162  if ($opt{v}) {  if ($opt{v}) {
# Line 161  $sth->{hosts_by_name} = $dbh->prepare(qq Line 181  $sth->{hosts_by_name} = $dbh->prepare(qq
181  SELECT ID FROM hosts WHERE name=?  SELECT ID FROM hosts WHERE name=?
182  });  });
183    
184  $sth->{backups_broj} = $dbh->prepare(qq{  $sth->{backups_count} = $dbh->prepare(qq{
185  SELECT COUNT(*)  SELECT COUNT(*)
186  FROM backups  FROM backups
187  WHERE hostID=? AND num=?  WHERE hostID=? AND num=? AND shareid=?
188  });  });
189    
190  $sth->{insert_backups} = $dbh->prepare(qq{  $sth->{insert_backups} = $dbh->prepare(qq{
191  INSERT INTO backups (hostID, num, date, type)  INSERT INTO backups (hostID, num, date, type, shareid)
192  VALUES (?,?,?,?)  VALUES (?,?,?,?,?)
193  });  });
194    
195  $sth->{insert_files} = $dbh->prepare(qq{  $sth->{insert_files} = $dbh->prepare(qq{
196  INSERT INTO files  INSERT INTO files
197          (shareID, backupNum, name, path, fullpath, date, type, size)          (shareID, backupNum, name, path, date, type, size)
198          VALUES (?,?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
199  });  });
200    
201    sub fmt_time {
202            my $t = shift || return;
203            my $out = "";
204            my ($ss,$mm,$hh) = gmtime($t);
205            $out .= "${hh}h" if ($hh);
206            $out .= sprintf("%02d:%02d", $mm,$ss);
207            return $out;
208    }
209    
210  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
211    
212          my $hostname = $hosts->{$host_key}->{'host'} || die "can't find host for $host_key";          my $hostname = $hosts->{$host_key}->{'host'} || die "can't find host for $host_key";
# Line 190  foreach my $host_key (keys %{$hosts}) { Line 219  foreach my $host_key (keys %{$hosts}) {
219                          $hosts->{$host_key}->{'ip'}                          $hosts->{$host_key}->{'ip'}
220                  );                  );
221    
222                  $hostID = $dbh->func('last_insert_rowid');                  $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);
223          }          }
224    
225          print("host ".$hosts->{$host_key}->{'host'}.": ");          print("host ".$hosts->{$host_key}->{'host'}.": ");
# Line 202  foreach my $host_key (keys %{$hosts}) { Line 231  foreach my $host_key (keys %{$hosts}) {
231          my $inc_nr = 0;          my $inc_nr = 0;
232    
233          foreach my $backup (@backups) {          foreach my $backup (@backups) {
234    
235                  $inc_nr++;                  $inc_nr++;
236                  last if ($opt{m} && $inc_nr > $opt{m});                  last if ($opt{m} && $inc_nr > $opt{m});
237    
238                  my $backupNum = $backup->{'num'};                  my $backupNum = $backup->{'num'};
239                  my @backupShares = ();                  my @backupShares = ();
240    
241                  print $hosts->{$host_key}->{'host'}, "\t#$backupNum\n";                  print $hosts->{$host_key}->{'host'},
242                            "\t#$backupNum\t", $backup->{type} || '?', " ",
243                  $sth->{backups_broj}->execute($hostID, $backupNum);                          $backup->{nFilesNew} || '?', "/", $backup->{nFiles} || '?',
244                  my ($broj) = $sth->{backups_broj}->fetchrow_array();                          " files (date: ",
245                  next if ($broj > 0);                          strftime($t_fmt,localtime($backup->{startTime})),
246                            " dur: ",
247                            fmt_time($backup->{endTime} - $backup->{startTime}),
248                            ")\n";
249    
250                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);
251                  foreach my $share ($files->shareList($backupNum)) {                  foreach my $share ($files->shareList($backupNum)) {
252    
253                          my $t = time();                          my $t = time();
254    
                         print strftime($t_fmt,localtime())," ", $share;  
255                          $shareID = getShareID($share, $hostID, $hostname);                          $shareID = getShareID($share, $hostID, $hostname);
256                                    
257                            $sth->{backups_count}->execute($hostID, $backupNum, $shareID);
258                            my ($count) = $sth->{backups_count}->fetchrow_array();
259                            # skip if allready in database!
260                            next if ($count > 0);
261    
262                            # dump some log
263                            print strftime($t_fmt,localtime())," ", $share;
264    
265                          my ($f, $nf, $d, $nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);                          my ($f, $nf, $d, $nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);
266                          printf(" %d/%d files %d/%d dirs [%.2f/s]\n",  
267                                  $nf, $f, $nd, $d,                          $sth->{insert_backups}->execute(
268                                  ( ($f+$d) / ((time() - $t) || 1) )                                  $hostID,
269                                    $backupNum,
270                                    $backup->{'endTime'},
271                                    $backup->{'type'},
272                                    $shareID
273                          );                          );
274    
275                            print " commit";
276                          $dbh->commit();                          $dbh->commit();
                 }  
277    
278                  $sth->{insert_backups}->execute(                          my $dur = (time() - $t) || 1;
279                          $hostID,                          printf(" %d/%d files %d/%d dirs [%.2f/s dur: %s]\n",
280                          $backupNum,                                  $nf, $f, $nd, $d,
281                          $backup->{'endTime'},                                  ( ($f+$d) / $dur ),
282                          $backup->{'type'}                                  fmt_time($dur)
283                  );                          );
284                  $dbh->commit();                  }
285    
286          }          }
287  }  }
# Line 244  undef $sth; Line 289  undef $sth;
289  $dbh->commit();  $dbh->commit();
290  $dbh->disconnect();  $dbh->disconnect();
291    
292    print "total duration: ",fmt_time(time() - $start_t),"\n";
293    
294  $pidfile->remove;  $pidfile->remove;
295    
296  sub getShareID() {  sub getShareID() {
# Line 270  sub getShareID() { Line 317  sub getShareID() {
317          $drop_down =~ s#//+#/#g;          $drop_down =~ s#//+#/#g;
318    
319          $sth->{insert_share}->execute($hostID,$share, $drop_down ,undef);          $sth->{insert_share}->execute($hostID,$share, $drop_down ,undef);
320          return $dbh->func('last_insert_rowid');                  return $dbh->last_insert_id(undef,undef,'shares',undef);
321  }  }
322    
323  sub found_in_db {  sub found_in_db {
324    
325          my ($shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my @data = @_;
326            shift @data;
327    
328            my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;
329    
330            return $beenThere->{$key} if (defined($beenThere->{$key}));
331    
332          $sth->{file_in_db} ||= $dbh->prepare(qq{          $sth->{file_in_db} ||= $dbh->prepare(qq{
333                  SELECT count(*) FROM files                  SELECT 1 FROM files
334                  WHERE shareID = ? and                  WHERE shareID = ? and
335                          path = ? and                          path = ? and
336                          name = ? and                          name = ? and
# Line 288  sub found_in_db { Line 340  sub found_in_db {
340    
341          my @param = ($shareID,$path,$name,$date,$size);          my @param = ($shareID,$path,$name,$date,$size);
342          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
343          my ($rows) = $sth->{file_in_db}->fetchrow_array();          my $rows = $sth->{file_in_db}->rows;
344  #       print STDERR ( $rows ? '+' : '-' ), join(" ",@param), "\n";          print STDERR "## found_in_db ",( $rows ? '+' : '-' ), join(" ",@param), "\n" if ($debug >= 3);
345    
346            $beenThere->{$key}++;
347    
348            $sth->{'insert_files'}->execute(@data) unless ($rows);
349          return $rows;          return $rows;
350  }  }
351    
# Line 301  sub recurseDir($$$$$$$$) { Line 357  sub recurseDir($$$$$$$$) {
357    
358          my ($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID) = @_;          my ($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID) = @_;
359    
360          print STDERR "recurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);          print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);
361    
362          my ($nr_files, $new_files, $nr_dirs, $new_dirs) = (0,0,0,0);          my ($nr_files, $new_files, $nr_dirs, $new_dirs) = (0,0,0,0);
363    
364          { # scope          { # scope
365                  my @stack;                  my @stack;
366    
367                    print STDERR "# dirAttrib($backupNum, $share, $dir)\n" if ($debug >= 2);
368                  my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir);                  my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir);
369    
370                  # first, add all the entries in current directory                  # first, add all the entries in current directory
# Line 317  sub recurseDir($$$$$$$$) { Line 374  sub recurseDir($$$$$$$$) {
374                                  $backupNum,                                  $backupNum,
375                                  $path_key,                                  $path_key,
376                                  $filesInBackup->{$path_key}->{'relPath'},                                  $filesInBackup->{$path_key}->{'relPath'},
                                 $filesInBackup->{$path_key}->{'fullPath'},  
         #                       $filesInBackup->{$path_key}->{'sharePathM'},  
377                                  $filesInBackup->{$path_key}->{'mtime'},                                  $filesInBackup->{$path_key}->{'mtime'},
378                                  $filesInBackup->{$path_key}->{'type'},                                  $filesInBackup->{$path_key}->{'type'},
379                                  $filesInBackup->{$path_key}->{'size'}                                  $filesInBackup->{$path_key}->{'size'}
# Line 333  sub recurseDir($$$$$$$$) { Line 388  sub recurseDir($$$$$$$$) {
388                          ));                          ));
389    
390    
391                          if (! $beenThere->{$key} && ! found_in_db(@data)) {                          if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {
392                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
393                                  $sth->{'insert_files'}->execute(@data);  
394                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
395                                          $new_dirs++;                                          $new_dirs++;
396                                          print STDERR " dir\n" if ($debug >= 2);                                          print STDERR " dir\n" if ($debug >= 2);
# Line 344  sub recurseDir($$$$$$$$) { Line 399  sub recurseDir($$$$$$$$) {
399                                          print STDERR " file\n" if ($debug >= 2);                                          print STDERR " file\n" if ($debug >= 2);
400                                  }                                  }
401                          }                          }
                         $beenThere->{$key}++;  
402    
403                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
404                                  $nr_dirs++;                                  $nr_dirs++;

Legend:
Removed from v.38  
changed lines
  Added in v.65

  ViewVC Help
Powered by ViewVC 1.1.26