/[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 49 by dpavlin, Sat Aug 20 15:01:48 2005 UTC revision 86 by dpavlin, Sun Aug 28 12:35:59 2005 UTC
# Line 17  use constant BPC_FTYPE_DIR => 5; Line 17  use constant BPC_FTYPE_DIR => 5;
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 36  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 = '';  my $user = $Conf{SearchUser} || '';
43    my $index_path = $Conf{HyperEstraierIndex};
 # DEBUG option!  
 ($dsn,$user) = qw/dbi:Pg:dbname=backuppc dpavlin/;  
44    
45  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
46    
47  my %opt;  my %opt;
48    
49  if ( !getopts("cdm:v:", \%opt ) ) {  if ( !getopts("cdm:v:i", \%opt ) ) {
50          print STDERR <<EOF;          print STDERR <<EOF;
51  usage: $0 [-c|-d] [-m num] [-v|-v level]  usage: $0 [-c|-d] [-m num] [-v|-v level] [-i]
52    
53  Options:  Options:
54          -c      create database on first use          -c      create database on first use
55          -d      delete database before import          -d      delete database before import
56          -m num  import just num increments for one host          -m num  import just num increments for one host
57          -v num  set verbosity (debug) level (default $debug)          -v num  set verbosity (debug) level (default $debug)
58            -i      update HyperEstraier full text index
59  EOF  EOF
60          exit 1;          exit 1;
61  }  }
62    
63    if ($opt{v}) {
64            print "Debug level at $opt{v}\n";
65            $debug = $opt{v};
66    }
67    
68    #---- subs ----
69    
70    sub fmt_time {
71            my $t = shift || return;
72            my $out = "";
73            my ($ss,$mm,$hh) = gmtime($t);
74            $out .= "${hh}h" if ($hh);
75            $out .= sprintf("%02d:%02d", $mm,$ss);
76            return $out;
77    }
78    
79    sub curr_time {
80            return strftime($t_fmt,localtime());
81    }
82    
83    #---- /subs ----
84    
85    ## update index ##
86    if ($opt{i}) {
87    
88            print curr_time," updating HyperEstraier: files";
89    
90            my $t = time();
91            
92            my $sth = $dbh->prepare(qq{
93                    SELECT
94                            files.id                        AS fid,
95                            hosts.name                      AS hname,
96                            shares.name                     AS sname,
97                            -- shares.share                 AS sharename,
98                            files.backupnum                 AS backupnum,
99                            -- files.name                   AS filename,
100                            files.path                      AS filepath,
101                            files.date                      AS date,
102                            files.type                      AS filetype,
103                            files.size                      AS size,
104                            files.shareid                   AS shareid,
105                            backups.date                    AS backup_date
106                    FROM files
107                            INNER JOIN shares       ON files.shareID=shares.ID
108                            INNER JOIN hosts        ON hosts.ID = shares.hostID
109                            INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
110            });
111    
112            $sth->execute();
113            my $results = $sth->rows;
114    
115            my $dot = int($results / 15);
116    
117            print " $results ($dot/#)";
118    
119            sub fmt_date {
120                    my $t = shift || return;
121                    my $iso = BackupPC::Lib::timeStamp($t);
122                    $iso =~ s/\s/T/;
123                    return $iso;
124            }
125    
126            my $i = 0;
127            my $max = int($results / $dot);
128    
129            $index_path = $TopDir . '/' . $index_path;
130            $index_path =~ s#//#/#g;
131    
132            print " index $index_path...";
133            use HyperEstraier;
134            my $db = HyperEstraier::Database->new();
135            $db->open($index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);
136    
137    
138            while (my $row = $sth->fetchrow_hashref()) {
139    
140                    # create a document object
141                    my $doc = HyperEstraier::Document->new;
142    
143                    # add attributes to the document object
144                    $doc->add_attr('@uri', 'file:///' . $row->{'fid'});
145    
146                    foreach my $c (@{ $sth->{NAME} }) {
147                            $doc->add_attr($c, $row->{$c}) if ($row->{$c});
148                    }
149    
150                    #$doc->add_attr('@cdate', fmt_date($row->{'date'}));
151    
152                    # add the body text to the document object
153                    my $path = $row->{'filepath'};
154                    $doc->add_text($path);
155                    $path =~ s/(.)/$1 /g;
156                    $doc->add_hidden_text($path);
157    
158                    print STDERR $doc->dump_draft,"\n" if ($debug > 1);
159    
160                    # register the document object to the database
161                    $db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);
162    
163                    $i++;
164                    if ($i % $dot == 0) {
165                            print "$max ";
166                            $max--;
167                    }
168    
169            }
170    
171            print "sync";
172            $db->sync();
173            print " close";
174            $db->close();
175    
176            my $dur = (time() - $t) || 1;
177            printf(" [%.2f/s dur: %s]\n",
178                    ( $results / $dur ),
179                    fmt_time($dur)
180            );
181    
182            exit;
183    }
184    
185  ###################################create tables############################3  ###################################create tables############################3
186    
187  if ($opt{c}) {  if ($opt{c}) {
# Line 66  if ($opt{c}) { Line 189  if ($opt{c}) {
189                  my $index = shift || return;                  my $index = shift || return;
190                  my ($table,$col,$unique) = split(/_/, $index);                  my ($table,$col,$unique) = split(/_/, $index);
191                  $unique ||= '';                  $unique ||= '';
192                    $index =~ s/,/_/g;
193                  $dbh->do(qq{ create $unique index $index on $table($col) });                  $dbh->do(qq{ create $unique index $index on $table($col) });
194          }          }
195    
# Line 95  if ($opt{c}) { Line 219  if ($opt{c}) {
219                          num     INTEGER         NOT NULL,                          num     INTEGER         NOT NULL,
220                          date    integer         NOT NULL,                          date    integer         NOT NULL,
221                          type    CHAR(4)         not null,                          type    CHAR(4)         not null,
222                          PRIMARY KEY(hostID, num)                          shareID integer         not null references shares(id),
223                            size    integer         not null,
224                            PRIMARY KEY(hostID, num, shareID)
225                  );                              );            
226          });          });
227    
228          do_index('backups_num_unique');          #do_index('backups_hostid,num_unique');
229    
230          $dbh->do(qq{          $dbh->do(qq{
231                  create table dvds (                  create table dvds (
# Line 114  if ($opt{c}) { Line 240  if ($opt{c}) {
240                  create table files (                  create table files (
241                          ID      SERIAL          PRIMARY KEY,                            ID      SERIAL          PRIMARY KEY,  
242                          shareID INTEGER         NOT NULL references shares(id),                          shareID INTEGER         NOT NULL references shares(id),
243                          backupNum  INTEGER      NOT NULL references backups(num),                          backupNum  INTEGER      NOT NULL,
244                          name       VARCHAR(255) NOT NULL,                          name       VARCHAR(255) NOT NULL,
245                          path       VARCHAR(255) NOT NULL,                          path       VARCHAR(255) NOT NULL,
                         fullpath   VARCHAR(255) NOT NULL,  
246                          date       integer      NOT NULL,                          date       integer      NOT NULL,
247                          type       INTEGER      NOT NULL,                          type       INTEGER      NOT NULL,
248                          size       INTEGER      NOT NULL,                          size       INTEGER      NOT NULL,
# Line 156  if ($opt{d}) { Line 281  if ($opt{d}) {
281          }          }
282          print " done...\n";          print " done...\n";
283    
284          eval { $dbh->commit; };          $dbh->commit;
 }  
   
 if ($opt{v}) {  
         print "Debug level at $opt{v}\n";  
         $debug = $opt{v};  
285  }  }
286    
287  #################################INSERT VALUES#############################  #################################INSERT VALUES#############################
# Line 181  $sth->{hosts_by_name} = $dbh->prepare(qq Line 301  $sth->{hosts_by_name} = $dbh->prepare(qq
301  SELECT ID FROM hosts WHERE name=?  SELECT ID FROM hosts WHERE name=?
302  });  });
303    
304  $sth->{backups_broj} = $dbh->prepare(qq{  $sth->{backups_count} = $dbh->prepare(qq{
305  SELECT COUNT(*)  SELECT COUNT(*)
306  FROM backups  FROM backups
307  WHERE hostID=? AND num=?  WHERE hostID=? AND num=? AND shareid=?
308  });  });
309    
310  $sth->{insert_backups} = $dbh->prepare(qq{  $sth->{insert_backups} = $dbh->prepare(qq{
311  INSERT INTO backups (hostID, num, date, type)  INSERT INTO backups (hostID, num, date, type, shareid, size)
312  VALUES (?,?,?,?)  VALUES (?,?,?,?,?,?)
313  });  });
314    
315  $sth->{insert_files} = $dbh->prepare(qq{  $sth->{insert_files} = $dbh->prepare(qq{
316  INSERT INTO files  INSERT INTO files
317          (shareID, backupNum, name, path, fullpath, date, type, size)          (shareID, backupNum, name, path, date, type, size)
318          VALUES (?,?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
319  });  });
320    
321  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
# Line 213  foreach my $host_key (keys %{$hosts}) { Line 333  foreach my $host_key (keys %{$hosts}) {
333                  $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);                  $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);
334          }          }
335    
336          print("host ".$hosts->{$host_key}->{'host'}.": ");          print "host ".$hosts->{$host_key}->{'host'}.": ";
337    
338          # get backups for a host          # get backups for a host
339          my @backups = $bpc->BackupInfoRead($hostname);          my @backups = $bpc->BackupInfoRead($hostname);
340          print scalar @backups, " increments\n";          my $incs = scalar @backups;
341            print  "$incs increments\n";
342    
343          my $inc_nr = 0;          my $inc_nr = 0;
344            $beenThere = {};
345    
346          foreach my $backup (@backups) {          foreach my $backup (@backups) {
347    
# Line 229  foreach my $host_key (keys %{$hosts}) { Line 351  foreach my $host_key (keys %{$hosts}) {
351                  my $backupNum = $backup->{'num'};                  my $backupNum = $backup->{'num'};
352                  my @backupShares = ();                  my @backupShares = ();
353    
354                  print $hosts->{$host_key}->{'host'},                  printf("%-10s %2d/%-2d #%-2d %s %5s/%5s files (date: %s dur: %s)\n",
355                          "\t#$backupNum\t", $backup->{type} || '?', " ",                          $hosts->{$host_key}->{'host'},
356                          $backup->{nFilesNew} || '?', "/", $backup->{nFiles} || '?',                          $inc_nr, $incs, $backupNum,
357                          " files\n";                          $backup->{type} || '?',
358                            $backup->{nFilesNew} || '?', $backup->{nFiles} || '?',
359                  $sth->{backups_broj}->execute($hostID, $backupNum);                          strftime($t_fmt,localtime($backup->{startTime})),
360                  my ($broj) = $sth->{backups_broj}->fetchrow_array();                          fmt_time($backup->{endTime} - $backup->{startTime})
                 next if ($broj > 0);  
   
                 $sth->{insert_backups}->execute(  
                         $hostID,  
                         $backupNum,  
                         $backup->{'endTime'},  
                         $backup->{'type'}  
361                  );                  );
                 $dbh->commit();  
362    
363                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);
364                  foreach my $share ($files->shareList($backupNum)) {                  foreach my $share ($files->shareList($backupNum)) {
365    
366                          my $t = time();                          my $t = time();
367    
                         print strftime($t_fmt,localtime())," ", $share;  
368                          $shareID = getShareID($share, $hostID, $hostname);                          $shareID = getShareID($share, $hostID, $hostname);
369                                    
370                          my ($f, $nf, $d, $nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);                          $sth->{backups_count}->execute($hostID, $backupNum, $shareID);
371                          printf(" %d/%d files %d/%d dirs [%.2f/s]\n",                          my ($count) = $sth->{backups_count}->fetchrow_array();
372                                  $nf, $f, $nd, $d,                          # skip if allready in database!
373                                  ( ($f+$d) / ((time() - $t) || 1) )                          next if ($count > 0);
374    
375                            # dump some log
376                            print curr_time," ", $share;
377    
378                            my ($f, $nf, $d, $nd, $size) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);
379    
380                            $sth->{insert_backups}->execute(
381                                    $hostID,
382                                    $backupNum,
383                                    $backup->{'endTime'},
384                                    $backup->{'type'},
385                                    $shareID,
386                                    $size,
387                          );                          );
388    
389                            print " commit";
390                          $dbh->commit();                          $dbh->commit();
391    
392                            my $dur = (time() - $t) || 1;
393                            printf(" %d/%d files %d/%d dirs %0.2f MB [%.2f/s dur: %s]\n",
394                                    $nf, $f, $nd, $d,
395                                    ($size / 1024 / 1024),
396                                    ( ($f+$d) / $dur ),
397                                    fmt_time($dur)
398                            );
399                  }                  }
400    
401          }          }
# Line 268  undef $sth; Line 404  undef $sth;
404  $dbh->commit();  $dbh->commit();
405  $dbh->disconnect();  $dbh->disconnect();
406    
407    print "total duration: ",fmt_time(time() - $start_t),"\n";
408    
409  $pidfile->remove;  $pidfile->remove;
410    
411  sub getShareID() {  sub getShareID() {
# Line 302  sub found_in_db { Line 440  sub found_in_db {
440          my @data = @_;          my @data = @_;
441          shift @data;          shift @data;
442    
443          my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my ($key, $shareID,undef,$name,$path,$date,undef,$size) = @_;
444    
445          return $beenThere->{$key} if (defined($beenThere->{$key}));          return $beenThere->{$key} if (defined($beenThere->{$key}));
446    
# Line 310  sub found_in_db { Line 448  sub found_in_db {
448                  SELECT 1 FROM files                  SELECT 1 FROM files
449                  WHERE shareID = ? and                  WHERE shareID = ? and
450                          path = ? and                          path = ? and
                         name = ? and  
451                          date = ? and                          date = ? and
452                          size = ?                          size = ?
453                    LIMIT 1
454          });          });
455    
456          my @param = ($shareID,$path,$name,$date,$size);          my @param = ($shareID,$path,$date,$size);
457          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
458          my $rows = $sth->{file_in_db}->rows;          my $rows = $sth->{file_in_db}->rows;
459          print STDERR "## found_in_db ",( $rows ? '+' : '-' ), join(" ",@param), "\n" if ($debug >= 3);          print STDERR "## found_in_db($shareID,$path,$date,$size) ",( $rows ? '+' : '-' ), join(" ",@param), "\n" if ($debug >= 3);
460    
461          $beenThere->{$key}++;          $beenThere->{$key}++;
462    
# Line 336  sub recurseDir($$$$$$$$) { Line 474  sub recurseDir($$$$$$$$) {
474    
475          print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);          print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);
476    
477          my ($nr_files, $new_files, $nr_dirs, $new_dirs) = (0,0,0,0);          my ($nr_files, $new_files, $nr_dirs, $new_dirs, $size) = (0,0,0,0,0);
478    
479          { # scope          { # scope
480                  my @stack;                  my @stack;
# Line 346  sub recurseDir($$$$$$$$) { Line 484  sub recurseDir($$$$$$$$) {
484    
485                  # first, add all the entries in current directory                  # first, add all the entries in current directory
486                  foreach my $path_key (keys %{$filesInBackup}) {                  foreach my $path_key (keys %{$filesInBackup}) {
487                            print STDERR "# file ",Dumper($filesInBackup->{$path_key}),"\n" if ($debug >= 3);
488                          my @data = (                          my @data = (
489                                  $shareID,                                  $shareID,
490                                  $backupNum,                                  $backupNum,
491                                  $path_key,                                  $path_key,
492                                  $filesInBackup->{$path_key}->{'relPath'},                                  $filesInBackup->{$path_key}->{'relPath'},
                                 $filesInBackup->{$path_key}->{'fullPath'},  
         #                       $filesInBackup->{$path_key}->{'sharePathM'},  
493                                  $filesInBackup->{$path_key}->{'mtime'},                                  $filesInBackup->{$path_key}->{'mtime'},
494                                  $filesInBackup->{$path_key}->{'type'},                                  $filesInBackup->{$path_key}->{'type'},
495                                  $filesInBackup->{$path_key}->{'size'}                                  $filesInBackup->{$path_key}->{'size'}
# Line 366  sub recurseDir($$$$$$$$) { Line 503  sub recurseDir($$$$$$$$) {
503                                  $filesInBackup->{$path_key}->{'size'}                                  $filesInBackup->{$path_key}->{'size'}
504                          ));                          ));
505    
506                            my $found;
507                          if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {                          if (! defined($beenThere->{$key}) && ! ($found = found_in_db($key, @data)) ) {
508                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
509    
510                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
511                                          $new_dirs++;                                          $new_dirs++ unless ($found);
512                                          print STDERR " dir\n" if ($debug >= 2);                                          print STDERR " dir\n" if ($debug >= 2);
513                                  } else {                                  } else {
514                                          $new_files++;                                          $new_files++ unless ($found);
515                                          print STDERR " file\n" if ($debug >= 2);                                          print STDERR " file\n" if ($debug >= 2);
516                                  }                                  }
517                                    $size += $filesInBackup->{$path_key}->{'size'} || 0;
518                          }                          }
519    
520                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
# Line 401  sub recurseDir($$$$$$$$) { Line 539  sub recurseDir($$$$$$$$) {
539                  print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);                  print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);
540    
541                  while ( my $dir = shift @stack ) {                  while ( my $dir = shift @stack ) {
542                          my ($f,$nf,$d,$nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID);                          my ($f,$nf,$d,$nd, $s) = recurseDir($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID);
543                          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);
544                          $nr_files += $f;                          $nr_files += $f;
545                          $new_files += $nf;                          $new_files += $nf;
546                          $nr_dirs += $d;                          $nr_dirs += $d;
547                          $new_dirs += $nd;                          $new_dirs += $nd;
548                            $size += $s;
549                  }                  }
550          }          }
551    
552          return ($nr_files, $new_files, $nr_dirs, $new_dirs);          return ($nr_files, $new_files, $nr_dirs, $new_dirs, $size);
553  }  }
554    

Legend:
Removed from v.49  
changed lines
  Added in v.86

  ViewVC Help
Powered by ViewVC 1.1.26