/[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 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 41  my $beenThere = {}; Line 43  my $beenThere = {};
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    
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    
51  my %opt;  my %opt;
52    
53  if ( !getopts("cdm:v:", \%opt ) ) {  if ( !getopts("cdm:v:i", \%opt ) ) {
54          print STDERR <<EOF;          print STDERR <<EOF;
55  usage: $0 [-c|-d] [-m num] [-v|-v level]  usage: $0 [-c|-d] [-m num] [-v|-v level] [-i]
56    
57  Options:  Options:
58          -c      create database on first use          -c      create database on first use
59          -d      delete database before import          -d      delete database before import
60          -m num  import just num increments for one host          -m num  import just num increments for one host
61          -v num  set verbosity (debug) level (default $debug)          -v num  set verbosity (debug) level (default $debug)
62            -i      update HyperEstraier full text index
63  EOF  EOF
64          exit 1;          exit 1;
65  }  }
66    
67  ###################################create tables############################3  if ($opt{v}) {
68            print "Debug level at $opt{v}\n";
69            $debug = $opt{v};
70    }
71    
72    #---- subs ----
73    
74    sub fmt_time {
75            my $t = shift || return;
76            my $out = "";
77            my ($ss,$mm,$hh) = gmtime($t);
78            $out .= "${hh}h" if ($hh);
79            $out .= sprintf("%02d:%02d", $mm,$ss);
80            return $out;
81    }
82    
83    sub curr_time {
84            return strftime($t_fmt,localtime());
85    }
86    
87    my $hest_db;
88    my $hest_node;
89    
90    sub signal {
91            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    $SIG{'INT'}  = \&signal;
101    $SIG{'QUIT'} = \&signal;
102    
103    sub hest_update {
104    
105            my ($host_id, $share_id, $num) = @_;
106    
107            unless ($use_hest) {
108                    print STDERR "HyperEstraier support not enabled in configuration\n";
109                    return;
110            }
111    
112            print curr_time," updating HyperEstraier:";
113    
114            my $t = time();
115    
116            my $offset = 0;
117            my $added = 0;
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            my $results = 0;
134    
135            do {
136    
137                    my $where = '';
138                    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                    my $limit = sprintf('LIMIT '.EST_CHUNK.' OFFSET %d', $offset);
150    
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                    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                    while (my $row = $sth->fetchrow_hashref()) {
189    
190                            my $fid = $row->{'fid'} || die "no fid?";
191                            my $uri = 'file:///' . $fid;
192    
193                            my $id = ($hest_db || $hest_node)->uri_to_id($uri);
194                            next unless ($id == -1);
195    
196                            # create a document object
197                            my $doc = HyperEstraier::Document->new;
198    
199                            # add attributes to the document object
200                            $doc->add_attr('@uri', $uri);
201    
202                            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                    $offset += EST_CHUNK;
231    
232            } while ($results == EST_CHUNK);
233    
234            if ($index_path) {
235                    print ", close";
236                    $hest_db->close();
237            }
238    
239            my $dur = (time() - $t) || 1;
240            printf(" [%.2f/s dur: %s]\n",
241                    ( $added / $dur ),
242                    fmt_time($dur)
243            );
244    }
245    
246    #---- /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 88  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 103  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 121  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 149  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 160  if ($opt{d}) { Line 452  if ($opt{d}) {
452          $dbh->commit;          $dbh->commit;
453  }  }
454    
455  if ($opt{v}) {  ## insert new values ##
         print "Debug level at $opt{v}\n";  
         $debug = $opt{v};  
 }  
   
 #################################INSERT VALUES#############################  
456    
457  # get hosts  # get hosts
458  $hosts = $bpc->HostInfoRead();  $hosts = $bpc->HostInfoRead();
# Line 199  INSERT INTO files Line 486  INSERT INTO files
486          VALUES (?,?,?,?,?,?,?)          VALUES (?,?,?,?,?,?,?)
487  });  });
488    
 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;  
 }  
   
489  foreach my $host_key (keys %{$hosts}) {  foreach my $host_key (keys %{$hosts}) {
490    
491          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 541  foreach my $host_key (keys %{$hosts}) {
541                          next if ($count > 0);                          next if ($count > 0);
542    
543                          # dump some log                          # dump some log
544                          print strftime($t_fmt,localtime())," ", $share;                          print curr_time," ", $share;
545    
546                          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);
547    
# Line 271  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 286  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          }          }
# Line 330  sub found_in_db { Line 610  sub found_in_db {
610          my @data = @_;          my @data = @_;
611          shift @data;          shift @data;
612    
613          my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_;          my ($key, $shareID,undef,$name,$path,$date,undef,$size) = @_;
614    
615          return $beenThere->{$key} if (defined($beenThere->{$key}));          return $beenThere->{$key} if (defined($beenThere->{$key}));
616    
# Line 340  sub found_in_db { Line 620  sub found_in_db {
620                          path = ? and                          path = ? and
621                          date = ? and                          date = ? and
622                          size = ?                          size = ?
623                    LIMIT 1
624          });          });
625    
626          my @param = ($shareID,$path,$date,$size);          my @param = ($shareID,$path,$date,$size);
627          $sth->{file_in_db}->execute(@param);          $sth->{file_in_db}->execute(@param);
628          my $rows = $sth->{file_in_db}->rows;          my $rows = $sth->{file_in_db}->rows;
629          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);
630    
631          $beenThere->{$key}++;          $beenThere->{$key}++;
632    
# Line 392  sub recurseDir($$$$$$$$) { Line 673  sub recurseDir($$$$$$$$) {
673                                  $filesInBackup->{$path_key}->{'size'}                                  $filesInBackup->{$path_key}->{'size'}
674                          ));                          ));
675    
676                            my $found;
677                          if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) {                          if (! defined($beenThere->{$key}) && ! ($found = found_in_db($key, @data)) ) {
678                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);                                  print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
679    
680                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {                                  if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
681                                          $new_dirs++;                                          $new_dirs++ unless ($found);
682                                          print STDERR " dir\n" if ($debug >= 2);                                          print STDERR " dir\n" if ($debug >= 2);
683                                  } else {                                  } else {
684                                          $new_files++;                                          $new_files++ unless ($found);
685                                          print STDERR " file\n" if ($debug >= 2);                                          print STDERR " file\n" if ($debug >= 2);
686                                  }                                  }
687                                  $size += $filesInBackup->{$path_key}->{'size'} || 0;                                  $size += $filesInBackup->{$path_key}->{'size'} || 0;

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

  ViewVC Help
Powered by ViewVC 1.1.26