6 use lib "__INSTALLDIR__/lib";
11 use constant BPC_FTYPE_DIR => 5;
15 my $bpc = BackupPC::Lib->new || die;
16 my %Conf = $bpc->Conf();
17 my $TopDir = $bpc->TopDir();
20 my $dbh = DBI->connect("dbi:SQLite:dbname=$TopDir/$Conf{SearchDB}", "", "", { RaiseError => 1, AutoCommit => 0 });
24 if ( !getopts("cdu", \%opt ) ) {
29 -c Create database on first use
30 -d Delete database before import
31 -u Update database (import new revisions)
36 ###################################create tables############################3
40 print "creating database...";
45 ( ID INTEGER PRIMARY KEY,
46 name VARCHAR(30) NOT NULL,
47 IP VARCHAR(20) NOT NULL
55 ( ID INTEGER PRIMARY KEY,
56 hostID INTEGER NOT NULL,
57 name VARCHAR(30) NOT NULL,
58 share VARCHAR(200) NOT NULL,
59 localpath VARCHAR(200)
67 ( hostID INTEGER NOT NULL,
71 PRIMARY KEY(hostID, num)
79 ( ID INTEGER PRIMARY KEY,
81 name VARCHAR(255) NOT NULL,
90 ( ID INTEGER NOT NULL PRIMARY KEY,
91 shareID INTEGER NOT NULL,
92 backupNum INTEGER NOT NULL,
93 name VARCHAR(255) NOT NULL,
94 path VARCHAR(255) NOT NULL,
95 fullpath VARCHAR(255) NOT NULL,
96 date TIMESTAMP NOT NULL,
97 type INTEGER NOT NULL,
98 size INTEGER NOT NULL,
108 print("deleting db first...\n");
111 q{ DELETE FROM hosts; }
114 q{ DELETE FROM shares; }
117 q{ DELETE FROM files;}
120 q{ DELETE FROM dvds;}
123 q{ DELETE FROM backups; }
127 #################################INSERT VALUES#############################
130 $hosts = $bpc->HostInfoRead();
131 print Dumper($hosts);
134 foreach my $host_key (keys %{$hosts})
136 my $hostname = $hosts->{$host_key}->{'host'} || die "can't find host for $host_key";
140 $sql = q{ SELECT ID FROM hosts WHERE name=? };
141 my $st = $dbh->prepare($sql);
142 $st->bind_param(1,$hosts->{$host_key}->{'host'});
144 if (my $tmp = $st->fetchrow_hashref())
146 $hostID = $tmp->{'ID'};
150 $sql = q{ INSERT INTO hosts ( ID, name, IP) VALUES (NULL,"}.
151 $hosts->{$host_key}->{'host'}."\", \"".
152 $hosts->{$host_key}->{'ip'}."\");";
155 $hostID = $dbh->func('last_insert_rowid');
159 print("processing host ".$hosts->{$host_key}->{'host'}.":\n");
161 # get backups for a host
162 my @backups = $bpc->BackupInfoRead($hostname);
163 foreach my $backup (@backups)
165 my $backupNum = $backup->{'num'};
166 my @backupShares = ();
172 SELECT COUNT(*) AS broj
178 my $st = $dbh->prepare($sql);
179 $st->bind_param(1,$hostID);
180 $st->bind_param(2,$backupNum);
182 my $tmp = $st->fetchrow_hashref();
184 if ($tmp->{'broj'} > 0)
190 print "\tprocessing backup no. $backupNum...";
193 INSERT INTO backups (hostID, num, date, type)
195 (}.$hostID.",". $backupNum.q{, }.$backup->{'endTime'}.",\"". $backup->{'type'}.q{");
199 my $files = BackupPC::View->new($bpc, $hostname, \@backups);
200 @backupShares = $files->shareList($backupNum);
201 foreach my $share (@backupShares)
203 my @flattenedFiles = ();
204 clearBeenThereCache();
205 print "\n\t\tprocessing share ".$share."...";
206 $shareID = getShareID($share, $hostID, $hostname);
208 @flattenedFiles = recurseDir($bpc, $hostname, \@backups, $backupNum, $share, "");
210 print "\t\tinserting data into db...";
211 foreach my $file (@flattenedFiles)
213 $dbh->do("INSERT INTO files(ID, shareID, backupNum, name, path, fullpath, date, type, size) VALUES "
214 ."( NULL, $shareID, "
216 .$file->{'fileName'}."\", \""
217 .$file->{'relPath'}. "\", \""
218 .$file->{'fullPath'}."\", "
219 .$file->{'mtime'}.", "
220 .$file->{'type'}.", "
237 foreach my $st (@beenThere)
245 push(@beenThere, $where);
249 sub clearBeenThereCache
256 my ($share, $hostID, $hostname) = @_;
259 my $st = $dbh -> prepare(" SELECT shares.ID AS ID FROM shares WHERE hostID=? AND name=?");
260 $st -> execute($hostID,$share);
261 my $tmp = $st->fetchrow_hashref();
269 INSERT INTO shares(ID,hostID,name,share,localpath)
272 "$hostID,\"$share\",\"//$hostname$share\",NULL);";
274 return $dbh->func('last_insert_rowid');
277 ####################################################
278 # recursing through filesystem structure and #
279 # and returning flattened files list #
280 ####################################################
283 my ($bpc, $hostname, $backups, $backupNo, $share, $dir) = @_;
285 my $files = BackupPC::View->new($bpc, $hostname, $backups);
286 my $filesInBackup = $files->dirAttrib($backupNo, $share, $dir);
290 # first, add all the entries in current directory
291 foreach $file_key (keys %{$filesInBackup})
294 'fileName' => $file_key,
295 'relPath' => $filesInBackup->{$file_key}->{'relPath'},
296 'fullPath' => $filesInBackup->{$file_key}->{'fullPath'},
297 'sharePath'=> $filesInBackup->{$file_key}->{'sharePathM'},
298 'size' => $filesInBackup->{$file_key}->{'size'},
299 'mtime' => $filesInBackup->{$file_key}->{'mtime'},
300 'type' => $filesInBackup->{$file_key}->{'type'}
304 # then, recurse thru subfolders
305 foreach my $fold (@ret)
307 if ($fold->{'type'} == BPC_FTYPE_DIR &&
308 haveBeenThere($fold->{'relPath'}) != 1
313 recurseDir($bpc, $hostname, $backups, $backupNo, $share, $fold->{'relPath'})