/[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 249 - (hide annotations)
Fri Dec 9 16:27:49 2005 UTC (18 years, 5 months ago) by dpavlin
File size: 17381 byte(s)
small fixes

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

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26