/[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 34 by dpavlin, Sun Jul 31 20:53:40 2005 UTC revision 51 by dpavlin, Sat Aug 20 16:40:11 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;  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: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 39  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                    $dbh->do(qq{ create $unique index $index on $table($col) });
69            }
70    
71          print "creating tables...\n";          print "creating tables...\n";
72                
73          $dbh->do(qq{          $dbh->do(qq{
74                  create table hosts (                  create table hosts (
75                          ID      INTEGER         PRIMARY KEY,                          ID      SERIAL          PRIMARY KEY,
76                          name    VARCHAR(30)     NOT NULL,                          name    VARCHAR(30)     NOT NULL,
77                          IP      VARCHAR(15)                          IP      VARCHAR(15)
78                  );                              );            
# Line 51  if ($opt{c}) { Line 80  if ($opt{c}) {
80                                
81          $dbh->do(qq{          $dbh->do(qq{
82                  create table shares (                  create table shares (
83                          ID      INTEGER         PRIMARY KEY,                          ID      SERIAL          PRIMARY KEY,
84                          hostID  INTEGER         NOT NULL references hosts(id),                          hostID  INTEGER         NOT NULL references hosts(id),
85                          name    VARCHAR(30)     NOT NULL,                          name    VARCHAR(30)     NOT NULL,
86                          share   VARCHAR(200)    NOT NULL,                          share   VARCHAR(200)    NOT NULL,
# Line 63  if ($opt{c}) { Line 92  if ($opt{c}) {
92                  create table backups (                  create table backups (
93                          hostID  INTEGER         NOT NULL references hosts(id),                          hostID  INTEGER         NOT NULL references hosts(id),
94                          num     INTEGER         NOT NULL,                          num     INTEGER         NOT NULL,
95                          date    DATE,                          date    integer         NOT NULL,
96                          type    CHAR(1),                          type    CHAR(4)         not null,
97                          PRIMARY KEY(hostID, num)                          PRIMARY KEY(hostID, num)
98                  );                              );            
99          });          });
100    
101            do_index('backups_num_unique');
102    
103          $dbh->do(qq{          $dbh->do(qq{
104                  create table dvds (                  create table dvds (
105                          ID      INTEGER         PRIMARY KEY,                          ID      SERIAL          PRIMARY KEY,
106                          num     INTEGER         NOT NULL,                          num     INTEGER         NOT NULL,
107                          name    VARCHAR(255)    NOT NULL,                          name    VARCHAR(255)    NOT NULL,
108                          mjesto  VARCHAR(255)                          mjesto  VARCHAR(255)
# Line 80  if ($opt{c}) { Line 111  if ($opt{c}) {
111    
112          $dbh->do(qq{              $dbh->do(qq{    
113                  create table files (                  create table files (
114                          ID      INTEGER         NOT NULL PRIMARY KEY,                            ID      SERIAL          PRIMARY KEY,  
115                          shareID INTEGER         NOT NULL references shares(id),                          shareID INTEGER         NOT NULL references shares(id),
116                          backupNum  INTEGER      NOT NULL references backups(num),                          backupNum  INTEGER      NOT NULL references backups(num),
117                          name       VARCHAR(255) NOT NULL,                          name       VARCHAR(255) NOT NULL,
118                          path       VARCHAR(255) NOT NULL,                          path       VARCHAR(255) NOT NULL,
119                          fullpath   VARCHAR(255) NOT NULL,                          fullpath   VARCHAR(255) NOT NULL,
120                          date       TIMESTAMP    NOT NULL,                          date       integer      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 107  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}) {  if ($opt{v}) {
# Line 162  INSERT INTO files Line 197  INSERT INTO files
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 174  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 186  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\n";
244    
245                  $sth->{backups_broj}->execute($hostID, $backupNum);                  $sth->{backups_broj}->execute($hostID, $backupNum);
246                  my ($broj) = $sth->{backups_broj}->fetchrow_array();                  my ($broj) = $sth->{backups_broj}->fetchrow_array();
247                  next if ($broj > 0);                  next if ($broj > 0);
248    
                 my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);  
                 foreach my $share ($files->shareList($backupNum)) {  
   
                         print "\t$share";  
                         $shareID = getShareID($share, $hostID, $hostname);  
                   
                         my ($f, $nf, $d, $nd) = recurseDir($bpc, $hostname, \@backups, $backupNum, $share, "", $shareID);  
                         print " $nf/$f files $nd/$d dirs\n";  
                         $dbh->commit();  
                 }  
   
249                  $sth->{insert_backups}->execute(                  $sth->{insert_backups}->execute(
250                          $hostID,                          $hostID,
251                          $backupNum,                          $backupNum,
# Line 217  foreach my $host_key (keys %{$hosts}) { Line 254  foreach my $host_key (keys %{$hosts}) {
254                  );                  );
255                  $dbh->commit();                  $dbh->commit();
256    
257                    my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);
258                    foreach my $share ($files->shareList($backupNum)) {
259    
260                            my $t = time();
261    
262                            print strftime($t_fmt,localtime())," ", $share;
263                            $shareID = getShareID($share, $hostID, $hostname);
264                    
265                            my ($f, $nf, $d, $nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);
266                            my $dur = (time() - $t) || 1;
267                            printf(" %d/%d files %d/%d dirs [%.2f/s dur: %s]\n",
268                                    $nf, $f, $nd, $d,
269                                    ( ($f+$d) / $dur ),
270                                    fmt_time($dur)
271                            );
272                            $dbh->commit();
273                    }
274    
275          }          }
276  }  }
277  undef $sth;  undef $sth;
278  $dbh->commit();  $dbh->commit();
279  $dbh->disconnect();  $dbh->disconnect();
280    
281    print "total duration: ",fmt_time(time() - $start_t),"\n";
282    
283    $pidfile->remove;
284    
285  sub getShareID() {  sub getShareID() {
286    
287          my ($share, $hostID, $hostname) = @_;          my ($share, $hostID, $hostname) = @_;
# Line 247  sub getShareID() { Line 306  sub getShareID() {
306          $drop_down =~ s#//+#/#g;          $drop_down =~ s#//+#/#g;
307    
308          $sth->{insert_share}->execute($hostID,$share, $drop_down ,undef);          $sth->{insert_share}->execute($hostID,$share, $drop_down ,undef);
309          return $dbh->func('last_insert_rowid');                  return $dbh->last_insert_id(undef,undef,'shares',undef);
310  }  }
311    
312  sub found_in_db {  sub found_in_db {
313    
314          my ($shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my @data = @_;
315            shift @data;
316    
317            my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;
318    
319            return $beenThere->{$key} if (defined($beenThere->{$key}));
320    
321          $sth->{file_in_db} ||= $dbh->prepare(qq{          $sth->{file_in_db} ||= $dbh->prepare(qq{
322                  SELECT count(*) FROM files                  SELECT 1 FROM files
323                  WHERE shareID = ? and                  WHERE shareID = ? and
324                          path = ? and                          path = ? and
325                          name = ? and                          name = ? and
# Line 265  sub found_in_db { Line 329  sub found_in_db {
329    
330          my @param = ($shareID,$path,$name,$date,$size);          my @param = ($shareID,$path,$name,$date,$size);
331          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
332          my ($rows) = $sth->{file_in_db}->fetchrow_array();          my $rows = $sth->{file_in_db}->rows;
333  #       print STDERR ( $rows ? '+' : '-' ), join(" ",@param), "\n";          print STDERR "## found_in_db ",( $rows ? '+' : '-' ), join(" ",@param), "\n" if ($debug >= 3);
334    
335            $beenThere->{$key}++;
336    
337            $sth->{'insert_files'}->execute(@data) unless ($rows);
338          return $rows;          return $rows;
339  }  }
340    
# Line 276  sub found_in_db { Line 344  sub found_in_db {
344  ####################################################  ####################################################
345  sub recurseDir($$$$$$$$) {  sub recurseDir($$$$$$$$) {
346    
347          my ($bpc, $hostname, $backups, $backupNum, $share, $dir, $shareID) = @_;          my ($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID) = @_;
348    
349          print STDERR "recurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);          print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);
350    
351          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);
352    
353          { # scope          { # scope
354                  my @stack;                  my @stack;
355    
356                  my $files = BackupPC::View->new($bpc, $hostname, $backups, 1);                  print STDERR "# dirAttrib($backupNum, $share, $dir)\n" if ($debug >= 2);
357                  my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir);                  my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir);
358    
359                  # first, add all the entries in current directory                  # first, add all the entries in current directory
# Line 311  sub recurseDir($$$$$$$$) { Line 379  sub recurseDir($$$$$$$$) {
379                          ));                          ));
380    
381    
382                          if (! $beenThere->{$key} && ! found_in_db(@data)) {                          if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {
383                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
384                                  $sth->{'insert_files'}->execute(@data);  
385                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
386                                          $new_dirs++;                                          $new_dirs++;
387                                          print STDERR " dir\n" if ($debug >= 2);                                          print STDERR " dir\n" if ($debug >= 2);
# Line 322  sub recurseDir($$$$$$$$) { Line 390  sub recurseDir($$$$$$$$) {
390                                          print STDERR " file\n" if ($debug >= 2);                                          print STDERR " file\n" if ($debug >= 2);
391                                  }                                  }
392                          }                          }
                         $beenThere->{$key}++;  
393    
394                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
395                                  $nr_dirs++;                                  $nr_dirs++;
# Line 346  sub recurseDir($$$$$$$$) { Line 413  sub recurseDir($$$$$$$$) {
413                  print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);                  print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);
414    
415                  while ( my $dir = shift @stack ) {                  while ( my $dir = shift @stack ) {
416                          my ($f,$nf,$d,$nd) = recurseDir($bpc, $hostname, $backups, $backupNum, $share, $dir, $shareID);                          my ($f,$nf,$d,$nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID);
417                          print STDERR "# $dir f: $f nf: $nf d: $d nd: $nd\n" if ($debug >= 1);                          print STDERR "# $dir f: $f nf: $nf d: $d nd: $nd\n" if ($debug >= 1);
418                          $nr_files += $f;                          $nr_files += $f;
419                          $new_files += $nf;                          $new_files += $nf;

Legend:
Removed from v.34  
changed lines
  Added in v.51

  ViewVC Help
Powered by ViewVC 1.1.26