/[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 81 by dpavlin, Sun Aug 28 08:40:06 2005 UTC revision 117 by dpavlin, Sun Sep 11 13:05:06 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) = getHyperEstraier_url($use_hest);
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;
# Line 64  if ($opt{v}) { Line 68  if ($opt{v}) {
68          $debug = $opt{v};          $debug = $opt{v};
69  }  }
70    
71  ## update index ##  #---- subs ----
72  if ($opt{i}) {  
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          my $index_dir = '/var/tmp/casket';  sub curr_time {
83            return strftime($t_fmt,localtime());
84    }
85    
86          print "updating HyperEstraier index $index_dir...";  my $hest_db;
87    my $hest_node;
88    
89          use HyperEstraier;  sub signal {
90          my $db = HyperEstraier::Database->new();          my($sig) = @_;
91          $db->open($index_dir, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);          if ($hest_db) {
92                    print "\nCaught a SIG$sig--syncing database and shutting down\n";
93          my $sth = $dbh->prepare(qq{                  $hest_db->sync();
94                  SELECT                  $hest_db->close();
95                          files.id                        AS fid,          }
96                          hosts.name                      AS hname,          exit(0);
97                          shares.name                     AS sname,  }
                         shares.share                    AS sharename,  
                         files.backupNum                 AS backupNum,  
                         files.name                      AS filename,  
                         files.path                      AS filepath,  
                         files.date                      AS date,  
                         files.type                      AS filetype,  
                         files.size                      AS size,  
                         files.shareid                   AS shareid  
                 FROM files  
                         INNER JOIN shares       ON files.shareID=shares.ID  
                         INNER JOIN hosts        ON hosts.ID = shares.hostID  
                         INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID  
         });  
98    
99          $sth->execute();  $SIG{'INT'}  = \&signal;
100    $SIG{'QUIT'} = \&signal;
101    
102          my $dot = int($sth->rows / 15);  sub hest_update {
103    
104          print $sth->rows, " files ($dot/#) ";          my ($host_id, $share_id, $num) = @_;
105    
106          sub fmt_date {          unless ($use_hest) {
107                  my $t = shift || return;                  print STDERR "HyperEstraier support not enabled in configuration\n";
108                  my $iso = BackupPC::Lib::timeStamp($t);                  return;
                 $iso =~ s/\s/T/;  
                 return $iso;  
109          }          }
110    
111          my $i = 0;          print curr_time," updating HyperEstraier:";
112          my $max = int($sth->rows / $dot);  
113            my $t = time();
114    
115          while (my $row = $sth->fetchrow_hashref()) {          my $offset = 0;
116            my $added = 0;
117    
118                  # create a document object          print " opening index $use_hest";
119                  my $doc = HyperEstraier::Document->new;          if ($index_path) {
120                    $hest_db = HyperEstraier::Database->new();
121                    $hest_db->open($index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);
122                    print " directly";
123            } elsif ($index_node_url) {
124                    $hest_node ||= HyperEstraier::Node->new($index_node_url);
125                    $hest_node->set_auth('admin', 'admin');
126                    print " via node URL";
127            } else {
128                    die "don't know how to use HyperEstraier Index $use_hest";
129            }
130            print " increment is " . EST_CHUNK . " files:";
131    
132                  # add attributes to the document object          my $results = 0;
                 $doc->add_attr('@uri', 'file:///' . $row->{'fid'});  
133    
134                  foreach my $c (qw/fid hname sname sharename backupNum filename filepath shareid/) {          do {
135                          $doc->add_attr($c, $row->{$c}) if ($row->{$c});  
136                    my $where = '';
137                    my @data;
138                    if ($host_id && $share_id && $num) {
139                            $where = qq{
140                            WHERE
141                                    hosts.id = ? AND
142                                    shares.id = ? AND
143                                    files.backupnum = ?
144                            };
145                            @data = ( $host_id, $share_id, $num );
146                  }                  }
147    
148                  $doc->add_attr('date', fmt_date($row->{'date'}));                  my $limit = sprintf('LIMIT '.EST_CHUNK.' OFFSET %d', $offset);
149    
150                  # add the body text to the document object                  my $sth = $dbh->prepare(qq{
151                  my $path = $row->{'filepath'};                          SELECT
152                  $doc->add_text($path);                                  files.id                        AS fid,
153                  $path =~ s/(.)/$1 /g;                                  hosts.name                      AS hname,
154                  $doc->add_hidden_text($path);                                  shares.name                     AS sname,
155                                    -- shares.share                 AS sharename,
156                  print STDERR $doc->dump_draft,"\n" if ($debug > 1);                                  files.backupnum                 AS backupnum,
157                                    -- files.name                   AS filename,
158                  # register the document object to the database                                  files.path                      AS filepath,
159                  $db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);                                  files.date                      AS date,
160                                    files.type                      AS type,
161                  $i++;                                  files.size                      AS size,
162                  if ($i % $dot == 0) {                                  files.shareid                   AS shareid,
163                          print "$max ";                                  backups.date                    AS backup_date
164                          $max--;                          FROM files
165                                    INNER JOIN shares       ON files.shareID=shares.ID
166                                    INNER JOIN hosts        ON hosts.ID = shares.hostID
167                                    INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
168                            $where
169                            $limit
170                    });
171    
172                    $sth->execute(@data);
173                    $results = $sth->rows;
174    
175                    if ($results == 0) {
176                            print " - no new files\n";
177                            last;
178                  }                  }
179    
180          }                  sub fmt_date {
181                            my $t = shift || return;
182                            my $iso = BackupPC::Lib::timeStamp($t);
183                            $iso =~ s/\s/T/;
184                            return $iso;
185                    }
186    
187                    while (my $row = $sth->fetchrow_hashref()) {
188    
189                            my $fid = $row->{'fid'} || die "no fid?";
190                            my $uri = 'file:///' . $fid;
191    
192          print "sync";                          my $id = ($hest_db || $hest_node)->uri_to_id($uri);
193          $db->sync();                          next unless ($id == -1);
         print " close\n";  
         $db->close();  
194    
195          exit;                          # create a document object
196                            my $doc = HyperEstraier::Document->new;
197    
198                            # add attributes to the document object
199                            $doc->add_attr('@uri', $uri);
200    
201                            foreach my $c (@{ $sth->{NAME} }) {
202                                    $doc->add_attr($c, $row->{$c}) if ($row->{$c});
203                            }
204    
205                            #$doc->add_attr('@cdate', fmt_date($row->{'date'}));
206    
207                            # add the body text to the document object
208                            my $path = $row->{'filepath'};
209                            $doc->add_text($path);
210                            $path =~ s/(.)/$1 /g;
211                            $doc->add_hidden_text($path);
212    
213                            print STDERR $doc->dump_draft,"\n" if ($debug > 1);
214    
215                            # register the document object to the database
216                            if ($hest_db) {
217                                    $hest_db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);
218                            } elsif ($hest_node) {
219                                    $hest_node->put_doc($doc);
220                            } else {
221                                    die "not supported";
222                            }
223                            $added++;
224                    }
225    
226                    print " $added";
227                    $hest_db->sync() if ($index_path);
228    
229                    $offset += EST_CHUNK;
230    
231            } while ($results == EST_CHUNK);
232    
233            if ($index_path) {
234                    print ", close";
235                    $hest_db->close();
236            }
237    
238            my $dur = (time() - $t) || 1;
239            printf(" [%.2f/s dur: %s]\n",
240                    ( $added / $dur ),
241                    fmt_time($dur)
242            );
243  }  }
244    
245  ###################################create tables############################3  #---- /subs ----
246    
247    
248    ## update index ##
249    if (($opt{i} || ($index_path && ! -e $index_path)) && !$opt{c}) {
250            # update all
251            print "force update of HyperEstraier index ";
252            print "importing existing data" unless (-e $index_path);
253            print "by -i flag" if ($opt{i});
254            print "\n";
255            hest_update();
256    }
257    
258    ## create tables ##
259  if ($opt{c}) {  if ($opt{c}) {
260          sub do_index {          sub do_index {
261                  my $index = shift || return;                  my $index = shift || return;
# Line 242  if ($opt{c}) { Line 345  if ($opt{c}) {
345    
346  }  }
347    
348    ## delete data before inseting ##
349  if ($opt{d}) {  if ($opt{d}) {
350          print "deleting ";          print "deleting ";
351          foreach my $table (qw(files dvds backups shares hosts)) {          foreach my $table (qw(files dvds backups shares hosts)) {
# Line 253  if ($opt{d}) { Line 357  if ($opt{d}) {
357          $dbh->commit;          $dbh->commit;
358  }  }
359    
360  #################################INSERT VALUES#############################  ## insert new values ##
361    
362  # get hosts  # get hosts
363  $hosts = $bpc->HostInfoRead();  $hosts = $bpc->HostInfoRead();
# Line 287  INSERT INTO files Line 391  INSERT INTO files
391          VALUES (?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
392  });  });
393    
 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;  
 }  
   
394  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
395    
396          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 351  foreach my $host_key (keys %{$hosts}) { Line 446  foreach my $host_key (keys %{$hosts}) {
446                          next if ($count > 0);                          next if ($count > 0);
447    
448                          # dump some log                          # dump some log
449                          print strftime($t_fmt,localtime())," ", $share;                          print curr_time," ", $share;
450    
451                          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);
452    
# Line 374  foreach my $host_key (keys %{$hosts}) { Line 469  foreach my $host_key (keys %{$hosts}) {
469                                  ( ($f+$d) / $dur ),                                  ( ($f+$d) / $dur ),
470                                  fmt_time($dur)                                  fmt_time($dur)
471                          );                          );
472    
473                            hest_update($hostID, $shareID, $backupNum) if ($nf + $nd > 0);
474                  }                  }
475    
476          }          }

Legend:
Removed from v.81  
changed lines
  Added in v.117

  ViewVC Help
Powered by ViewVC 1.1.26