/[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 98 by dpavlin, Tue Aug 30 14:19:54 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 => 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    if ($index_path) {
48            use HyperEstraier;
49    }
50    
51    
52  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
53    
54  my %opt;  my %opt;
55    
56  if ( !getopts("cdm:v:", \%opt ) ) {  if ( !getopts("cdm:v:i", \%opt ) ) {
57          print STDERR <<EOF;          print STDERR <<EOF;
58  usage: $0 [-c|-d] [-m num] [-v|-v level]  usage: $0 [-c|-d] [-m num] [-v|-v level] [-i]
59    
60  Options:  Options:
61          -c      create database on first use          -c      create database on first use
62          -d      delete database before import          -d      delete database before import
63          -m num  import just num increments for one host          -m num  import just num increments for one host
64          -v num  set verbosity (debug) level (default $debug)          -v num  set verbosity (debug) level (default $debug)
65            -i      update HyperEstraier full text index
66  EOF  EOF
67          exit 1;          exit 1;
68  }  }
69    
70  ###################################create tables############################3  if ($opt{v}) {
71            print "Debug level at $opt{v}\n";
72            $debug = $opt{v};
73    }
74    
75    #---- subs ----
76    
77    sub fmt_time {
78            my $t = shift || return;
79            my $out = "";
80            my ($ss,$mm,$hh) = gmtime($t);
81            $out .= "${hh}h" if ($hh);
82            $out .= sprintf("%02d:%02d", $mm,$ss);
83            return $out;
84    }
85    
86    sub curr_time {
87            return strftime($t_fmt,localtime());
88    }
89    
90    my $hest_db;
91    
92    sub signal {
93            my($sig) = @_;
94            if ($hest_db) {
95                    print "\nCaught a SIG$sig--syncing database and shutting down\n";
96                    $hest_db->sync();
97                    $hest_db->close();
98            }
99            exit(0);
100    }
101    
102    $SIG{'INT'}  = \&signal;
103    $SIG{'QUIT'} = \&signal;
104    
105    sub hest_update {
106    
107            my ($host_id, $share_id, $num) = @_;
108    
109            print curr_time," updating HyperEstraier:";
110    
111            my $t = time();
112    
113            my $offset = 0;
114            my $added = 0;
115    
116            print " opening index $index_path";
117            $hest_db = HyperEstraier::Database->new();
118            $hest_db->open($index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);
119    
120            my $results = 0;
121    
122            do {
123    
124                    my $where = '';
125                    if ($host_id && $share_id && $num) {
126                            $where = qq{
127                            WHERE
128                                    hosts.id = ? AND
129                                    shares.id = ? AND
130                                    files.backupnum = ?
131                            };
132                    }
133    
134                    my $limit = sprintf('LIMIT '.EST_CHUNK.' OFFSET %d', $offset);
135    
136                    my $sth = $dbh->prepare(qq{
137                            SELECT
138                                    files.id                        AS fid,
139                                    hosts.name                      AS hname,
140                                    shares.name                     AS sname,
141                                    -- shares.share                 AS sharename,
142                                    files.backupnum                 AS backupnum,
143                                    -- files.name                   AS filename,
144                                    files.path                      AS filepath,
145                                    files.date                      AS date,
146                                    files.type                      AS type,
147                                    files.size                      AS size,
148                                    files.shareid                   AS shareid,
149                                    backups.date                    AS backup_date
150                            FROM files
151                                    INNER JOIN shares       ON files.shareID=shares.ID
152                                    INNER JOIN hosts        ON hosts.ID = shares.hostID
153                                    INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
154                            $where
155                            $limit
156                    });
157    
158                    $sth->execute(@_);
159                    $results = $sth->rows;
160    
161                    if ($results == 0) {
162                            print " - no more files\n";
163                            last;
164                    }
165    
166                    sub fmt_date {
167                            my $t = shift || return;
168                            my $iso = BackupPC::Lib::timeStamp($t);
169                            $iso =~ s/\s/T/;
170                            return $iso;
171                    }
172    
173                    while (my $row = $sth->fetchrow_hashref()) {
174    
175                            my $fid = $row->{'fid'} || die "no fid?";
176                            my $uri = 'file:///' . $fid;
177    
178                            my $id = $hest_db->uri_to_id($uri);
179                            next unless ($id == -1);
180    
181                            # create a document object
182                            my $doc = HyperEstraier::Document->new;
183    
184                            # add attributes to the document object
185                            $doc->add_attr('@uri', $uri);
186    
187                            foreach my $c (@{ $sth->{NAME} }) {
188                                    $doc->add_attr($c, $row->{$c}) if ($row->{$c});
189                            }
190    
191                            #$doc->add_attr('@cdate', fmt_date($row->{'date'}));
192    
193                            # add the body text to the document object
194                            my $path = $row->{'filepath'};
195                            $doc->add_text($path);
196                            $path =~ s/(.)/$1 /g;
197                            $doc->add_hidden_text($path);
198    
199                            print STDERR $doc->dump_draft,"\n" if ($debug > 1);
200    
201                            # register the document object to the database
202                            $hest_db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);
203                            $added++;
204                    }
205    
206                    print " $added";
207                    $hest_db->sync();
208    
209                    $offset += EST_CHUNK;
210    
211            } while ($results == EST_CHUNK);
212    
213            print ", close";
214            $hest_db->close();
215    
216            my $dur = (time() - $t) || 1;
217            printf(" [%.2f/s dur: %s]\n",
218                    ( $added / $dur ),
219                    fmt_time($dur)
220            );
221    }
222    
223    #---- /subs ----
224    
225    
226    ## update index ##
227    if (($opt{i} || ($index_path && ! -e $index_path)) && !$opt{c}) {
228            # update all
229            print "force update of HyperEstraier index ";
230            print "importing existing data" unless (-e $index_path);
231            print "by -i flag" if ($opt{i});
232            print "\n";
233            hest_update();
234    }
235    
236    ## create tables ##
237  if ($opt{c}) {  if ($opt{c}) {
238          sub do_index {          sub do_index {
239                  my $index = shift || return;                  my $index = shift || return;
# Line 149  if ($opt{c}) { Line 323  if ($opt{c}) {
323    
324  }  }
325    
326    ## delete data before inseting ##
327  if ($opt{d}) {  if ($opt{d}) {
328          print "deleting ";          print "deleting ";
329          foreach my $table (qw(files dvds backups shares hosts)) {          foreach my $table (qw(files dvds backups shares hosts)) {
# Line 160  if ($opt{d}) { Line 335  if ($opt{d}) {
335          $dbh->commit;          $dbh->commit;
336  }  }
337    
338  if ($opt{v}) {  ## insert new values ##
         print "Debug level at $opt{v}\n";  
         $debug = $opt{v};  
 }  
   
 #################################INSERT VALUES#############################  
339    
340  # get hosts  # get hosts
341  $hosts = $bpc->HostInfoRead();  $hosts = $bpc->HostInfoRead();
# Line 199  INSERT INTO files Line 369  INSERT INTO files
369          VALUES (?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
370  });  });
371    
 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;  
 }  
   
372  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
373    
374          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 424  foreach my $host_key (keys %{$hosts}) {
424                          next if ($count > 0);                          next if ($count > 0);
425    
426                          # dump some log                          # dump some log
427                          print strftime($t_fmt,localtime())," ", $share;                          print curr_time," ", $share;
428    
429                          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);
430    
# Line 286  foreach my $host_key (keys %{$hosts}) { Line 447  foreach my $host_key (keys %{$hosts}) {
447                                  ( ($f+$d) / $dur ),                                  ( ($f+$d) / $dur ),
448                                  fmt_time($dur)                                  fmt_time($dur)
449                          );                          );
450    
451                            hest_update($hostID, $shareID, $backupNum);
452                  }                  }
453    
454          }          }
# Line 330  sub found_in_db { Line 493  sub found_in_db {
493          my @data = @_;          my @data = @_;
494          shift @data;          shift @data;
495    
496          my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my ($key, $shareID,undef,$name,$path,$date,undef,$size) = @_;
497    
498          return $beenThere->{$key} if (defined($beenThere->{$key}));          return $beenThere->{$key} if (defined($beenThere->{$key}));
499    
# Line 340  sub found_in_db { Line 503  sub found_in_db {
503                          path = ? and                          path = ? and
504                          date = ? and                          date = ? and
505                          size = ?                          size = ?
506                    LIMIT 1
507          });          });
508    
509          my @param = ($shareID,$path,$date,$size);          my @param = ($shareID,$path,$date,$size);
510          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
511          my $rows = $sth->{file_in_db}->rows;          my $rows = $sth->{file_in_db}->rows;
512          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);
513    
514          $beenThere->{$key}++;          $beenThere->{$key}++;
515    
# Line 392  sub recurseDir($$$$$$$$) { Line 556  sub recurseDir($$$$$$$$) {
556                                  $filesInBackup->{$path_key}->{'size'}                                  $filesInBackup->{$path_key}->{'size'}
557                          ));                          ));
558    
559                            my $found;
560                          if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {                          if (! defined($beenThere->{$key}) && ! ($found = found_in_db($key, @data)) ) {
561                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
562    
563                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
564                                          $new_dirs++;                                          $new_dirs++ unless ($found);
565                                          print STDERR " dir\n" if ($debug >= 2);                                          print STDERR " dir\n" if ($debug >= 2);
566                                  } else {                                  } else {
567                                          $new_files++;                                          $new_files++ unless ($found);
568                                          print STDERR " file\n" if ($debug >= 2);                                          print STDERR " file\n" if ($debug >= 2);
569                                  }                                  }
570                                  $size += $filesInBackup->{$path_key}->{'size'} || 0;                                  $size += $filesInBackup->{$path_key}->{'size'} || 0;

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

  ViewVC Help
Powered by ViewVC 1.1.26