/[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 248 - (hide annotations)
Fri Dec 9 14:41:13 2005 UTC (18 years, 6 months ago) by dpavlin
File size: 17353 byte(s)
added hostnumber and total number of hosts

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

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26