/[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 160 - (hide annotations)
Mon Oct 10 13:39:11 2005 UTC (18 years, 7 months ago) by dpavlin
File size: 15417 byte(s)
 r8423@llin:  dpavlin | 2005-10-10 15:30:15 +0200
 make delete from archives work

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 160 archive_id int not null references archive(id) on delete cascade,
355 dpavlin 152 backup_id int not null references backups(id),
356 dpavlin 130 primary key(archive_id, backup_id)
357     );
358     });
359    
360 dpavlin 153 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 153
379     print " creating sequence: ";
380     foreach my $seq (qw/dvd_nr/) {
381     print "$seq ";
382     $dbh->do( qq{ CREATE SEQUENCE $seq } );
383     }
384    
385    
386 dpavlin 49 print "...\n";
387 dpavlin 14
388 dpavlin 49 $dbh->commit;
389 dpavlin 14
390     }
391    
392 dpavlin 89 ## delete data before inseting ##
393 dpavlin 14 if ($opt{d}) {
394     print "deleting ";
395 dpavlin 49 foreach my $table (qw(files dvds backups shares hosts)) {
396 dpavlin 14 print "$table ";
397     $dbh->do(qq{ DELETE FROM $table });
398     }
399     print " done...\n";
400 dpavlin 49
401 dpavlin 51 $dbh->commit;
402 dpavlin 14 }
403    
404 dpavlin 89 ## insert new values ##
405 dpavlin 6
406     # get hosts
407 dpavlin 8 $hosts = $bpc->HostInfoRead();
408 dpavlin 6 my $hostID;
409     my $shareID;
410    
411 dpavlin 14 my $sth;
412 dpavlin 6
413 dpavlin 14 $sth->{insert_hosts} = $dbh->prepare(qq{
414     INSERT INTO hosts (name, IP) VALUES (?,?)
415     });
416 dpavlin 6
417 dpavlin 14 $sth->{hosts_by_name} = $dbh->prepare(qq{
418     SELECT ID FROM hosts WHERE name=?
419     });
420    
421 dpavlin 65 $sth->{backups_count} = $dbh->prepare(qq{
422 dpavlin 14 SELECT COUNT(*)
423     FROM backups
424 dpavlin 65 WHERE hostID=? AND num=? AND shareid=?
425 dpavlin 14 });
426    
427     $sth->{insert_backups} = $dbh->prepare(qq{
428 dpavlin 66 INSERT INTO backups (hostID, num, date, type, shareid, size)
429     VALUES (?,?,?,?,?,?)
430 dpavlin 14 });
431    
432     $sth->{insert_files} = $dbh->prepare(qq{
433     INSERT INTO files
434 dpavlin 62 (shareID, backupNum, name, path, date, type, size)
435     VALUES (?,?,?,?,?,?,?)
436 dpavlin 14 });
437    
438     foreach my $host_key (keys %{$hosts}) {
439    
440     my $hostname = $hosts->{$host_key}->{'host'} || die "can't find host for $host_key";
441    
442     $sth->{hosts_by_name}->execute($hosts->{$host_key}->{'host'});
443    
444     unless (($hostID) = $sth->{hosts_by_name}->fetchrow_array()) {
445     $sth->{insert_hosts}->execute(
446     $hosts->{$host_key}->{'host'},
447     $hosts->{$host_key}->{'ip'}
448     );
449    
450 dpavlin 49 $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef);
451 dpavlin 14 }
452    
453 dpavlin 67 print "host ".$hosts->{$host_key}->{'host'}.": ";
454 dpavlin 6
455 dpavlin 14 # get backups for a host
456     my @backups = $bpc->BackupInfoRead($hostname);
457 dpavlin 67 my $incs = scalar @backups;
458     print "$incs increments\n";
459 dpavlin 6
460 dpavlin 14 my $inc_nr = 0;
461 dpavlin 67 $beenThere = {};
462 dpavlin 14
463     foreach my $backup (@backups) {
464 dpavlin 40
465 dpavlin 14 $inc_nr++;
466     last if ($opt{m} && $inc_nr > $opt{m});
467    
468     my $backupNum = $backup->{'num'};
469     my @backupShares = ();
470    
471 dpavlin 67 printf("%-10s %2d/%-2d #%-2d %s %5s/%5s files (date: %s dur: %s)\n",
472     $hosts->{$host_key}->{'host'},
473     $inc_nr, $incs, $backupNum,
474     $backup->{type} || '?',
475     $backup->{nFilesNew} || '?', $backup->{nFiles} || '?',
476 dpavlin 57 strftime($t_fmt,localtime($backup->{startTime})),
477 dpavlin 67 fmt_time($backup->{endTime} - $backup->{startTime})
478     );
479 dpavlin 14
480 dpavlin 34 my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1);
481 dpavlin 14 foreach my $share ($files->shareList($backupNum)) {
482    
483 dpavlin 37 my $t = time();
484    
485 dpavlin 14 $shareID = getShareID($share, $hostID, $hostname);
486    
487 dpavlin 65 $sth->{backups_count}->execute($hostID, $backupNum, $shareID);
488     my ($count) = $sth->{backups_count}->fetchrow_array();
489     # skip if allready in database!
490     next if ($count > 0);
491    
492     # dump some log
493 dpavlin 86 print curr_time," ", $share;
494 dpavlin 65
495 dpavlin 66 my ($f, $nf, $d, $nd, $size) = recurseDir($bpc, $hostname, $files, $backupNum, $share, "", $shareID);
496 dpavlin 65
497     $sth->{insert_backups}->execute(
498     $hostID,
499     $backupNum,
500     $backup->{'endTime'},
501 dpavlin 130 substr($backup->{'type'},0,4),
502 dpavlin 66 $shareID,
503     $size,
504 dpavlin 65 );
505    
506     print " commit";
507     $dbh->commit();
508    
509 dpavlin 50 my $dur = (time() - $t) || 1;
510 dpavlin 66 printf(" %d/%d files %d/%d dirs %0.2f MB [%.2f/s dur: %s]\n",
511 dpavlin 37 $nf, $f, $nd, $d,
512 dpavlin 66 ($size / 1024 / 1024),
513 dpavlin 50 ( ($f+$d) / $dur ),
514     fmt_time($dur)
515 dpavlin 37 );
516 dpavlin 89
517 dpavlin 107 hest_update($hostID, $shareID, $backupNum) if ($nf + $nd > 0);
518 dpavlin 14 }
519 dpavlin 29
520 dpavlin 6 }
521     }
522 dpavlin 14 undef $sth;
523 dpavlin 6 $dbh->commit();
524     $dbh->disconnect();
525    
526 dpavlin 51 print "total duration: ",fmt_time(time() - $start_t),"\n";
527    
528 dpavlin 38 $pidfile->remove;
529    
530 dpavlin 14 sub getShareID() {
531 dpavlin 6
532 dpavlin 14 my ($share, $hostID, $hostname) = @_;
533    
534     $sth->{share_id} ||= $dbh->prepare(qq{
535     SELECT ID FROM shares WHERE hostID=? AND name=?
536     });
537    
538     $sth->{share_id}->execute($hostID,$share);
539    
540     my ($id) = $sth->{share_id}->fetchrow_array();
541    
542     return $id if (defined($id));
543    
544     $sth->{insert_share} ||= $dbh->prepare(qq{
545     INSERT INTO shares
546 dpavlin 152 (hostID,name,share)
547     VALUES (?,?,?)
548 dpavlin 14 });
549    
550 dpavlin 25 my $drop_down = $hostname . '/' . $share;
551     $drop_down =~ s#//+#/#g;
552    
553 dpavlin 152 $sth->{insert_share}->execute($hostID,$share, $drop_down);
554 dpavlin 49 return $dbh->last_insert_id(undef,undef,'shares',undef);
555 dpavlin 6 }
556    
557 dpavlin 14 sub found_in_db {
558    
559 dpavlin 48 my @data = @_;
560     shift @data;
561 dpavlin 14
562 dpavlin 74 my ($key, $shareID,undef,$name,$path,$date,undef,$size) = @_;
563 dpavlin 48
564     return $beenThere->{$key} if (defined($beenThere->{$key}));
565    
566 dpavlin 14 $sth->{file_in_db} ||= $dbh->prepare(qq{
567 dpavlin 48 SELECT 1 FROM files
568 dpavlin 14 WHERE shareID = ? and
569     path = ? and
570     date = ? and
571     size = ?
572 dpavlin 74 LIMIT 1
573 dpavlin 14 });
574    
575 dpavlin 67 my @param = ($shareID,$path,$date,$size);
576 dpavlin 14 $sth->{file_in_db}->execute(@param);
577 dpavlin 48 my $rows = $sth->{file_in_db}->rows;
578 dpavlin 74 print STDERR "## found_in_db($shareID,$path,$date,$size) ",( $rows ? '+' : '-' ), join(" ",@param), "\n" if ($debug >= 3);
579 dpavlin 48
580     $beenThere->{$key}++;
581    
582     $sth->{'insert_files'}->execute(@data) unless ($rows);
583 dpavlin 14 return $rows;
584 dpavlin 6 }
585    
586     ####################################################
587     # recursing through filesystem structure and #
588     # and returning flattened files list #
589     ####################################################
590 dpavlin 14 sub recurseDir($$$$$$$$) {
591 dpavlin 6
592 dpavlin 35 my ($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID) = @_;
593 dpavlin 14
594 dpavlin 44 print STDERR "\nrecurse($hostname,$backupNum,$share,$dir,$shareID)\n" if ($debug >= 1);
595 dpavlin 29
596 dpavlin 66 my ($nr_files, $new_files, $nr_dirs, $new_dirs, $size) = (0,0,0,0,0);
597 dpavlin 14
598 dpavlin 27 { # scope
599 dpavlin 29 my @stack;
600 dpavlin 14
601 dpavlin 45 print STDERR "# dirAttrib($backupNum, $share, $dir)\n" if ($debug >= 2);
602 dpavlin 27 my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir);
603 dpavlin 14
604 dpavlin 27 # first, add all the entries in current directory
605     foreach my $path_key (keys %{$filesInBackup}) {
606 dpavlin 66 print STDERR "# file ",Dumper($filesInBackup->{$path_key}),"\n" if ($debug >= 3);
607 dpavlin 27 my @data = (
608     $shareID,
609     $backupNum,
610     $path_key,
611     $filesInBackup->{$path_key}->{'relPath'},
612     $filesInBackup->{$path_key}->{'mtime'},
613     $filesInBackup->{$path_key}->{'type'},
614     $filesInBackup->{$path_key}->{'size'}
615     );
616    
617     my $key = join(" ", (
618     $shareID,
619     $dir,
620     $path_key,
621     $filesInBackup->{$path_key}->{'mtime'},
622     $filesInBackup->{$path_key}->{'size'}
623     ));
624    
625 dpavlin 70 my $found;
626     if (! defined($beenThere->{$key}) && ! ($found = found_in_db($key, @data)) ) {
627 dpavlin 30 print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2);
628 dpavlin 48
629 dpavlin 27 if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
630 dpavlin 70 $new_dirs++ unless ($found);
631 dpavlin 30 print STDERR " dir\n" if ($debug >= 2);
632 dpavlin 27 } else {
633 dpavlin 70 $new_files++ unless ($found);
634 dpavlin 30 print STDERR " file\n" if ($debug >= 2);
635 dpavlin 27 }
636 dpavlin 66 $size += $filesInBackup->{$path_key}->{'size'} || 0;
637 dpavlin 27 }
638    
639 dpavlin 14 if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) {
640 dpavlin 27 $nr_dirs++;
641    
642 dpavlin 29 my $full_path = $dir . '/' . $path_key;
643     push @stack, $full_path;
644 dpavlin 30 print STDERR "### store to stack: $full_path\n" if ($debug >= 3);
645 dpavlin 29
646 dpavlin 27 # my ($f,$nf,$d,$nd) = recurseDir($bpc, $hostname, $backups, $backupNum, $share, $path_key, $shareID) unless ($beenThere->{$key});
647     #
648     # $nr_files += $f;
649     # $new_files += $nf;
650     # $nr_dirs += $d;
651     # $new_dirs += $nd;
652    
653 dpavlin 14 } else {
654 dpavlin 27 $nr_files++;
655 dpavlin 14 }
656     }
657    
658 dpavlin 30 print STDERR "## STACK ",join(", ", @stack),"\n" if ($debug >= 2);
659 dpavlin 14
660 dpavlin 29 while ( my $dir = shift @stack ) {
661 dpavlin 66 my ($f,$nf,$d,$nd, $s) = recurseDir($bpc, $hostname, $files, $backupNum, $share, $dir, $shareID);
662 dpavlin 30 print STDERR "# $dir f: $f nf: $nf d: $d nd: $nd\n" if ($debug >= 1);
663 dpavlin 29 $nr_files += $f;
664     $new_files += $nf;
665     $nr_dirs += $d;
666     $new_dirs += $nd;
667 dpavlin 66 $size += $s;
668 dpavlin 29 }
669 dpavlin 14 }
670    
671 dpavlin 66 return ($nr_files, $new_files, $nr_dirs, $new_dirs, $size);
672 dpavlin 6 }
673    

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26