/[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 25 by dpavlin, Wed Jul 13 09:57:41 2005 UTC revision 62 by dpavlin, Sun Aug 21 15:59:55 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;
10  use Getopt::Std;  use Getopt::Std;
11    use Time::HiRes qw/time/;
12    use File::Pid;
13    use POSIX qw/strftime/;
14    
15  use constant BPC_FTYPE_DIR => 5;  use constant BPC_FTYPE_DIR => 5;
16    
17    my $debug = 0;
18  $|=1;  $|=1;
19    
20    my $start_t = time();
21    
22    my $pidfile = new File::Pid;
23    
24    if (my $pid = $pidfile->running ) {
25            die "$0 already running: $pid\n";
26    } elsif ($pidfile->pid ne $$) {
27            $pidfile->remove;
28            $pidfile = new File::Pid;
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';
34    
35  my $hosts;  my $hosts;
36  my $bpc = BackupPC::Lib->new || die;  my $bpc = BackupPC::Lib->new || die;
37  my %Conf = $bpc->Conf();  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:", \%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 38  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 50  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 62  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)                          PRIMARY KEY(hostID, num)
99                  );                              );            
100          });          });
101    
102            do_index('backups_hostid,num_unique');
103    
104          $dbh->do(qq{          $dbh->do(qq{
105                  create table dvds (                  create table dvds (
106                          ID      INTEGER         PRIMARY KEY,                          ID      SERIAL          PRIMARY KEY,
107                          num     INTEGER         NOT NULL,                          num     INTEGER         NOT NULL,
108                          name    VARCHAR(255)    NOT NULL,                          name    VARCHAR(255)    NOT NULL,
109                          mjesto  VARCHAR(255)                          mjesto  VARCHAR(255)
# Line 79  if ($opt{c}) { Line 112  if ($opt{c}) {
112    
113          $dbh->do(qq{              $dbh->do(qq{    
114                  create table files (                  create table files (
115                          ID      INTEGER         NOT NULL PRIMARY KEY,                            ID      SERIAL          PRIMARY KEY,  
116                          shareID INTEGER         NOT NULL references shares(id),                          shareID INTEGER         NOT NULL references shares(id),
117                          backupNum  INTEGER      NOT NULL references backups(num),                          backupNum  INTEGER      NOT NULL,
118                          name       VARCHAR(255) NOT NULL,                          name       VARCHAR(255) NOT NULL,
119                          path       VARCHAR(255) NOT NULL,                          path       VARCHAR(255) NOT NULL,
120                          fullpath   VARCHAR(255) NOT NULL,                          date       integer      NOT NULL,
                         date       TIMESTAMP    NOT NULL,  
121                          type       INTEGER      NOT NULL,                          type       INTEGER      NOT NULL,
122                          size       INTEGER      NOT NULL,                          size       INTEGER      NOT NULL,
123                          dvdid      INTEGER      references dvds(id)                              dvdid      INTEGER      references dvds(id)    
124                  );                  );
125          });          });
126    
127          print "creating indexes...\n";          print "creating indexes:";
128    
129          foreach my $index (qw(          foreach my $index (qw(
130                  hosts_name                  hosts_name
# Line 106  if ($opt{c}) { Line 138  if ($opt{c}) {
138                  files_date                  files_date
139                  files_size                  files_size
140          )) {          )) {
141                  my ($table,$col) = split(/_/, $index);                  print " $index";
142                  $dbh->do(qq{ create index $index on $table($col) });                  do_index($index);
143          }          }
144            print "...\n";
145    
146            $dbh->commit;
147    
148  }  }
149    
150  if ($opt{d}) {  if ($opt{d}) {
151          print "deleting ";          print "deleting ";
152          foreach my $table (qw(hosts shares files dvds backups)) {          foreach my $table (qw(files dvds backups shares hosts)) {
153                  print "$table ";                  print "$table ";
154                  $dbh->do(qq{ DELETE FROM $table });                  $dbh->do(qq{ DELETE FROM $table });
155          }          }
156          print " done...\n";          print " done...\n";
157    
158            $dbh->commit;
159    }
160    
161    if ($opt{v}) {
162            print "Debug level at $opt{v}\n";
163            $debug = $opt{v};
164  }  }
165    
166  #################################INSERT VALUES#############################  #################################INSERT VALUES#############################
# Line 152  VALUES (?,?,?,?) Line 193  VALUES (?,?,?,?)
193    
194  $sth->{insert_files} = $dbh->prepare(qq{  $sth->{insert_files} = $dbh->prepare(qq{
195  INSERT INTO files  INSERT INTO files
196          (shareID, backupNum, name, path, fullpath, date, type, size)          (shareID, backupNum, name, path, date, type, size)
197          VALUES (?,?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
198  });  });
199    
200    sub fmt_time {
201            my $t = shift || return;
202            my $out = "";
203            my ($ss,$mm,$hh) = gmtime($t);
204            $out .= "${hh}h" if ($hh);
205            $out .= sprintf("%02d:%02d", $mm,$ss);
206            return $out;
207    }
208    
209  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
210    
211          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 168  foreach my $host_key (keys %{$hosts}) { Line 218  foreach my $host_key (keys %{$hosts}) {
218                          $hosts->{$host_key}->{'ip'}                          $hosts->{$host_key}->{'ip'}
219                  );                  );
220    
221                  $hostID = $dbh->func('last_insert_rowid');                  $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);
222          }          }
223    
224          print("host ".$hosts->{$host_key}->{'host'}.": ");          print("host ".$hosts->{$host_key}->{'host'}.": ");
# Line 180  foreach my $host_key (keys %{$hosts}) { Line 230  foreach my $host_key (keys %{$hosts}) {
230          my $inc_nr = 0;          my $inc_nr = 0;
231    
232          foreach my $backup (@backups) {          foreach my $backup (@backups) {
233    
234                  $inc_nr++;                  $inc_nr++;
235                  last if ($opt{m} && $inc_nr > $opt{m});                  last if ($opt{m} && $inc_nr > $opt{m});
236    
237                  my $backupNum = $backup->{'num'};                  my $backupNum = $backup->{'num'};
238                  my @backupShares = ();                  my @backupShares = ();
239    
240                  print $hosts->{$host_key}->{'host'},"\t#$backupNum\n";                  print $hosts->{$host_key}->{'host'},
241                            "\t#$backupNum\t", $backup->{type} || '?', " ",
242                            $backup->{nFilesNew} || '?', "/", $backup->{nFiles} || '?',
243                            " files (date: ",
244                            strftime($t_fmt,localtime($backup->{startTime})),
245                            " dur: ",
246                            fmt_time($backup->{endTime} - $backup->{startTime}),
247                            ")\n";
248    
249                  $sth->{backups_broj}->execute($hostID, $backupNum);                  $sth->{backups_broj}->execute($hostID, $backupNum);
250                  my ($broj) = $sth->{backups_broj}->fetchrow_array();                  my ($broj) = $sth->{backups_broj}->fetchrow_array();
# Line 200  foreach my $host_key (keys %{$hosts}) { Line 258  foreach my $host_key (keys %{$hosts}) {
258                  );                  );
259                  $dbh->commit();                  $dbh->commit();
260    
261                  my $files = BackupPC::View->new($bpc, $hostname, \@backups);                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);
262                  foreach my $share ($files->shareList($backupNum)) {                  foreach my $share ($files->shareList($backupNum)) {
263    
264                          print "\t$share";                          my $t = time();
265    
266                            print strftime($t_fmt,localtime())," ", $share;
267                          $shareID = getShareID($share, $hostID, $hostname);                          $shareID = getShareID($share, $hostID, $hostname);
268                                    
269                          my ($f, $nf, $d, $nd) = recurseDir($bpc, $hostname, \@backups, $backupNum, $share, "", $shareID);                          my ($f, $nf, $d, $nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);
270                          print " $nf/$f files $nd/$d dirs\n";                          my $dur = (time() - $t) || 1;
271                            printf(" %d/%d files %d/%d dirs [%.2f/s dur: %s]\n",
272                                    $nf, $f, $nd, $d,
273                                    ( ($f+$d) / $dur ),
274                                    fmt_time($dur)
275                            );
276                          $dbh->commit();                          $dbh->commit();
277                  }                  }
278    
279          }          }
280  }  }
281  undef $sth;  undef $sth;
282  $dbh->commit();  $dbh->commit();
283  $dbh->disconnect();  $dbh->disconnect();
284    
285    print "total duration: ",fmt_time(time() - $start_t),"\n";
286    
287    $pidfile->remove;
288    
289  sub getShareID() {  sub getShareID() {
290    
291          my ($share, $hostID, $hostname) = @_;          my ($share, $hostID, $hostname) = @_;
# Line 240  sub getShareID() { Line 310  sub getShareID() {
310          $drop_down =~ s#//+#/#g;          $drop_down =~ s#//+#/#g;
311    
312          $sth->{insert_share}->execute($hostID,$share, $drop_down ,undef);          $sth->{insert_share}->execute($hostID,$share, $drop_down ,undef);
313          return $dbh->func('last_insert_rowid');                  return $dbh->last_insert_id(undef,undef,'shares',undef);
314  }  }
315    
316  sub found_in_db {  sub found_in_db {
317    
318          my ($shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my @data = @_;
319            shift @data;
320    
321            my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;
322    
323            return $beenThere->{$key} if (defined($beenThere->{$key}));
324    
325          $sth->{file_in_db} ||= $dbh->prepare(qq{          $sth->{file_in_db} ||= $dbh->prepare(qq{
326                  SELECT count(*) FROM files                  SELECT 1 FROM files
327                  WHERE shareID = ? and                  WHERE shareID = ? and
328                          path = ? and                          path = ? and
329                          name = ? and                          name = ? and
# Line 258  sub found_in_db { Line 333  sub found_in_db {
333    
334          my @param = ($shareID,$path,$name,$date,$size);          my @param = ($shareID,$path,$name,$date,$size);
335          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
336          my ($rows) = $sth->{file_in_db}->fetchrow_array();          my $rows = $sth->{file_in_db}->rows;
337  #       print STDERR ( $rows ? '+' : '-' ), join(" ",@param), "\n";          print STDERR "## found_in_db ",( $rows ? '+' : '-' ), join(" ",@param), "\n" if ($debug >= 3);
338    
339            $beenThere->{$key}++;
340    
341            $sth->{'insert_files'}->execute(@data) unless ($rows);
342          return $rows;          return $rows;
343  }  }
344    
# Line 269  sub found_in_db { Line 348  sub found_in_db {
348  ####################################################  ####################################################
349  sub recurseDir($$$$$$$$) {  sub recurseDir($$$$$$$$) {
350    
351          my ($bpc, $hostname, $backups, $backupNum, $share, $dir, $shareID) = @_;          my ($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID) = @_;
352    
353          my ($nr_files, $new_files, $nr_dirs, $new_dirs) = (0,0,0,0);          print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);
354    
355          my $files = BackupPC::View->new($bpc, $hostname, $backups);                      my ($nr_files, $new_files, $nr_dirs, $new_dirs) = (0,0,0,0);
         my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir);  
356    
357          # first, add all the entries in current directory          { # scope
358          foreach my $path_key (keys %{$filesInBackup}) {                  my @stack;
                 my @data = (  
                         $shareID,  
                         $backupNum,  
                         $path_key,  
                         $filesInBackup->{$path_key}->{'relPath'},  
                         $filesInBackup->{$path_key}->{'fullPath'},  
 #                       $filesInBackup->{$path_key}->{'sharePathM'},  
                         $filesInBackup->{$path_key}->{'mtime'},  
                         $filesInBackup->{$path_key}->{'type'},  
                         $filesInBackup->{$path_key}->{'size'}  
                 );  
359    
360                  my $key = join(" ", (                  print STDERR "# dirAttrib($backupNum, $share, $dir)\n" if ($debug >= 2);
361                          $shareID,                  my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir);
                         $dir,  
                         $path_key,  
                         $filesInBackup->{$path_key}->{'mtime'},  
                         $filesInBackup->{$path_key}->{'size'}  
                 ));  
362    
363                    # first, add all the entries in current directory
364                    foreach my $path_key (keys %{$filesInBackup}) {
365                            my @data = (
366                                    $shareID,
367                                    $backupNum,
368                                    $path_key,
369                                    $filesInBackup->{$path_key}->{'relPath'},
370                                    $filesInBackup->{$path_key}->{'mtime'},
371                                    $filesInBackup->{$path_key}->{'type'},
372                                    $filesInBackup->{$path_key}->{'size'}
373                            );
374    
375                            my $key = join(" ", (
376                                    $shareID,
377                                    $dir,
378                                    $path_key,
379                                    $filesInBackup->{$path_key}->{'mtime'},
380                                    $filesInBackup->{$path_key}->{'size'}
381                            ));
382    
383    
384                            if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {
385                                    print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
386    
387                                    if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
388                                            $new_dirs++;
389                                            print STDERR " dir\n" if ($debug >= 2);
390                                    } else {
391                                            $new_files++;
392                                            print STDERR " file\n" if ($debug >= 2);
393                                    }
394                            }
395    
                 if (! $beenThere->{$key} && ! found_in_db(@data)) {  
                         $sth->{'insert_files'}->execute(@data);  
 #                       print STDERR "$key\n";  
396                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
397                                  $new_dirs++;                                  $nr_dirs++;
398    
399                                    my $full_path = $dir . '/' . $path_key;
400                                    push @stack, $full_path;
401                                    print STDERR "### store to stack: $full_path\n" if ($debug >= 3);
402    
403    #                               my ($f,$nf,$d,$nd) = recurseDir($bpc, $hostname, $backups, $backupNum, $share, $path_key, $shareID) unless ($beenThere->{$key});
404    #
405    #                               $nr_files += $f;
406    #                               $new_files += $nf;
407    #                               $nr_dirs += $d;
408    #                               $new_dirs += $nd;
409    
410                          } else {                          } else {
411                                  $new_files++;                                  $nr_files++;
412                          }                          }
413                  }                  }
                 $beenThere->{$key}++;  
414    
415                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                  print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);
                         $nr_dirs++;  
   
                         my ($f,$nf,$d,$nd) = recurseDir($bpc, $hostname, $backups, $backupNum, $share, $path_key, $shareID);  
416    
417                    while ( my $dir = shift @stack ) {
418                            my ($f,$nf,$d,$nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID);
419                            print STDERR "# $dir f: $f nf: $nf d: $d nd: $nd\n" if ($debug >= 1);
420                          $nr_files += $f;                          $nr_files += $f;
421                          $new_files += $nf;                          $new_files += $nf;
422                          $nr_dirs += $d;                          $nr_dirs += $d;
423                          $new_dirs += $nd;                          $new_dirs += $nd;
   
                 } else {  
                         $nr_files++;  
424                  }                  }
425          }          }
426    

Legend:
Removed from v.25  
changed lines
  Added in v.62

  ViewVC Help
Powered by ViewVC 1.1.26