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

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26