/[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 67 by dpavlin, Mon Aug 22 08:58:59 2005 UTC revision 89 by dpavlin, Sun Aug 28 17:04:12 2005 UTC
# Line 40  my $beenThere = {}; Line 40  my $beenThere = {};
40    
41  my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";  my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";
42  my $user = $Conf{SearchUser} || '';  my $user = $Conf{SearchUser} || '';
43    my $index_path = $Conf{HyperEstraierIndex};
44    $index_path = $TopDir . '/' . $index_path;
45    $index_path =~ s#//#/#g;
46    
47    
48  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
49    
50  my %opt;  my %opt;
51    
52  if ( !getopts("cdm:v:", \%opt ) ) {  if ( !getopts("cdm:v:i", \%opt ) ) {
53          print STDERR <<EOF;          print STDERR <<EOF;
54  usage: $0 [-c|-d] [-m num] [-v|-v level]  usage: $0 [-c|-d] [-m num] [-v|-v level] [-i]
55    
56  Options:  Options:
57          -c      create database on first use          -c      create database on first use
58          -d      delete database before import          -d      delete database before import
59          -m num  import just num increments for one host          -m num  import just num increments for one host
60          -v num  set verbosity (debug) level (default $debug)          -v num  set verbosity (debug) level (default $debug)
61            -i      update HyperEstraier full text index
62  EOF  EOF
63          exit 1;          exit 1;
64  }  }
65    
66  ###################################create tables############################3  if ($opt{v}) {
67            print "Debug level at $opt{v}\n";
68            $debug = $opt{v};
69    }
70    
71    #---- subs ----
72    
73    sub fmt_time {
74            my $t = shift || return;
75            my $out = "";
76            my ($ss,$mm,$hh) = gmtime($t);
77            $out .= "${hh}h" if ($hh);
78            $out .= sprintf("%02d:%02d", $mm,$ss);
79            return $out;
80    }
81    
82    sub curr_time {
83            return strftime($t_fmt,localtime());
84    }
85    
86    my $hest_db;
87    
88    sub hest_update {
89    
90            my ($host_id, $share_id, $num) = @_;
91    
92            print curr_time," updating HyperEstraier: files";
93    
94            my $t = time();
95    
96            my $where = '';
97            if ($host_id && $share_id && $num) {
98                    $where = qq{
99                    WHERE
100                            hosts.id = ? AND
101                            shares.id = ? AND
102                            files.backupnum = ?
103                    };
104            }
105    
106            my $sth = $dbh->prepare(qq{
107                    SELECT
108                            files.id                        AS fid,
109                            hosts.name                      AS hname,
110                            shares.name                     AS sname,
111                            -- shares.share                 AS sharename,
112                            files.backupnum                 AS backupnum,
113                            -- files.name                   AS filename,
114                            files.path                      AS filepath,
115                            files.date                      AS date,
116                            files.type                      AS filetype,
117                            files.size                      AS size,
118                            files.shareid                   AS shareid,
119                            backups.date                    AS backup_date
120                    FROM files
121                            INNER JOIN shares       ON files.shareID=shares.ID
122                            INNER JOIN hosts        ON hosts.ID = shares.hostID
123                            INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
124                    $where
125            });
126    
127            $sth->execute(@_);
128            my $results = $sth->rows;
129    
130            if ($results == 0) {
131                    print " no files\n";
132                    return;
133            }
134    
135            my $dot = int($results / 15) || 1;
136    
137            print " $results ($dot/#)";
138    
139            sub fmt_date {
140                    my $t = shift || return;
141                    my $iso = BackupPC::Lib::timeStamp($t);
142                    $iso =~ s/\s/T/;
143                    return $iso;
144            }
145    
146            my $max = int($results / $dot);
147    
148            print " index $index_path...";
149            use HyperEstraier;
150            my $db = HyperEstraier::Database->new();
151    
152    #       unless ($hest_db) {
153    #               print " open reader";
154    #               $hest_db = HyperEstraier::Database->new();
155    #
156    #       }
157    
158    
159            $db->open($index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);
160    
161            my $added = 0;
162    
163            while (my $row = $sth->fetchrow_hashref()) {
164    
165                    my $fid = $row->{'fid'} || die "no fid?";
166                    my $uri = 'file:///' . $fid;
167    
168                    next if ($db->uri_to_id($uri));
169    
170                    # create a document object
171                    my $doc = HyperEstraier::Document->new;
172    
173                    # add attributes to the document object
174                    $doc->add_attr('@uri', $uri);
175    
176                    foreach my $c (@{ $sth->{NAME} }) {
177                            $doc->add_attr($c, $row->{$c}) if ($row->{$c});
178                    }
179    
180                    #$doc->add_attr('@cdate', fmt_date($row->{'date'}));
181    
182                    # add the body text to the document object
183                    my $path = $row->{'filepath'};
184                    $doc->add_text($path);
185                    $path =~ s/(.)/$1 /g;
186                    $doc->add_hidden_text($path);
187    
188                    print STDERR $doc->dump_draft,"\n" if ($debug > 1);
189    
190                    # register the document object to the database
191                    $db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);
192    
193                    $added++;
194                    if ($added % $dot == 0) {
195                            print "$max ";
196                            $max--;
197                    }
198    
199            }
200    
201            print "sync $added new files";
202            $db->sync();
203            print " close";
204            $db->close();
205    
206            my $dur = (time() - $t) || 1;
207            printf(" [%.2f/s new %.2f/s dur: %s]\n",
208                    ( $results / $dur ),
209                    ( $added / $dur ),
210                    fmt_time($dur)
211            );
212    }
213    
214    #---- /subs ----
215    
216    
217    ## update index ##
218    if ($opt{i} || ($index_path && ! -e $index_path)) {
219            # update all
220            print "force update of HyperEstraier index ";
221            print "importing existing data" unless (-e $index_path);
222            print "by -i flag" if ($opt{i});
223            print "\n";
224            hest_update();
225    }
226    
227    ## create tables ##
228  if ($opt{c}) {  if ($opt{c}) {
229          sub do_index {          sub do_index {
230                  my $index = shift || return;                  my $index = shift || return;
# Line 149  if ($opt{c}) { Line 314  if ($opt{c}) {
314    
315  }  }
316    
317    ## delete data before inseting ##
318  if ($opt{d}) {  if ($opt{d}) {
319          print "deleting ";          print "deleting ";
320          foreach my $table (qw(files dvds backups shares hosts)) {          foreach my $table (qw(files dvds backups shares hosts)) {
# Line 160  if ($opt{d}) { Line 326  if ($opt{d}) {
326          $dbh->commit;          $dbh->commit;
327  }  }
328    
329  if ($opt{v}) {  ## insert new values ##
         print "Debug level at $opt{v}\n";  
         $debug = $opt{v};  
 }  
   
 #################################INSERT VALUES#############################  
330    
331  # get hosts  # get hosts
332  $hosts = $bpc->HostInfoRead();  $hosts = $bpc->HostInfoRead();
# Line 199  INSERT INTO files Line 360  INSERT INTO files
360          VALUES (?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
361  });  });
362    
 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;  
 }  
   
363  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
364    
365          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 263  foreach my $host_key (keys %{$hosts}) { Line 415  foreach my $host_key (keys %{$hosts}) {
415                          next if ($count > 0);                          next if ($count > 0);
416    
417                          # dump some log                          # dump some log
418                          print strftime($t_fmt,localtime())," ", $share;                          print curr_time," ", $share;
419    
420                          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);
421    
# Line 286  foreach my $host_key (keys %{$hosts}) { Line 438  foreach my $host_key (keys %{$hosts}) {
438                                  ( ($f+$d) / $dur ),                                  ( ($f+$d) / $dur ),
439                                  fmt_time($dur)                                  fmt_time($dur)
440                          );                          );
441    
442                            hest_update($hostID, $shareID, $backupNum);
443                  }                  }
444    
445          }          }
# Line 330  sub found_in_db { Line 484  sub found_in_db {
484          my @data = @_;          my @data = @_;
485          shift @data;          shift @data;
486    
487          my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my ($key, $shareID,undef,$name,$path,$date,undef,$size) = @_;
488    
489          return $beenThere->{$key} if (defined($beenThere->{$key}));          return $beenThere->{$key} if (defined($beenThere->{$key}));
490    
# Line 340  sub found_in_db { Line 494  sub found_in_db {
494                          path = ? and                          path = ? and
495                          date = ? and                          date = ? and
496                          size = ?                          size = ?
497                    LIMIT 1
498          });          });
499    
500          my @param = ($shareID,$path,$date,$size);          my @param = ($shareID,$path,$date,$size);
501          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
502          my $rows = $sth->{file_in_db}->rows;          my $rows = $sth->{file_in_db}->rows;
503          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);
504    
505          $beenThere->{$key}++;          $beenThere->{$key}++;
506    
# Line 392  sub recurseDir($$$$$$$$) { Line 547  sub recurseDir($$$$$$$$) {
547                                  $filesInBackup->{$path_key}->{'size'}                                  $filesInBackup->{$path_key}->{'size'}
548                          ));                          ));
549    
550                            my $found;
551                          if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {                          if (! defined($beenThere->{$key}) && ! ($found = found_in_db($key, @data)) ) {
552                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
553    
554                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
555                                          $new_dirs++;                                          $new_dirs++ unless ($found);
556                                          print STDERR " dir\n" if ($debug >= 2);                                          print STDERR " dir\n" if ($debug >= 2);
557                                  } else {                                  } else {
558                                          $new_files++;                                          $new_files++ unless ($found);
559                                          print STDERR " file\n" if ($debug >= 2);                                          print STDERR " file\n" if ($debug >= 2);
560                                  }                                  }
561                                  $size += $filesInBackup->{$path_key}->{'size'} || 0;                                  $size += $filesInBackup->{$path_key}->{'size'} || 0;

Legend:
Removed from v.67  
changed lines
  Added in v.89

  ViewVC Help
Powered by ViewVC 1.1.26