/[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 130 by dpavlin, Fri Sep 23 08:54:10 2005 UTC
# Line 11  use Getopt::Std; Line 11  use Getopt::Std;
11  use Time::HiRes qw/time/;  use Time::HiRes qw/time/;
12  use File::Pid;  use File::Pid;
13  use POSIX qw/strftime/;  use POSIX qw/strftime/;
14    use BackupPC::SearchLib;
15    
16  use constant BPC_FTYPE_DIR => 5;  use constant BPC_FTYPE_DIR => 5;
17    use constant EST_CHUNK => 100000;
18    
19  my $debug = 0;  my $debug = 0;
20  $|=1;  $|=1;
# Line 40  my $beenThere = {}; Line 42  my $beenThere = {};
42    
43  my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";  my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";
44  my $user = $Conf{SearchUser} || '';  my $user = $Conf{SearchUser} || '';
45  my $index_path = $Conf{HyperEstraierIndex};  
46    my $use_hest = $Conf{HyperEstraierIndex};
47    my ($index_path, $index_node_url) = BackupPC::SearchLib::getHyperEstraier_url($use_hest);
48    
49  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });  my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
50    
# Line 80  sub curr_time { Line 84  sub curr_time {
84          return strftime($t_fmt,localtime());          return strftime($t_fmt,localtime());
85  }  }
86    
87  #---- /subs ----  my $hest_db;
88    my $hest_node;
89    
90  ## update index ##  sub signal {
91  if ($opt{i}) {          my($sig) = @_;
92            if ($hest_db) {
93                    print "\nCaught a SIG$sig--syncing database and shutting down\n";
94                    $hest_db->sync();
95                    $hest_db->close();
96            }
97            exit(0);
98    }
99    
100          print curr_time," updating HyperEstraier: files";  $SIG{'INT'}  = \&signal;
101    $SIG{'QUIT'} = \&signal;
102    
103          my $t = time();  sub hest_update {
104            
105          my $sth = $dbh->prepare(qq{          my ($host_id, $share_id, $num) = @_;
106                  SELECT  
107                          files.id                        AS fid,          unless ($use_hest) {
108                          hosts.name                      AS hname,                  print STDERR "HyperEstraier support not enabled in configuration\n";
109                          shares.name                     AS sname,                  return;
                         -- 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  
         });  
   
         $sth->execute();  
         my $results = $sth->rows;  
   
         my $dot = int($results / 15);  
   
         print " $results ($dot/#)";  
   
         sub fmt_date {  
                 my $t = shift || return;  
                 my $iso = BackupPC::Lib::timeStamp($t);  
                 $iso =~ s/\s/T/;  
                 return $iso;  
110          }          }
111    
112          my $i = 0;          print curr_time," updating HyperEstraier:";
         my $max = int($results / $dot);  
113    
114          $index_path = $TopDir . '/' . $index_path;          my $t = time();
         $index_path =~ s#//#/#g;  
115    
116          print " index $index_path...";          my $offset = 0;
117          use HyperEstraier;          my $added = 0;
         my $db = HyperEstraier::Database->new();  
         $db->open($index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);  
118    
119            print " opening index $use_hest";
120            if ($index_path) {
121                    $hest_db = HyperEstraier::Database->new();
122                    $hest_db->open($TopDir . $index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);
123                    print " directly";
124            } elsif ($index_node_url) {
125                    $hest_node ||= HyperEstraier::Node->new($index_node_url);
126                    $hest_node->set_auth('admin', 'admin');
127                    print " via node URL";
128            } else {
129                    die "don't know how to use HyperEstraier Index $use_hest";
130            }
131            print " increment is " . EST_CHUNK . " files:";
132    
133          while (my $row = $sth->fetchrow_hashref()) {          my $results = 0;
134    
135                  # create a document object          do {
                 my $doc = HyperEstraier::Document->new;  
136    
137                  # add attributes to the document object                  my $where = '';
138                  $doc->add_attr('@uri', 'file:///' . $row->{'fid'});                  my @data;
139                    if ($host_id && $share_id && $num) {
140                            $where = qq{
141                            WHERE
142                                    hosts.id = ? AND
143                                    shares.id = ? AND
144                                    files.backupnum = ?
145                            };
146                            @data = ( $host_id, $share_id, $num );
147                    }
148    
149                  foreach my $c (@{ $sth->{NAME} }) {                  my $limit = sprintf('LIMIT '.EST_CHUNK.' OFFSET %d', $offset);
150                          $doc->add_attr($c, $row->{$c}) if ($row->{$c});  
151                    my $sth = $dbh->prepare(qq{
152                            SELECT
153                                    files.id                        AS fid,
154                                    hosts.name                      AS hname,
155                                    shares.name                     AS sname,
156                                    -- shares.share                 AS sharename,
157                                    files.backupnum                 AS backupnum,
158                                    -- files.name                   AS filename,
159                                    files.path                      AS filepath,
160                                    files.date                      AS date,
161                                    files.type                      AS type,
162                                    files.size                      AS size,
163                                    files.shareid                   AS shareid,
164                                    backups.date                    AS backup_date
165                            FROM files
166                                    INNER JOIN shares       ON files.shareID=shares.ID
167                                    INNER JOIN hosts        ON hosts.ID = shares.hostID
168                                    INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
169                            $where
170                            $limit
171                    });
172    
173                    $sth->execute(@data);
174                    $results = $sth->rows;
175    
176                    if ($results == 0) {
177                            print " - no new files\n";
178                            last;
179                  }                  }
180    
181                  #$doc->add_attr('@cdate', fmt_date($row->{'date'}));                  sub fmt_date {
182                            my $t = shift || return;
183                            my $iso = BackupPC::Lib::timeStamp($t);
184                            $iso =~ s/\s/T/;
185                            return $iso;
186                    }
187    
188                  # add the body text to the document object                  while (my $row = $sth->fetchrow_hashref()) {
189                  my $path = $row->{'filepath'};  
190                  $doc->add_text($path);                          my $fid = $row->{'fid'} || die "no fid?";
191                  $path =~ s/(.)/$1 /g;                          my $uri = 'file:///' . $fid;
192                  $doc->add_hidden_text($path);  
193                            my $id = ($hest_db || $hest_node)->uri_to_id($uri);
194                  print STDERR $doc->dump_draft,"\n" if ($debug > 1);                          next unless ($id == -1);
195    
196                  # register the document object to the database                          # create a document object
197                  $db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);                          my $doc = HyperEstraier::Document->new;
198    
199                  $i++;                          # add attributes to the document object
200                  if ($i % $dot == 0) {                          $doc->add_attr('@uri', $uri);
201                          print "$max ";  
202                          $max--;                          foreach my $c (@{ $sth->{NAME} }) {
203                                    $doc->add_attr($c, $row->{$c}) if ($row->{$c});
204                            }
205    
206                            #$doc->add_attr('@cdate', fmt_date($row->{'date'}));
207    
208                            # add the body text to the document object
209                            my $path = $row->{'filepath'};
210                            $doc->add_text($path);
211                            $path =~ s/(.)/$1 /g;
212                            $doc->add_hidden_text($path);
213    
214                            print STDERR $doc->dump_draft,"\n" if ($debug > 1);
215    
216                            # register the document object to the database
217                            if ($hest_db) {
218                                    $hest_db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);
219                            } elsif ($hest_node) {
220                                    $hest_node->put_doc($doc);
221                            } else {
222                                    die "not supported";
223                            }
224                            $added++;
225                  }                  }
226    
227          }                  print " $added";
228                    $hest_db->sync() if ($index_path);
229    
230          print "sync";                  $offset += EST_CHUNK;
231          $db->sync();  
232          print " close";          } while ($results == EST_CHUNK);
233          $db->close();  
234            if ($index_path) {
235                    print ", close";
236                    $hest_db->close();
237            }
238    
239          my $dur = (time() - $t) || 1;          my $dur = (time() - $t) || 1;
240          printf(" [%.2f/s dur: %s]\n",          printf(" [%.2f/s dur: %s]\n",
241                  ( $results / $dur ),                  ( $added / $dur ),
242                  fmt_time($dur)                  fmt_time($dur)
243          );          );
   
         exit;  
244  }  }
245    
246  ###################################create tables############################3  #---- /subs ----
247    
248    
249    ## update index ##
250    if (($opt{i} || ($index_path && ! -e $index_path)) && !$opt{c}) {
251            # update all
252            print "force update of HyperEstraier index ";
253            print "importing existing data" unless (-e $index_path);
254            print "by -i flag" if ($opt{i});
255            print "\n";
256            hest_update();
257    }
258    
259    ## create tables ##
260  if ($opt{c}) {  if ($opt{c}) {
261          sub do_index {          sub do_index {
262                  my $index = shift || return;                  my $index = shift || return;
# Line 212  if ($opt{c}) { Line 285  if ($opt{c}) {
285                          localpath VARCHAR(200)                                localpath VARCHAR(200)      
286                  );                              );            
287          });          });
288    
289            $dbh->do(qq{
290                    create table dvds (
291                            ID      SERIAL          PRIMARY KEY,
292                            num     INTEGER         NOT NULL,
293                            name    VARCHAR(255)    NOT NULL,
294                            mjesto  VARCHAR(255)
295                    );
296            });
297                    
298          $dbh->do(qq{          $dbh->do(qq{
299                  create table backups (                  create table backups (
# Line 227  if ($opt{c}) { Line 309  if ($opt{c}) {
309    
310          #do_index('backups_hostid,num_unique');          #do_index('backups_hostid,num_unique');
311    
         $dbh->do(qq{  
                 create table dvds (  
                         ID      SERIAL          PRIMARY KEY,  
                         num     INTEGER         NOT NULL,  
                         name    VARCHAR(255)    NOT NULL,  
                         mjesto  VARCHAR(255)  
                 );  
         });  
312    
313          $dbh->do(qq{              $dbh->do(qq{    
314                  create table files (                  create table files (
# Line 245  if ($opt{c}) { Line 319  if ($opt{c}) {
319                          path       VARCHAR(255) NOT NULL,                          path       VARCHAR(255) NOT NULL,
320                          date       integer      NOT NULL,                          date       integer      NOT NULL,
321                          type       INTEGER      NOT NULL,                          type       INTEGER      NOT NULL,
322                          size       INTEGER      NOT NULL,                          size       INTEGER      NOT NULL
323                          dvdid      INTEGER      references dvds(id)                      );
324            });
325    
326    
327            $dbh->do( qq{
328                    create table archive
329                    (
330                            id                      int not null,
331                            dvd_nr          int not null,
332                            note            text,
333                            username        varchar(20) not null,
334                            date            timestamp,
335                            primary key(id)
336                    );      
337            }
338            );
339    
340            $dbh->do( qq{
341                    create table archive_backup
342                    (
343                            archive_id      int not null,
344                            backup_id       int not null,
345                            status          text,
346                            primary key(archive_id, backup_id)
347                    );
348            });
349    
350            $dbh->do( qq{
351                    create table workflows(
352                            id                      int not null,
353                            step_id         int not null,
354                            start           timestamp,
355                            stop            timestamp,
356                            username        varchar(20),
357                            archive_id      int not null,
358                            running         boolean default true,
359                            primary key(id)
360                    );
361            });
362    
363            $dbh->do( qq{
364                    create table workflow_step
365                    (
366                            step_id         int not null,
367                            code            text,
368                            next_step       int,
369                            stop            boolean default false,
370                            primary key(step_id)
371                  );                  );
372          });          });
373    
374            $dbh->do( qq{
375                            alter table workflow_step
376                                    add constraint fk_workflow_next_step
377                                    foreign key(next_step)
378                                    references workflow_step(step_id);
379            });
380    
381            $dbh->do( qq{
382                    alter table workflows
383                            add constraint fk_workflows_step_id
384                            foreign key(step_id)
385                            references workflow_step(step_id);
386            });
387            
388            $dbh->do( qq{
389                    alter table workflows
390                            add constraint fk_workflows_archive_id
391                            foreign key(archive_id)
392                            references archive(id);
393            });
394    
395            $dbh->do( qq{
396                    create table workflow_log
397                    (
398                            workflow_id             int not null,
399                            step_id                 int not null,
400                            date                    timestamp not null,
401                            status                  text,
402                            primary key(workflow_id, step_id)
403                    );
404            });
405    
406            $dbh->do( qq{
407                    alter table workflow_log
408                            add constraint fk_workflow_log_workflow_id
409                            foreign key (workflow_id)
410                            references workflows(id);
411                    });
412            
413            $dbh->do( qq{
414                    alter table workflow_log
415                            add constraint fk_workflow_log_step_id
416                            foreign key (step_id)
417                            references      workflow_step(step_id);
418                    });
419    
420          print "creating indexes:";          print "creating indexes:";
421    
422          foreach my $index (qw(          foreach my $index (qw(
# Line 273  if ($opt{c}) { Line 440  if ($opt{c}) {
440    
441  }  }
442    
443    ## delete data before inseting ##
444  if ($opt{d}) {  if ($opt{d}) {
445          print "deleting ";          print "deleting ";
446          foreach my $table (qw(files dvds backups shares hosts)) {          foreach my $table (qw(files dvds backups shares hosts)) {
# Line 284  if ($opt{d}) { Line 452  if ($opt{d}) {
452          $dbh->commit;          $dbh->commit;
453  }  }
454    
455  #################################INSERT VALUES#############################  ## insert new values ##
456    
457  # get hosts  # get hosts
458  $hosts = $bpc->HostInfoRead();  $hosts = $bpc->HostInfoRead();
# Line 381  foreach my $host_key (keys %{$hosts}) { Line 549  foreach my $host_key (keys %{$hosts}) {
549                                  $hostID,                                  $hostID,
550                                  $backupNum,                                  $backupNum,
551                                  $backup->{'endTime'},                                  $backup->{'endTime'},
552                                  $backup->{'type'},                                  substr($backup->{'type'},0,4),
553                                  $shareID,                                  $shareID,
554                                  $size,                                  $size,
555                          );                          );
# Line 396  foreach my $host_key (keys %{$hosts}) { Line 564  foreach my $host_key (keys %{$hosts}) {
564                                  ( ($f+$d) / $dur ),                                  ( ($f+$d) / $dur ),
565                                  fmt_time($dur)                                  fmt_time($dur)
566                          );                          );
567    
568                            hest_update($hostID, $shareID, $backupNum) if ($nf + $nd > 0);
569                  }                  }
570    
571          }          }

Legend:
Removed from v.86  
changed lines
  Added in v.130

  ViewVC Help
Powered by ViewVC 1.1.26