/[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 62 by dpavlin, Sun Aug 21 15:59:55 2005 UTC revision 97 by dpavlin, Tue Aug 30 09:55:55 2005 UTC
# Line 13  use File::Pid; Line 13  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    use constant EST_SYNC_EVERY => 10000;
17    
18  my $debug = 0;  my $debug = 0;
19  $|=1;  $|=1;
# Line 40  my $beenThere = {}; Line 41  my $beenThere = {};
41    
42  my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";  my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";
43  my $user = $Conf{SearchUser} || '';  my $user = $Conf{SearchUser} || '';
44    my $index_path = $Conf{HyperEstraierIndex};
45    $index_path = $TopDir . '/' . $index_path;
46    $index_path =~ s#//#/#g;
47    
48    
49  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
50    
51  my %opt;  my %opt;
52    
53  if ( !getopts("cdm:v:", \%opt ) ) {  if ( !getopts("cdm:v:i", \%opt ) ) {
54          print STDERR <<EOF;          print STDERR <<EOF;
55  usage: $0 [-c|-d] [-m num] [-v|-v level]  usage: $0 [-c|-d] [-m num] [-v|-v level] [-i]
56    
57  Options:  Options:
58          -c      create database on first use          -c      create database on first use
59          -d      delete database before import          -d      delete database before import
60          -m num  import just num increments for one host          -m num  import just num increments for one host
61          -v num  set verbosity (debug) level (default $debug)          -v num  set verbosity (debug) level (default $debug)
62            -i      update HyperEstraier full text index
63  EOF  EOF
64          exit 1;          exit 1;
65  }  }
66    
67  ###################################create tables############################3  if ($opt{v}) {
68            print "Debug level at $opt{v}\n";
69            $debug = $opt{v};
70    }
71    
72    #---- subs ----
73    
74    sub fmt_time {
75            my $t = shift || return;
76            my $out = "";
77            my ($ss,$mm,$hh) = gmtime($t);
78            $out .= "${hh}h" if ($hh);
79            $out .= sprintf("%02d:%02d", $mm,$ss);
80            return $out;
81    }
82    
83    sub curr_time {
84            return strftime($t_fmt,localtime());
85    }
86    
87    my $hest_db;
88    
89    sub signal {
90            my($sig) = @_;
91            if ($hest_db) {
92                    print "\nCaught a SIG$sig--syncing database and shutting down\n";
93                    $hest_db->sync();
94                    $hest_db->close();
95            }
96            exit(0);
97    }
98    
99    $SIG{'INT'}  = \&signal;
100    $SIG{'QUIT'} = \&signal;
101    
102    sub hest_update {
103    
104            my ($host_id, $share_id, $num) = @_;
105    
106            print curr_time," updating HyperEstraier: select files";
107    
108            my $t = time();
109    
110            my $where = '';
111            if ($host_id && $share_id && $num) {
112                    $where = qq{
113                    WHERE
114                            hosts.id = ? AND
115                            shares.id = ? AND
116                            files.backupnum = ?
117                    };
118            }
119    
120            my $sth = $dbh->prepare(qq{
121                    SELECT
122                            files.id                        AS fid,
123                            hosts.name                      AS hname,
124                            shares.name                     AS sname,
125                            -- shares.share                 AS sharename,
126                            files.backupnum                 AS backupnum,
127                            -- files.name                   AS filename,
128                            files.path                      AS filepath,
129                            files.date                      AS date,
130                            files.type                      AS type,
131                            files.size                      AS size,
132                            files.shareid                   AS shareid,
133                            backups.date                    AS backup_date
134                    FROM files
135                            INNER JOIN shares       ON files.shareID=shares.ID
136                            INNER JOIN hosts        ON hosts.ID = shares.hostID
137                            INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
138                    $where
139            });
140    
141            $sth->execute(@_);
142            my $results = $sth->rows;
143    
144            if ($results == 0) {
145                    print " - no files, skipping\n";
146                    return;
147            }
148    
149            my $dot = int($results / 15) || 1;
150    
151            print " $results ($dot/#)";
152    
153            sub fmt_date {
154                    my $t = shift || return;
155                    my $iso = BackupPC::Lib::timeStamp($t);
156                    $iso =~ s/\s/T/;
157                    return $iso;
158            }
159    
160            my $max = int($results / $dot);
161    
162            print ", opening index $index_path...";
163            use HyperEstraier;
164            my $db = HyperEstraier::Database->new();
165    
166    #       unless ($hest_db) {
167    #               print " open reader";
168    #               $hest_db = HyperEstraier::Database->new();
169    #
170    #       }
171    
172    
173            $db->open($index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);
174    
175            my $added = 0;
176    
177            while (my $row = $sth->fetchrow_hashref()) {
178    
179                    my $fid = $row->{'fid'} || die "no fid?";
180                    my $uri = 'file:///' . $fid;
181    
182                    my $id = $db->uri_to_id($uri);
183                    next unless ($id == -1);
184    
185                    # create a document object
186                    my $doc = HyperEstraier::Document->new;
187    
188                    # add attributes to the document object
189                    $doc->add_attr('@uri', $uri);
190    
191                    foreach my $c (@{ $sth->{NAME} }) {
192                            $doc->add_attr($c, $row->{$c}) if ($row->{$c});
193                    }
194    
195                    #$doc->add_attr('@cdate', fmt_date($row->{'date'}));
196    
197                    # add the body text to the document object
198                    my $path = $row->{'filepath'};
199                    $doc->add_text($path);
200                    $path =~ s/(.)/$1 /g;
201                    $doc->add_hidden_text($path);
202    
203                    print STDERR $doc->dump_draft,"\n" if ($debug > 1);
204    
205                    # register the document object to the database
206                    $db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);
207    
208                    $added++;
209                    if ($added % $dot == 0) {
210                            print "$max ";
211                            $max--;
212                    }
213    
214                    if ($added % EST_SYNC_EVERY == 0) {
215                            print "sync ";
216                            $db->sync();
217                    }
218    
219            }
220    
221            print "sync $added new files";
222            $db->sync();
223            print ", close";
224            $db->close();
225    
226            my $dur = (time() - $t) || 1;
227            printf(" [%.2f/s new %.2f/s dur: %s]\n",
228                    ( $results / $dur ),
229                    ( $added / $dur ),
230                    fmt_time($dur)
231            );
232    }
233    
234    #---- /subs ----
235    
236    
237    ## update index ##
238    if (($opt{i} || ($index_path && ! -e $index_path)) && !$opt{c}) {
239            # update all
240            print "force update of HyperEstraier index ";
241            print "importing existing data" unless (-e $index_path);
242            print "by -i flag" if ($opt{i});
243            print "\n";
244            hest_update();
245    }
246    
247    ## create tables ##
248  if ($opt{c}) {  if ($opt{c}) {
249          sub do_index {          sub do_index {
250                  my $index = shift || return;                  my $index = shift || return;
# Line 95  if ($opt{c}) { Line 280  if ($opt{c}) {
280                          num     INTEGER         NOT NULL,                          num     INTEGER         NOT NULL,
281                          date    integer         NOT NULL,                          date    integer         NOT NULL,
282                          type    CHAR(4)         not null,                          type    CHAR(4)         not null,
283                          PRIMARY KEY(hostID, num)                          shareID integer         not null references shares(id),
284                            size    integer         not null,
285                            PRIMARY KEY(hostID, num, shareID)
286                  );                              );            
287          });          });
288    
289          do_index('backups_hostid,num_unique');          #do_index('backups_hostid,num_unique');
290    
291          $dbh->do(qq{          $dbh->do(qq{
292                  create table dvds (                  create table dvds (
# Line 147  if ($opt{c}) { Line 334  if ($opt{c}) {
334    
335  }  }
336    
337    ## delete data before inseting ##
338  if ($opt{d}) {  if ($opt{d}) {
339          print "deleting ";          print "deleting ";
340          foreach my $table (qw(files dvds backups shares hosts)) {          foreach my $table (qw(files dvds backups shares hosts)) {
# Line 158  if ($opt{d}) { Line 346  if ($opt{d}) {
346          $dbh->commit;          $dbh->commit;
347  }  }
348    
349  if ($opt{v}) {  ## insert new values ##
         print "Debug level at $opt{v}\n";  
         $debug = $opt{v};  
 }  
   
 #################################INSERT VALUES#############################  
350    
351  # get hosts  # get hosts
352  $hosts = $bpc->HostInfoRead();  $hosts = $bpc->HostInfoRead();
# Line 180  $sth->{hosts_by_name} = $dbh->prepare(qq Line 363  $sth->{hosts_by_name} = $dbh->prepare(qq
363  SELECT ID FROM hosts WHERE name=?  SELECT ID FROM hosts WHERE name=?
364  });  });
365    
366  $sth->{backups_broj} = $dbh->prepare(qq{  $sth->{backups_count} = $dbh->prepare(qq{
367  SELECT COUNT(*)  SELECT COUNT(*)
368  FROM backups  FROM backups
369  WHERE hostID=? AND num=?  WHERE hostID=? AND num=? AND shareid=?
370  });  });
371    
372  $sth->{insert_backups} = $dbh->prepare(qq{  $sth->{insert_backups} = $dbh->prepare(qq{
373  INSERT INTO backups (hostID, num, date, type)  INSERT INTO backups (hostID, num, date, type, shareid, size)
374  VALUES (?,?,?,?)  VALUES (?,?,?,?,?,?)
375  });  });
376    
377  $sth->{insert_files} = $dbh->prepare(qq{  $sth->{insert_files} = $dbh->prepare(qq{
# Line 197  INSERT INTO files Line 380  INSERT INTO files
380          VALUES (?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
381  });  });
382    
 sub fmt_time {  
         my $t = shift || return;  
         my $out = "";  
         my ($ss,$mm,$hh) = gmtime($t);  
         $out .= "${hh}h" if ($hh);  
         $out .= sprintf("%02d:%02d", $mm,$ss);  
         return $out;  
 }  
   
383  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
384    
385          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 221  foreach my $host_key (keys %{$hosts}) { Line 395  foreach my $host_key (keys %{$hosts}) {
395                  $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);                  $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);
396          }          }
397    
398          print("host ".$hosts->{$host_key}->{'host'}.": ");          print "host ".$hosts->{$host_key}->{'host'}.": ";
399    
400          # get backups for a host          # get backups for a host
401          my @backups = $bpc->BackupInfoRead($hostname);          my @backups = $bpc->BackupInfoRead($hostname);
402          print scalar @backups, " increments\n";          my $incs = scalar @backups;
403            print  "$incs increments\n";
404    
405          my $inc_nr = 0;          my $inc_nr = 0;
406            $beenThere = {};
407    
408          foreach my $backup (@backups) {          foreach my $backup (@backups) {
409    
# Line 237  foreach my $host_key (keys %{$hosts}) { Line 413  foreach my $host_key (keys %{$hosts}) {
413                  my $backupNum = $backup->{'num'};                  my $backupNum = $backup->{'num'};
414                  my @backupShares = ();                  my @backupShares = ();
415    
416                  print $hosts->{$host_key}->{'host'},                  printf("%-10s %2d/%-2d #%-2d %s %5s/%5s files (date: %s dur: %s)\n",
417                          "\t#$backupNum\t", $backup->{type} || '?', " ",                          $hosts->{$host_key}->{'host'},
418                          $backup->{nFilesNew} || '?', "/", $backup->{nFiles} || '?',                          $inc_nr, $incs, $backupNum,
419                          " files (date: ",                          $backup->{type} || '?',
420                            $backup->{nFilesNew} || '?', $backup->{nFiles} || '?',
421                          strftime($t_fmt,localtime($backup->{startTime})),                          strftime($t_fmt,localtime($backup->{startTime})),
422                          " dur: ",                          fmt_time($backup->{endTime} - $backup->{startTime})
                         fmt_time($backup->{endTime} - $backup->{startTime}),  
                         ")\n";  
   
                 $sth->{backups_broj}->execute($hostID, $backupNum);  
                 my ($broj) = $sth->{backups_broj}->fetchrow_array();  
                 next if ($broj > 0);  
   
                 $sth->{insert_backups}->execute(  
                         $hostID,  
                         $backupNum,  
                         $backup->{'endTime'},  
                         $backup->{'type'}  
423                  );                  );
                 $dbh->commit();  
424    
425                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);
426                  foreach my $share ($files->shareList($backupNum)) {                  foreach my $share ($files->shareList($backupNum)) {
427    
428                          my $t = time();                          my $t = time();
429    
                         print strftime($t_fmt,localtime())," ", $share;  
430                          $shareID = getShareID($share, $hostID, $hostname);                          $shareID = getShareID($share, $hostID, $hostname);
431                                    
432                          my ($f, $nf, $d, $nd) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);                          $sth->{backups_count}->execute($hostID, $backupNum, $shareID);
433                            my ($count) = $sth->{backups_count}->fetchrow_array();
434                            # skip if allready in database!
435                            next if ($count > 0);
436    
437                            # dump some log
438                            print curr_time," ", $share;
439    
440                            my ($f, $nf, $d, $nd, $size) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);
441    
442                            $sth->{insert_backups}->execute(
443                                    $hostID,
444                                    $backupNum,
445                                    $backup->{'endTime'},
446                                    $backup->{'type'},
447                                    $shareID,
448                                    $size,
449                            );
450    
451                            print " commit";
452                            $dbh->commit();
453    
454                          my $dur = (time() - $t) || 1;                          my $dur = (time() - $t) || 1;
455                          printf(" %d/%d files %d/%d dirs [%.2f/s dur: %s]\n",                          printf(" %d/%d files %d/%d dirs %0.2f MB [%.2f/s dur: %s]\n",
456                                  $nf, $f, $nd, $d,                                  $nf, $f, $nd, $d,
457                                    ($size / 1024 / 1024),
458                                  ( ($f+$d) / $dur ),                                  ( ($f+$d) / $dur ),
459                                  fmt_time($dur)                                  fmt_time($dur)
460                          );                          );
461                          $dbh->commit();  
462                            hest_update($hostID, $shareID, $backupNum);
463                  }                  }
464    
465          }          }
# Line 318  sub found_in_db { Line 504  sub found_in_db {
504          my @data = @_;          my @data = @_;
505          shift @data;          shift @data;
506    
507          my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my ($key, $shareID,undef,$name,$path,$date,undef,$size) = @_;
508    
509          return $beenThere->{$key} if (defined($beenThere->{$key}));          return $beenThere->{$key} if (defined($beenThere->{$key}));
510    
# Line 326  sub found_in_db { Line 512  sub found_in_db {
512                  SELECT 1 FROM files                  SELECT 1 FROM files
513                  WHERE shareID = ? and                  WHERE shareID = ? and
514                          path = ? and                          path = ? and
                         name = ? and  
515                          date = ? and                          date = ? and
516                          size = ?                          size = ?
517                    LIMIT 1
518          });          });
519    
520          my @param = ($shareID,$path,$name,$date,$size);          my @param = ($shareID,$path,$date,$size);
521          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
522          my $rows = $sth->{file_in_db}->rows;          my $rows = $sth->{file_in_db}->rows;
523          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);
524    
525          $beenThere->{$key}++;          $beenThere->{$key}++;
526    
# Line 352  sub recurseDir($$$$$$$$) { Line 538  sub recurseDir($$$$$$$$) {
538    
539          print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);          print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);
540    
541          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);
542    
543          { # scope          { # scope
544                  my @stack;                  my @stack;
# Line 362  sub recurseDir($$$$$$$$) { Line 548  sub recurseDir($$$$$$$$) {
548    
549                  # first, add all the entries in current directory                  # first, add all the entries in current directory
550                  foreach my $path_key (keys %{$filesInBackup}) {                  foreach my $path_key (keys %{$filesInBackup}) {
551                            print STDERR "# file ",Dumper($filesInBackup->{$path_key}),"\n" if ($debug >= 3);
552                          my @data = (                          my @data = (
553                                  $shareID,                                  $shareID,
554                                  $backupNum,                                  $backupNum,
# Line 380  sub recurseDir($$$$$$$$) { Line 567  sub recurseDir($$$$$$$$) {
567                                  $filesInBackup->{$path_key}->{'size'}                                  $filesInBackup->{$path_key}->{'size'}
568                          ));                          ));
569    
570                            my $found;
571                          if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {                          if (! defined($beenThere->{$key}) && ! ($found = found_in_db($key, @data)) ) {
572                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
573    
574                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
575                                          $new_dirs++;                                          $new_dirs++ unless ($found);
576                                          print STDERR " dir\n" if ($debug >= 2);                                          print STDERR " dir\n" if ($debug >= 2);
577                                  } else {                                  } else {
578                                          $new_files++;                                          $new_files++ unless ($found);
579                                          print STDERR " file\n" if ($debug >= 2);                                          print STDERR " file\n" if ($debug >= 2);
580                                  }                                  }
581                                    $size += $filesInBackup->{$path_key}->{'size'} || 0;
582                          }                          }
583    
584                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                          if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
# Line 415  sub recurseDir($$$$$$$$) { Line 603  sub recurseDir($$$$$$$$) {
603                  print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);                  print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);
604    
605                  while ( my $dir = shift @stack ) {                  while ( my $dir = shift @stack ) {
606                          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);
607                          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);
608                          $nr_files += $f;                          $nr_files += $f;
609                          $new_files += $nf;                          $new_files += $nf;
610                          $nr_dirs += $d;                          $nr_dirs += $d;
611                          $new_dirs += $nd;                          $new_dirs += $nd;
612                            $size += $s;
613                  }                  }
614          }          }
615    
616          return ($nr_files, $new_files, $nr_dirs, $new_dirs);          return ($nr_files, $new_files, $nr_dirs, $new_dirs, $size);
617  }  }
618    

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

  ViewVC Help
Powered by ViewVC 1.1.26