1 #!/usr/local/bin/perl -w
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("localhost");
134 foreach $host_key (keys %{$hosts})
136 my $hostname = $hosts->{$host_key}->{'host'};
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 my $tmp = $st->fetchrow_hashref();
145 if ($tmp->{'ID'} ne "")
147 $hostID = $tmp->{'ID'};
151 $sql = q{ INSERT INTO hosts ( ID, name, IP) VALUES (NULL,"}.
152 $hosts->{$host_key}->{'host'}."\", \"".
153 $hosts->{$host_key}->{'ip'}."\");";
156 $hostID = $dbh->func('last_insert_rowid');
160 print("processing host ".$hosts->{$host_key}->{'host'}.":\n");
162 # get backups for a host
163 my @backups = $bpc->BackupInfoRead($hostname);
164 foreach my $backup (@backups)
166 my $backupNum = $backup->{'num'};
167 my @backupShares = ();
173 SELECT COUNT(*) AS broj
179 my $st = $dbh->prepare($sql);
180 $st->bind_param(1,$hostID);
181 $st->bind_param(2,$backupNum);
183 my $tmp = $st->fetchrow_hashref();
185 if ($tmp->{'broj'} > 0)
191 print "\tprocessing backup no. $backupNum...";
194 INSERT INTO backups (hostID, num, date, type)
196 (}.$hostID.",". $backupNum.q{, }.$backup->{'endTime'}.",\"". $backup->{'type'}.q{");
200 my $files = BackupPC::View->new($bpc, $hostname, \@backups);
201 @backupShares = $files->shareList($backupNum);
202 foreach my $share (@backupShares)
204 my @flattenedFiles = ();
205 clearBeenThereCache();
206 print "\n\t\tprocessing share ".$share."...";
207 $shareID = getShareID($share, $hostID, $hostname);
209 @flattenedFiles = recurseDir($bpc, $hostname, \@backups, $backupNum, $share, "");
211 print "\t\tinserting data into db...";
212 foreach my $file (@flattenedFiles)
214 $dbh->do("INSERT INTO files(ID, shareID, backupNum, name, path, fullpath, date, type, size) VALUES "
215 ."( NULL, $shareID, "
217 .$file->{'fileName'}."\", \""
218 .$file->{'relPath'}. "\", \""
219 .$file->{'fullPath'}."\", "
220 .$file->{'mtime'}.", "
221 .$file->{'type'}.", "
238 foreach my $st (@beenThere)
246 push(@beenThere, $where);
250 sub clearBeenThereCache
257 my ($share, $hostID, $hostname) = @_;
260 my $st = $dbh -> prepare(" SELECT shares.ID AS ID FROM shares WHERE hostID=? AND name=?");
261 $st -> execute($hostID,$share);
262 my $tmp = $st->fetchrow_hashref();
270 INSERT INTO shares(ID,hostID,name,share,localpath)
273 "$hostID,\"$share\",\"//$hostname$share\",NULL);";
275 return $dbh->func('last_insert_rowid');
278 ####################################################
279 # recursing through filesystem structure and #
280 # and returning flattened files list #
281 ####################################################
284 my ($bpc, $hostname, $backups, $backupNo, $share, $dir) = @_;
286 my $files = BackupPC::View->new($bpc, $hostname, $backups);
287 my $filesInBackup = $files->dirAttrib($backupNo, $share, $dir);
291 # first, add all the entries in current directory
292 foreach $file_key (keys %{$filesInBackup})
295 'fileName' => $file_key,
296 'relPath' => $filesInBackup->{$file_key}->{'relPath'},
297 'fullPath' => $filesInBackup->{$file_key}->{'fullPath'},
298 'sharePath'=> $filesInBackup->{$file_key}->{'sharePathM'},
299 'size' => $filesInBackup->{$file_key}->{'size'},
300 'mtime' => $filesInBackup->{$file_key}->{'mtime'},
301 'type' => $filesInBackup->{$file_key}->{'type'}
305 # then, recurse thru subfolders
306 foreach my $fold (@ret)
308 if ($fold->{'type'} == BPC_FTYPE_DIR &&
309 haveBeenThere($fold->{'relPath'}) != 1
314 recurseDir($bpc, $hostname, $backups, $backupNo, $share, $fold->{'relPath'})