/[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 66 by dpavlin, Mon Aug 22 00:09:59 2005 UTC revision 116 by dpavlin, Sun Sep 11 12:39:24 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_CHUNK => 100000;
17    
18  my $debug = 0;  my $debug = 0;
19  $|=1;  $|=1;
# Line 41  my $beenThere = {}; Line 42  my $beenThere = {};
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    
45    my $use_hest = $Conf{HyperEstraierIndex};
46    my ($index_path, $index_node_url);
47    if ($use_hest) {
48            use HyperEstraier;
49            if ($use_hest =~ m#^http://#) {
50                    $index_node_url = $use_hest;
51            } else {
52                    $index_path = $TopDir . '/' . $index_path;
53                    $index_path =~ s#//#/#g;
54            }
55    }
56    print "-- $use_hest : $index_path OR $index_node_url --\n";
57    
58    
59  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
60    
61  my %opt;  my %opt;
62    
63  if ( !getopts("cdm:v:", \%opt ) ) {  if ( !getopts("cdm:v:i", \%opt ) ) {
64          print STDERR <<EOF;          print STDERR <<EOF;
65  usage: $0 [-c|-d] [-m num] [-v|-v level]  usage: $0 [-c|-d] [-m num] [-v|-v level] [-i]
66    
67  Options:  Options:
68          -c      create database on first use          -c      create database on first use
69          -d      delete database before import          -d      delete database before import
70          -m num  import just num increments for one host          -m num  import just num increments for one host
71          -v num  set verbosity (debug) level (default $debug)          -v num  set verbosity (debug) level (default $debug)
72            -i      update HyperEstraier full text index
73  EOF  EOF
74          exit 1;          exit 1;
75  }  }
76    
77  ###################################create tables############################3  if ($opt{v}) {
78            print "Debug level at $opt{v}\n";
79            $debug = $opt{v};
80    }
81    
82    #---- subs ----
83    
84    sub fmt_time {
85            my $t = shift || return;
86            my $out = "";
87            my ($ss,$mm,$hh) = gmtime($t);
88            $out .= "${hh}h" if ($hh);
89            $out .= sprintf("%02d:%02d", $mm,$ss);
90            return $out;
91    }
92    
93    sub curr_time {
94            return strftime($t_fmt,localtime());
95    }
96    
97    my $hest_db;
98    my $hest_node;
99    
100    sub signal {
101            my($sig) = @_;
102            if ($hest_db) {
103                    print "\nCaught a SIG$sig--syncing database and shutting down\n";
104                    $hest_db->sync();
105                    $hest_db->close();
106            }
107            exit(0);
108    }
109    
110    $SIG{'INT'}  = \&signal;
111    $SIG{'QUIT'} = \&signal;
112    
113    sub hest_update {
114    
115            my ($host_id, $share_id, $num) = @_;
116    
117            unless ($use_hest) {
118                    print STDERR "HyperEstraier support not enabled in configuration\n";
119                    return;
120            }
121    
122            print curr_time," updating HyperEstraier:";
123    
124            my $t = time();
125    
126            my $offset = 0;
127            my $added = 0;
128    
129            print " opening index $use_hest";
130            if ($index_path) {
131                    $hest_db = HyperEstraier::Database->new();
132                    $hest_db->open($index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);
133                    print " directly";
134            } elsif ($index_node_url) {
135                    $hest_node ||= HyperEstraier::Node->new($index_node_url);
136                    $hest_node->set_auth('admin', 'admin');
137                    print " via node URL";
138            } else {
139                    die "don't know how to use HyperEstraier Index $use_hest";
140            }
141            print " increment is " . EST_CHUNK . " files:";
142    
143            my $results = 0;
144    
145            do {
146    
147                    my $where = '';
148                    my @data;
149                    if ($host_id && $share_id && $num) {
150                            $where = qq{
151                            WHERE
152                                    hosts.id = ? AND
153                                    shares.id = ? AND
154                                    files.backupnum = ?
155                            };
156                            @data = ( $host_id, $share_id, $num );
157                    }
158    
159                    my $limit = sprintf('LIMIT '.EST_CHUNK.' OFFSET %d', $offset);
160    
161                    my $sth = $dbh->prepare(qq{
162                            SELECT
163                                    files.id                        AS fid,
164                                    hosts.name                      AS hname,
165                                    shares.name                     AS sname,
166                                    -- shares.share                 AS sharename,
167                                    files.backupnum                 AS backupnum,
168                                    -- files.name                   AS filename,
169                                    files.path                      AS filepath,
170                                    files.date                      AS date,
171                                    files.type                      AS type,
172                                    files.size                      AS size,
173                                    files.shareid                   AS shareid,
174                                    backups.date                    AS backup_date
175                            FROM files
176                                    INNER JOIN shares       ON files.shareID=shares.ID
177                                    INNER JOIN hosts        ON hosts.ID = shares.hostID
178                                    INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
179                            $where
180                            $limit
181                    });
182    
183                    $sth->execute(@data);
184                    $results = $sth->rows;
185    
186                    if ($results == 0) {
187                            print " - no new files\n";
188                            last;
189                    }
190    
191                    sub fmt_date {
192                            my $t = shift || return;
193                            my $iso = BackupPC::Lib::timeStamp($t);
194                            $iso =~ s/\s/T/;
195                            return $iso;
196                    }
197    
198                    while (my $row = $sth->fetchrow_hashref()) {
199    
200                            my $fid = $row->{'fid'} || die "no fid?";
201                            my $uri = 'file:///' . $fid;
202    
203                            my $id = ($hest_db || $hest_node)->uri_to_id($uri);
204                            next unless ($id == -1);
205    
206                            # create a document object
207                            my $doc = HyperEstraier::Document->new;
208    
209                            # add attributes to the document object
210                            $doc->add_attr('@uri', $uri);
211    
212                            foreach my $c (@{ $sth->{NAME} }) {
213                                    $doc->add_attr($c, $row->{$c}) if ($row->{$c});
214                            }
215    
216                            #$doc->add_attr('@cdate', fmt_date($row->{'date'}));
217    
218                            # add the body text to the document object
219                            my $path = $row->{'filepath'};
220                            $doc->add_text($path);
221                            $path =~ s/(.)/$1 /g;
222                            $doc->add_hidden_text($path);
223    
224                            print STDERR $doc->dump_draft,"\n" if ($debug > 1);
225    
226                            # register the document object to the database
227                            if ($hest_db) {
228                                    $hest_db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);
229                            } elsif ($hest_node) {
230                                    $hest_node->put_doc($doc);
231                            } else {
232                                    die "not supported";
233                            }
234                            $added++;
235                    }
236    
237                    print " $added";
238                    $hest_db->sync() if ($index_path);
239    
240                    $offset += EST_CHUNK;
241    
242            } while ($results == EST_CHUNK);
243    
244            if ($index_path) {
245                    print ", close";
246                    $hest_db->close();
247            }
248    
249            my $dur = (time() - $t) || 1;
250            printf(" [%.2f/s dur: %s]\n",
251                    ( $added / $dur ),
252                    fmt_time($dur)
253            );
254    }
255    
256    #---- /subs ----
257    
258    
259    ## update index ##
260    if (($opt{i} || ($index_path && ! -e $index_path)) && !$opt{c}) {
261            # update all
262            print "force update of HyperEstraier index ";
263            print "importing existing data" unless (-e $index_path);
264            print "by -i flag" if ($opt{i});
265            print "\n";
266            hest_update();
267    }
268    
269    ## create tables ##
270  if ($opt{c}) {  if ($opt{c}) {
271          sub do_index {          sub do_index {
272                  my $index = shift || return;                  my $index = shift || return;
# Line 149  if ($opt{c}) { Line 356  if ($opt{c}) {
356    
357  }  }
358    
359    ## delete data before inseting ##
360  if ($opt{d}) {  if ($opt{d}) {
361          print "deleting ";          print "deleting ";
362          foreach my $table (qw(files dvds backups shares hosts)) {          foreach my $table (qw(files dvds backups shares hosts)) {
# Line 160  if ($opt{d}) { Line 368  if ($opt{d}) {
368          $dbh->commit;          $dbh->commit;
369  }  }
370    
371  if ($opt{v}) {  ## insert new values ##
         print "Debug level at $opt{v}\n";  
         $debug = $opt{v};  
 }  
   
 #################################INSERT VALUES#############################  
372    
373  # get hosts  # get hosts
374  $hosts = $bpc->HostInfoRead();  $hosts = $bpc->HostInfoRead();
# Line 199  INSERT INTO files Line 402  INSERT INTO files
402          VALUES (?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
403  });  });
404    
 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;  
 }  
   
405  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
406    
407          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 223  foreach my $host_key (keys %{$hosts}) { Line 417  foreach my $host_key (keys %{$hosts}) {
417                  $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);                  $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);
418          }          }
419    
420          print("host ".$hosts->{$host_key}->{'host'}.": ");          print "host ".$hosts->{$host_key}->{'host'}.": ";
421    
422          # get backups for a host          # get backups for a host
423          my @backups = $bpc->BackupInfoRead($hostname);          my @backups = $bpc->BackupInfoRead($hostname);
424          print scalar @backups, " increments\n";          my $incs = scalar @backups;
425            print  "$incs increments\n";
426    
427          my $inc_nr = 0;          my $inc_nr = 0;
428            $beenThere = {};
429    
430          foreach my $backup (@backups) {          foreach my $backup (@backups) {
431    
# Line 239  foreach my $host_key (keys %{$hosts}) { Line 435  foreach my $host_key (keys %{$hosts}) {
435                  my $backupNum = $backup->{'num'};                  my $backupNum = $backup->{'num'};
436                  my @backupShares = ();                  my @backupShares = ();
437    
438                  print $hosts->{$host_key}->{'host'},                  printf("%-10s %2d/%-2d #%-2d %s %5s/%5s files (date: %s dur: %s)\n",
439                          "\t#$backupNum\t", $backup->{type} || '?', " ",                          $hosts->{$host_key}->{'host'},
440                          $backup->{nFilesNew} || '?', "/", $backup->{nFiles} || '?',                          $inc_nr, $incs, $backupNum,
441                          " files (date: ",                          $backup->{type} || '?',
442                            $backup->{nFilesNew} || '?', $backup->{nFiles} || '?',
443                          strftime($t_fmt,localtime($backup->{startTime})),                          strftime($t_fmt,localtime($backup->{startTime})),
444                          " dur: ",                          fmt_time($backup->{endTime} - $backup->{startTime})
445                          fmt_time($backup->{endTime} - $backup->{startTime}),                  );
                         ")\n";  
446    
447                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);                  my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);
448                  foreach my $share ($files->shareList($backupNum)) {                  foreach my $share ($files->shareList($backupNum)) {
# Line 261  foreach my $host_key (keys %{$hosts}) { Line 457  foreach my $host_key (keys %{$hosts}) {
457                          next if ($count > 0);                          next if ($count > 0);
458    
459                          # dump some log                          # dump some log
460                          print strftime($t_fmt,localtime())," ", $share;                          print curr_time," ", $share;
461    
462                          my ($f, $nf, $d, $nd, $size) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);                          my ($f, $nf, $d, $nd, $size) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);
463    
# Line 284  foreach my $host_key (keys %{$hosts}) { Line 480  foreach my $host_key (keys %{$hosts}) {
480                                  ( ($f+$d) / $dur ),                                  ( ($f+$d) / $dur ),
481                                  fmt_time($dur)                                  fmt_time($dur)
482                          );                          );
483    
484                            hest_update($hostID, $shareID, $backupNum) if ($nf + $nd > 0);
485                  }                  }
486    
487          }          }
# Line 328  sub found_in_db { Line 526  sub found_in_db {
526          my @data = @_;          my @data = @_;
527          shift @data;          shift @data;
528    
529          my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my ($key, $shareID,undef,$name,$path,$date,undef,$size) = @_;
530    
531          return $beenThere->{$key} if (defined($beenThere->{$key}));          return $beenThere->{$key} if (defined($beenThere->{$key}));
532    
# Line 336  sub found_in_db { Line 534  sub found_in_db {
534                  SELECT 1 FROM files                  SELECT 1 FROM files
535                  WHERE shareID = ? and                  WHERE shareID = ? and
536                          path = ? and                          path = ? and
                         name = ? and  
537                          date = ? and                          date = ? and
538                          size = ?                          size = ?
539                    LIMIT 1
540          });          });
541    
542          my @param = ($shareID,$path,$name,$date,$size);          my @param = ($shareID,$path,$date,$size);
543          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
544          my $rows = $sth->{file_in_db}->rows;          my $rows = $sth->{file_in_db}->rows;
545          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);
546    
547          $beenThere->{$key}++;          $beenThere->{$key}++;
548    
# Line 391  sub recurseDir($$$$$$$$) { Line 589  sub recurseDir($$$$$$$$) {
589                                  $filesInBackup->{$path_key}->{'size'}                                  $filesInBackup->{$path_key}->{'size'}
590                          ));                          ));
591    
592                            my $found;
593                          if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {                          if (! defined($beenThere->{$key}) && ! ($found = found_in_db($key, @data)) ) {
594                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
595    
596                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
597                                          $new_dirs++;                                          $new_dirs++ unless ($found);
598                                          print STDERR " dir\n" if ($debug >= 2);                                          print STDERR " dir\n" if ($debug >= 2);
599                                  } else {                                  } else {
600                                          $new_files++;                                          $new_files++ unless ($found);
601                                          print STDERR " file\n" if ($debug >= 2);                                          print STDERR " file\n" if ($debug >= 2);
602                                  }                                  }
603                                  $size += $filesInBackup->{$path_key}->{'size'} || 0;                                  $size += $filesInBackup->{$path_key}->{'size'} || 0;

Legend:
Removed from v.66  
changed lines
  Added in v.116

  ViewVC Help
Powered by ViewVC 1.1.26