/[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

Annotation of /trunk/bin/BackupPC_updatedb

Parent Directory Parent Directory | Revision Log Revision Log


Revision 152 - (hide annotations)
Mon Oct 10 11:43:08 2005 UTC (18 years, 7 months ago) by dpavlin
File size: 15270 byte(s)
cleanup database schema

1 dpavlin 14 #!/usr/local/bin/perl -w
2 dpavlin 6
3     use strict;
4 dpavlin 48 use lib "__INSTALLDIR__/lib";
5    
6 dpavlin 6 use DBI;
7     use BackupPC::Lib;
8     use BackupPC::View;
9     use Data::Dumper;
10     use Getopt::Std;
11 dpavlin 37 use Time::HiRes qw/time/;
12 dpavlin 38 use File::Pid;
13 dpavlin 37 use POSIX qw/strftime/;
14 dpavlin 118 use BackupPC::SearchLib;
15 dpavlin 48
16 dpavlin 6 use constant BPC_FTYPE_DIR => 5;
17 dpavlin 99 use constant EST_CHUNK => 100000;
18 dpavlin 6
19 dpavlin 30 my $debug = 0;
20 dpavlin 14 $|=1;
21 dpavlin 6
22 dpavlin 51 my $start_t = time();
23    
24 dpavlin 38 my $pidfile = new File::Pid;
25    
26     if (my $pid = $pidfile->running ) {
27     die "$0 already running: $pid\n";
28     } elsif ($pidfile->pid ne $$) {
29     $pidfile->remove;
30     $pidfile = new File::Pid;
31     }
32 dpavlin 39 $pidfile->write;
33     print STDERR "$0 using pid ",$pidfile->pid," file ",$pidfile->file,"\n";
34 dpavlin 38
35 dpavlin 37 my $t_fmt = '%Y-%m-%d %H:%M:%S';
36    
37 dpavlin 6 my $hosts;
38     my $bpc = BackupPC::Lib->new || die;
39     my %Conf = $bpc->Conf();
40     my $TopDir = $bpc->TopDir();
41 dpavlin 14 my $beenThere = {};
42 dpavlin 6
43 dpavlin 51 my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";
44     my $user = $Conf{SearchUser} || '';
45 dpavlin 116
46     my $use_hest = $Conf{HyperEstraierIndex};
47 dpavlin 118 my ($index_path, $index_node_url) = BackupPC::SearchLib::getHyperEstraier_url($use_hest);
48 dpavlin 6
49 dpavlin 49 my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
50    
51 dpavlin 6 my %opt;
52    
53 dpavlin 131 if ( !getopts("cdm:v:ij", \%opt ) ) {
54 dpavlin 6 print STDERR <<EOF;
55 dpavlin 81 usage: $0 [-c|-d] [-m num] [-v|-v level] [-i]
56 dpavlin 6
57     Options:
58 dpavlin 14 -c create database on first use
59     -d delete database before import
60     -m num import just num increments for one host
61 dpavlin 44 -v num set verbosity (debug) level (default $debug)
62 dpavlin 131 -i update Hyper Estraier full text index
63     -j update full text, don't check existing files
64    
65     Option -j is variation on -i. It will allow faster initial creation
66     of full-text index from existing database.
67    
68 dpavlin 6 EOF
69     exit 1;
70     }
71    
72 dpavlin 81 if ($opt{v}) {
73     print "Debug level at $opt{v}\n";
74     $debug = $opt{v};
75     }
76    
77 dpavlin 86 #---- subs ----
78    
79     sub fmt_time {
80     my $t = shift || return;
81     my $out = "";
82     my ($ss,$mm,$hh) = gmtime($t);
83     $out .= "${hh}h" if ($hh);
84     $out .= sprintf("%02d:%02d", $mm,$ss);
85     return $out;
86     }
87    
88     sub curr_time {
89     return strftime($t_fmt,localtime());
90     }
91    
92 dpavlin 89 my $hest_db;
93 dpavlin 116 my $hest_node;
94 dpavlin 86
95 dpavlin 97 sub signal {
96     my($sig) = @_;
97     if ($hest_db) {
98     print "\nCaught a SIG$sig--syncing database and shutting down\n";
99     $hest_db->sync();
100     $hest_db->close();
101     }
102     exit(0);
103     }
104    
105     $SIG{'INT'} = \&signal;
106     $SIG{'QUIT'} = \&signal;
107    
108 dpavlin 89 sub hest_update {
109 dpavlin 81
110 dpavlin 89 my ($host_id, $share_id, $num) = @_;
111    
112 dpavlin 131 my $skip_check = $opt{j} && print STDERR "Skipping check for existing files -- this should be used only with initital import\n";
113    
114 dpavlin 116 unless ($use_hest) {
115     print STDERR "HyperEstraier support not enabled in configuration\n";
116     return;
117     }
118    
119 dpavlin 98 print curr_time," updating HyperEstraier:";
120 dpavlin 86
121     my $t = time();
122 dpavlin 89
123 dpavlin 98 my $offset = 0;
124     my $added = 0;
125 dpavlin 89
126 dpavlin 130 print " opening index $use_hest";
127 dpavlin 116 if ($index_path) {
128     $hest_db = HyperEstraier::Database->new();
129 dpavlin 118 $hest_db->open($TopDir . $index_path, $HyperEstraier::Database::DBWRITER | $HyperEstraier::Database::DBCREAT);
130 dpavlin 130 print " directly";
131 dpavlin 116 } elsif ($index_node_url) {
132     $hest_node ||= HyperEstraier::Node->new($index_node_url);
133     $hest_node->set_auth('admin', 'admin');
134 dpavlin 130 print " via node URL";
135 dpavlin 116 } else {
136     die "don't know how to use HyperEstraier Index $use_hest";
137     }
138 dpavlin 107 print " increment is " . EST_CHUNK . " files:";
139 dpavlin 99
140 dpavlin 98 my $results = 0;
141 dpavlin 81
142 dpavlin 98 do {
143 dpavlin 81
144 dpavlin 98 my $where = '';
145 dpavlin 104 my @data;
146 dpavlin 98 if ($host_id && $share_id && $num) {
147     $where = qq{
148     WHERE
149     hosts.id = ? AND
150     shares.id = ? AND
151     files.backupnum = ?
152     };
153 dpavlin 104 @data = ( $host_id, $share_id, $num );
154 dpavlin 98 }
155 dpavlin 89
156 dpavlin 98 my $limit = sprintf('LIMIT '.EST_CHUNK.' OFFSET %d', $offset);
157 dpavlin 81
158 dpavlin 98 my $sth = $dbh->prepare(qq{
159     SELECT
160     files.id AS fid,
161     hosts.name AS hname,
162     shares.name AS sname,
163     -- shares.share AS sharename,
164     files.backupnum AS backupnum,
165     -- files.name AS filename,
166     files.path AS filepath,
167     files.date AS date,
168     files.type AS type,
169     files.size AS size,
170     files.shareid AS shareid,
171     backups.date AS backup_date
172     FROM files
173     INNER JOIN shares ON files.shareID=shares.ID
174     INNER JOIN hosts ON hosts.ID = shares.hostID
175     INNER JOIN backups ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
176     $where
177     $limit
178     });
179 dpavlin 81
180 dpavlin 104 $sth->execute(@data);
181 dpavlin 98 $results = $sth->rows;
182 dpavlin 81
183 dpavlin 98 if ($results == 0) {
184 dpavlin 107 print " - no new files\n";
185 dpavlin 98 last;
186     }
187 dpavlin 89
188 dpavlin 98 sub fmt_date {
189     my $t = shift || return;
190     my $iso = BackupPC::Lib::timeStamp($t);
191     $iso =~ s/\s/T/;
192     return $iso;
193     }
194 dpavlin 89
195 dpavlin 98 while (my $row = $sth->fetchrow_hashref()) {
196 dpavlin 89
197 dpavlin 98 my $fid = $row->{'fid'} || die "no fid?";
198     my $uri = 'file:///' . $fid;
199 dpavlin 82
200 dpavlin 131 unless ($skip_check) {
201     my $id = ($hest_db || $hest_node)->uri_to_id($uri);
202     next unless ($id == -1);
203     }
204 dpavlin 82
205 dpavlin 98 # create a document object
206     my $doc = HyperEstraier::Document->new;
207 dpavlin 81
208 dpavlin 98 # add attributes to the document object
209     $doc->add_attr('@uri', $uri);
210 dpavlin 89
211 dpavlin 98 foreach my $c (@{ $sth->{NAME} }) {
212     $doc->add_attr($c, $row->{$c}) if ($row->{$c});
213     }
214 dpavlin 89
215 dpavlin 98 #$doc->add_attr('@cdate', fmt_date($row->{'date'}));
216 dpavlin 81
217 dpavlin 98 # add the body text to the document object
218     my $path = $row->{'filepath'};
219     $doc->add_text($path);
220     $path =~ s/(.)/$1 /g;
221     $doc->add_hidden_text($path);
222 dpavlin 81
223 dpavlin 98 print STDERR $doc->dump_draft,"\n" if ($debug > 1);
224    
225     # register the document object to the database
226 dpavlin 116 if ($hest_db) {
227     $hest_db->put_doc($doc, $HyperEstraier::Database::PDCLEAN);
228     } elsif ($hest_node) {
229     $hest_node->put_doc($doc);
230     } else {
231     die "not supported";
232     }
233 dpavlin 98 $added++;
234 dpavlin 81 }
235    
236 dpavlin 98 print " $added";
237 dpavlin 116 $hest_db->sync() if ($index_path);
238 dpavlin 81
239 dpavlin 98 $offset += EST_CHUNK;
240 dpavlin 81
241 dpavlin 98 } while ($results == EST_CHUNK);
242 dpavlin 81
243 dpavlin 116 if ($index_path) {
244     print ", close";
245     $hest_db->close();
246     }
247 dpavlin 81
248 dpavlin 86 my $dur = (time() - $t) || 1;
249 dpavlin 98 printf(" [%.2f/s dur: %s]\n",
250 dpavlin 89 ( $added / $dur ),
251 dpavlin 86 fmt_time($dur)
252     );
253 dpavlin 89 }
254 dpavlin 86
255 dpavlin 89 #---- /subs ----
256    
257    
258     ## update index ##
259 dpavlin 131 if (($opt{i} || $opt{j} || ($index_path && ! -e $index_path)) && !$opt{c}) {
260 dpavlin 89 # update all
261     print "force update of HyperEstraier index ";
262     print "importing existing data" unless (-e $index_path);
263     print "by -i flag" if ($opt{i});
264 dpavlin 131 print "by -j flag" if ($opt{j});
265 dpavlin 89 print "\n";
266     hest_update();
267 dpavlin 81 }
268    
269 dpavlin 89 ## create tables ##
270 dpavlin 14 if ($opt{c}) {
271 dpavlin 49 sub do_index {
272     my $index = shift || return;
273 dpavlin 152 my ($table,$col,$unique) = split(/:/, $index);
274 dpavlin 49 $unique ||= '';
275 dpavlin 152 $index =~ s/\W+/_/g;
276     print "$index on $table($col)" . ( $unique ? "u" : "" ) . " ";
277 dpavlin 49 $dbh->do(qq{ create $unique index $index on $table($col) });
278     }
279    
280 dpavlin 14 print "creating tables...\n";
281 dpavlin 6
282 dpavlin 14 $dbh->do(qq{
283     create table hosts (
284 dpavlin 49 ID SERIAL PRIMARY KEY,
285 dpavlin 14 name VARCHAR(30) NOT NULL,
286     IP VARCHAR(15)
287 dpavlin 6 );
288 dpavlin 14 });
289 dpavlin 6
290 dpavlin 14 $dbh->do(qq{
291     create table shares (
292 dpavlin 49 ID SERIAL PRIMARY KEY,
293 dpavlin 14 hostID INTEGER NOT NULL references hosts(id),
294     name VARCHAR(30) NOT NULL,
295 dpavlin 152 share VARCHAR(200) NOT NULL
296 dpavlin 6 );
297 dpavlin 14 });
298 dpavlin 130
299     $dbh->do(qq{
300     create table dvds (
301     ID SERIAL PRIMARY KEY,
302     num INTEGER NOT NULL,
303     name VARCHAR(255) NOT NULL,
304     mjesto VARCHAR(255)
305     );
306     });
307 dpavlin 6
308 dpavlin 14 $dbh->do(qq{
309     create table backups (
310 dpavlin 152 id serial,
311 dpavlin 14 hostID INTEGER NOT NULL references hosts(id),
312     num INTEGER NOT NULL,
313 dpavlin 49 date integer NOT NULL,
314     type CHAR(4) not null,
315 dpavlin 65 shareID integer not null references shares(id),
316 dpavlin 136 size bigint not null,
317 dpavlin 152 inc_size bigint not null default -1,
318     inc_deleted boolean default false,
319     PRIMARY KEY(id)
320 dpavlin 6 );
321 dpavlin 14 });
322 dpavlin 6
323 dpavlin 14 $dbh->do(qq{
324     create table files (
325 dpavlin 152 ID SERIAL,
326     shareID INTEGER NOT NULL references shares(id),
327     backupNum INTEGER NOT NULL,
328     name VARCHAR(255) NOT NULL,
329     path VARCHAR(255) NOT NULL,
330     date integer NOT NULL,
331     type INTEGER NOT NULL,
332     size bigint NOT NULL,
333     primary key(id)
334 dpavlin 6 );
335 dpavlin 14 });
336 dpavlin 6
337 dpavlin 130
338     $dbh->do( qq{
339 dpavlin 152 create table archive (
340     id serial,
341 dpavlin 130 dvd_nr int not null,
342 dpavlin 152 total_size bigint default -1,
343 dpavlin 130 note text,
344     username varchar(20) not null,
345 dpavlin 152 date timestamp default now(),
346 dpavlin 130 primary key(id)
347     );
348     }
349     );
350    
351     $dbh->do( qq{
352     create table archive_backup
353     (
354 dpavlin 152 archive_id int not null references archive(id),
355     backup_id int not null references backups(id),
356 dpavlin 130 primary key(archive_id, backup_id)
357     );
358     });
359    
360 dpavlin 49 print "creating indexes:";
361 dpavlin 6
362 dpavlin 14 foreach my $index (qw(
363 dpavlin 152 hosts:name
364     backups:hostID
365     backups:num
366     backups:shareID
367     shares:hostID
368     shares:name
369     files:shareID
370     files:path
371     files:name
372     files:date
373     files:size
374     archive:dvd_nr
375 dpavlin 14 )) {
376 dpavlin 49 do_index($index);
377 dpavlin 14 }
378 dpavlin 49 print "...\n";
379 dpavlin 14
380 dpavlin 49 $dbh->commit;
381 dpavlin 14
382     }
383    
384 dpavlin 89 ## delete data before inseting ##
385 dpavlin 14 if ($opt{d}) {
386     print "deleting ";
387 dpavlin 49 foreach my $table (qw(files dvds backups shares hosts)) {
388 dpavlin 14 print "$table ";
389     $dbh->do(qq{ DELETE FROM $table });
390     }
391     print " done...\n";
392 dpavlin 49
393 dpavlin 51 $dbh->commit;
394 dpavlin 14 }
395    
396 dpavlin 89 ## insert new values ##
397 dpavlin 6
398     # get hosts
399 dpavlin 8 $hosts = $bpc->HostInfoRead();
400 dpavlin 6 my $hostID;
401     my $shareID;
402    
403 dpavlin 14 my $sth;
404 dpavlin 6
405 dpavlin 14 $sth->{insert_hosts} = $dbh->prepare(qq{
406     INSERT INTO hosts (name, IP) VALUES (?,?)
407     });
408 dpavlin 6
409 dpavlin 14 $sth->{hosts_by_name} = $dbh->prepare(qq{
410     SELECT ID FROM hosts WHERE name=?
411     });
412    
413 dpavlin 65 $sth->{backups_count} = $dbh->prepare(qq{
414 dpavlin 14 SELECT COUNT(*)
415     FROM backups
416 dpavlin 65 WHERE hostID=? AND num=? AND shareid=?
417 dpavlin 14 });
418    
419     $sth->{insert_backups} = $dbh->prepare(qq{
420 dpavlin 66 INSERT INTO backups (hostID, num, date, type, shareid, size)
421     VALUES (?,?,?,?,?,?)
422 dpavlin 14 });
423    
424     $sth->{insert_files} = $dbh->prepare(qq{
425     INSERT INTO files
426 dpavlin 62 (shareID, backupNum, name, path, date, type, size)
427     VALUES (?,?,?,?,?,?,?)
428 dpavlin 14 });
429    
430     foreach my $host_key (keys %{$hosts}) {
431    
432     my $hostname = $hosts->{$host_key}->{'host'} || die "can't find host for $host_key";
433    
434     $sth->{hosts_by_name}->execute($hosts->{$host_key}->{'host'});
435    
436     unless (($hostID) = $sth->{hosts_by_name}->fetchrow_array()) {
437     $sth->{insert_hosts}->execute(
438     $hosts->{$host_key}->{'host'},
439     $hosts->{$host_key}->{'ip'}
440     );
441    
442 dpavlin 49 $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);
443 dpavlin 14 }
444    
445 dpavlin 67 print "host ".$hosts->{$host_key}->{'host'}.": ";
446 dpavlin 6
447 dpavlin 14 # get backups for a host
448     my @backups = $bpc->BackupInfoRead($hostname);
449 dpavlin 67 my $incs = scalar @backups;
450     print "$incs increments\n";
451 dpavlin 6
452 dpavlin 14 my $inc_nr = 0;
453 dpavlin 67 $beenThere = {};
454 dpavlin 14
455     foreach my $backup (@backups) {
456 dpavlin 40
457 dpavlin 14 $inc_nr++;
458     last if ($opt{m} && $inc_nr > $opt{m});
459    
460     my $backupNum = $backup->{'num'};
461     my @backupShares = ();
462    
463 dpavlin 67 printf("%-10s %2d/%-2d #%-2d %s %5s/%5s files (date: %s dur: %s)\n",
464     $hosts->{$host_key}->{'host'},
465     $inc_nr, $incs, $backupNum,
466     $backup->{type} || '?',
467     $backup->{nFilesNew} || '?', $backup->{nFiles} || '?',
468 dpavlin 57 strftime($t_fmt,localtime($backup->{startTime})),
469 dpavlin 67 fmt_time($backup->{endTime} - $backup->{startTime})
470     );
471 dpavlin 14
472 dpavlin 34 my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);
473 dpavlin 14 foreach my $share ($files->shareList($backupNum)) {
474    
475 dpavlin 37 my $t = time();
476    
477 dpavlin 14 $shareID = getShareID($share, $hostID, $hostname);
478    
479 dpavlin 65 $sth->{backups_count}->execute($hostID, $backupNum, $shareID);
480     my ($count) = $sth->{backups_count}->fetchrow_array();
481     # skip if allready in database!
482     next if ($count > 0);
483    
484     # dump some log
485 dpavlin 86 print curr_time," ", $share;
486 dpavlin 65
487 dpavlin 66 my ($f, $nf, $d, $nd, $size) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);
488 dpavlin 65
489     $sth->{insert_backups}->execute(
490     $hostID,
491     $backupNum,
492     $backup->{'endTime'},
493 dpavlin 130 substr($backup->{'type'},0,4),
494 dpavlin 66 $shareID,
495     $size,
496 dpavlin 65 );
497    
498     print " commit";
499     $dbh->commit();
500    
501 dpavlin 50 my $dur = (time() - $t) || 1;
502 dpavlin 66 printf(" %d/%d files %d/%d dirs %0.2f MB [%.2f/s dur: %s]\n",
503 dpavlin 37 $nf, $f, $nd, $d,
504 dpavlin 66 ($size / 1024 / 1024),
505 dpavlin 50 ( ($f+$d) / $dur ),
506     fmt_time($dur)
507 dpavlin 37 );
508 dpavlin 89
509 dpavlin 107 hest_update($hostID, $shareID, $backupNum) if ($nf + $nd > 0);
510 dpavlin 14 }
511 dpavlin 29
512 dpavlin 6 }
513     }
514 dpavlin 14 undef $sth;
515 dpavlin 6 $dbh->commit();
516     $dbh->disconnect();
517    
518 dpavlin 51 print "total duration: ",fmt_time(time() - $start_t),"\n";
519    
520 dpavlin 38 $pidfile->remove;
521    
522 dpavlin 14 sub getShareID() {
523 dpavlin 6
524 dpavlin 14 my ($share, $hostID, $hostname) = @_;
525    
526     $sth->{share_id} ||= $dbh->prepare(qq{
527     SELECT ID FROM shares WHERE hostID=? AND name=?
528     });
529    
530     $sth->{share_id}->execute($hostID,$share);
531    
532     my ($id) = $sth->{share_id}->fetchrow_array();
533    
534     return $id if (defined($id));
535    
536     $sth->{insert_share} ||= $dbh->prepare(qq{
537     INSERT INTO shares
538 dpavlin 152 (hostID,name,share)
539     VALUES (?,?,?)
540 dpavlin 14 });
541    
542 dpavlin 25 my $drop_down = $hostname . '/' . $share;
543     $drop_down =~ s#//+#/#g;
544    
545 dpavlin 152 $sth->{insert_share}->execute($hostID,$share, $drop_down);
546 dpavlin 49 return $dbh->last_insert_id(undef,undef,'shares',undef);
547 dpavlin 6 }
548    
549 dpavlin 14 sub found_in_db {
550    
551 dpavlin 48 my @data = @_;
552     shift @data;
553 dpavlin 14
554 dpavlin 74 my ($key, $shareID,undef,$name,$path,$date,undef,$size) = @_;
555 dpavlin 48
556     return $beenThere->{$key} if (defined($beenThere->{$key}));
557    
558 dpavlin 14 $sth->{file_in_db} ||= $dbh->prepare(qq{
559 dpavlin 48 SELECT 1 FROM files
560 dpavlin 14 WHERE shareID = ? and
561     path = ? and
562     date = ? and
563     size = ?
564 dpavlin 74 LIMIT 1
565 dpavlin 14 });
566    
567 dpavlin 67 my @param = ($shareID,$path,$date,$size);
568 dpavlin 14 $sth->{file_in_db}->execute(@param);
569 dpavlin 48 my $rows = $sth->{file_in_db}->rows;
570 dpavlin 74 print STDERR "## found_in_db($shareID,$path,$date,$size) ",( $rows ? '+' : '-' ), join(" ",@param), "\n" if ($debug >= 3);
571 dpavlin 48
572     $beenThere->{$key}++;
573    
574     $sth->{'insert_files'}->execute(@data) unless ($rows);
575 dpavlin 14 return $rows;
576 dpavlin 6 }
577    
578     ####################################################
579     # recursing through filesystem structure and #
580     # and returning flattened files list #
581     ####################################################
582 dpavlin 14 sub recurseDir($$$$$$$$) {
583 dpavlin 6
584 dpavlin 35 my ($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID) = @_;
585 dpavlin 14
586 dpavlin 44 print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);
587 dpavlin 29
588 dpavlin 66 my ($nr_files, $new_files, $nr_dirs, $new_dirs, $size) = (0,0,0,0,0);
589 dpavlin 14
590 dpavlin 27 { # scope
591 dpavlin 29 my @stack;
592 dpavlin 14
593 dpavlin 45 print STDERR "# dirAttrib($backupNum, $share, $dir)\n" if ($debug >= 2);
594 dpavlin 27 my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir);
595 dpavlin 14
596 dpavlin 27 # first, add all the entries in current directory
597     foreach my $path_key (keys %{$filesInBackup}) {
598 dpavlin 66 print STDERR "# file ",Dumper($filesInBackup->{$path_key}),"\n" if ($debug >= 3);
599 dpavlin 27 my @data = (
600     $shareID,
601     $backupNum,
602     $path_key,
603     $filesInBackup->{$path_key}->{'relPath'},
604     $filesInBackup->{$path_key}->{'mtime'},
605     $filesInBackup->{$path_key}->{'type'},
606     $filesInBackup->{$path_key}->{'size'}
607     );
608    
609     my $key = join(" ", (
610     $shareID,
611     $dir,
612     $path_key,
613     $filesInBackup->{$path_key}->{'mtime'},
614     $filesInBackup->{$path_key}->{'size'}
615     ));
616    
617 dpavlin 70 my $found;
618     if (! defined($beenThere->{$key}) && ! ($found = found_in_db($key, @data)) ) {
619 dpavlin 30 print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
620 dpavlin 48
621 dpavlin 27 if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
622 dpavlin 70 $new_dirs++ unless ($found);
623 dpavlin 30 print STDERR " dir\n" if ($debug >= 2);
624 dpavlin 27 } else {
625 dpavlin 70 $new_files++ unless ($found);
626 dpavlin 30 print STDERR " file\n" if ($debug >= 2);
627 dpavlin 27 }
628 dpavlin 66 $size += $filesInBackup->{$path_key}->{'size'} || 0;
629 dpavlin 27 }
630    
631 dpavlin 14 if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
632 dpavlin 27 $nr_dirs++;
633    
634 dpavlin 29 my $full_path = $dir . '/' . $path_key;
635     push @stack, $full_path;
636 dpavlin 30 print STDERR "### store to stack: $full_path\n" if ($debug >= 3);
637 dpavlin 29
638 dpavlin 27 # my ($f,$nf,$d,$nd) = recurseDir($bpc, $hostname, $backups, $backupNum, $share, $path_key, $shareID) unless ($beenThere->{$key});
639     #
640     # $nr_files += $f;
641     # $new_files += $nf;
642     # $nr_dirs += $d;
643     # $new_dirs += $nd;
644    
645 dpavlin 14 } else {
646 dpavlin 27 $nr_files++;
647 dpavlin 14 }
648     }
649    
650 dpavlin 30 print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);
651 dpavlin 14
652 dpavlin 29 while ( my $dir = shift @stack ) {
653 dpavlin 66 my ($f,$nf,$d,$nd, $s) = recurseDir($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID);
654 dpavlin 30 print STDERR "# $dir f: $f nf: $nf d: $d nd: $nd\n" if ($debug >= 1);
655 dpavlin 29 $nr_files += $f;
656     $new_files += $nf;
657     $nr_dirs += $d;
658     $new_dirs += $nd;
659 dpavlin 66 $size += $s;
660 dpavlin 29 }
661 dpavlin 14 }
662    
663 dpavlin 66 return ($nr_files, $new_files, $nr_dirs, $new_dirs, $size);
664 dpavlin 6 }
665    

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26