/[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 86 by dpavlin, Sun Aug 28 12:35:59 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 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    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    
# Line 80  sub curr_time { Line 83  sub curr_time {
83          return strftime($t_fmt,localtime());          return strftime($t_fmt,localtime());
84  }  }
85    
86  #---- /subs ----  my $hest_db;
87    my $hest_node;
88    
89  ## update index ##  sub signal {
90  if ($opt{i}) {          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          print curr_time," updating HyperEstraier: files";  $SIG{'INT'}  = \&signal;
100    $SIG{'QUIT'} = \&signal;
101    
102          my $t = time();  sub hest_update {
           
         my $sth = $dbh->prepare(qq{  
                 SELECT  
                         files.id                        AS fid,  
                         hosts.name                      AS hname,  
                         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,  
                         backups.date                    AS backup_date  
                 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  
         });  
103    
104          $sth->execute();          my ($host_id, $share_id, $num) = @_;
         my $results = $sth->rows;  
105    
106          my $dot = int($results / 15);          unless ($use_hest) {
107                    print STDERR "HyperEstraier support not enabled in configuration\n";
108                    return;
109            }
110    
111          print " $results ($dot/#)";          print curr_time," updating HyperEstraier:";
112    
113          sub fmt_date {          my $t = time();
                 my $t = shift || return;  
                 my $iso = BackupPC::Lib::timeStamp($t);  
                 $iso =~ s/\s/T/;  
                 return $iso;  
         }  
114    
115          my $i = 0;          my $offset = 0;
116          my $max = int($results / $dot);          my $added = 0;
117    
118          $index_path = $TopDir . '/' . $index_path;          print " opening index $use_hest";
119          $index_path =~ s#//#/#g;          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          print " index $index_path...";          my $results = 0;
         use HyperEstraier;  
         my $db = HyperEstraier::Database->new();  
         $db->open($index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);  
133    
134            do {
135    
136          while (my $row = $sth->fetchrow_hashref()) {                  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                  # create a document object                  my $limit = sprintf('LIMIT '.EST_CHUNK.' OFFSET %d', $offset);
                 my $doc = HyperEstraier::Document->new;  
149    
150                  # add attributes to the document object                  my $sth = $dbh->prepare(qq{
151                  $doc->add_attr('@uri', 'file:///' . $row->{'fid'});                          SELECT
152                                    files.id                        AS fid,
153                                    hosts.name                      AS hname,
154                                    shares.name                     AS sname,
155                                    -- shares.share                 AS sharename,
156                                    files.backupnum                 AS backupnum,
157                                    -- files.name                   AS filename,
158                                    files.path                      AS filepath,
159                                    files.date                      AS date,
160                                    files.type                      AS type,
161                                    files.size                      AS size,
162                                    files.shareid                   AS shareid,
163                                    backups.date                    AS backup_date
164                            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                  foreach my $c (@{ $sth->{NAME} }) {                  sub fmt_date {
181                          $doc->add_attr($c, $row->{$c}) if ($row->{$c});                          my $t = shift || return;
182                            my $iso = BackupPC::Lib::timeStamp($t);
183                            $iso =~ s/\s/T/;
184                            return $iso;
185                  }                  }
186    
187                  #$doc->add_attr('@cdate', fmt_date($row->{'date'}));                  while (my $row = $sth->fetchrow_hashref()) {
188    
189                  # add the body text to the document object                          my $fid = $row->{'fid'} || die "no fid?";
190                  my $path = $row->{'filepath'};                          my $uri = 'file:///' . $fid;
191                  $doc->add_text($path);  
192                  $path =~ s/(.)/$1 /g;                          my $id = ($hest_db || $hest_node)->uri_to_id($uri);
193                  $doc->add_hidden_text($path);                          next unless ($id == -1);
194    
195                  print STDERR $doc->dump_draft,"\n" if ($debug > 1);                          # create a document object
196                            my $doc = HyperEstraier::Document->new;
197                  # register the document object to the database  
198                  $db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);                          # add attributes to the document object
199                            $doc->add_attr('@uri', $uri);
200                  $i++;  
201                  if ($i % $dot == 0) {                          foreach my $c (@{ $sth->{NAME} }) {
202                          print "$max ";                                  $doc->add_attr($c, $row->{$c}) if ($row->{$c});
203                          $max--;                          }
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          print "sync";          } while ($results == EST_CHUNK);
232          $db->sync();  
233          print " close";          if ($index_path) {
234          $db->close();                  print ", close";
235                    $hest_db->close();
236            }
237    
238          my $dur = (time() - $t) || 1;          my $dur = (time() - $t) || 1;
239          printf(" [%.2f/s dur: %s]\n",          printf(" [%.2f/s dur: %s]\n",
240                  ( $results / $dur ),                  ( $added / $dur ),
241                  fmt_time($dur)                  fmt_time($dur)
242          );          );
   
         exit;  
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 273  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 284  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 396  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.86  
changed lines
  Added in v.117

  ViewVC Help
Powered by ViewVC 1.1.26