/[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

Contents of /trunk/bin/BackupPC_updatedb

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (show annotations)
Thu Jun 23 09:47:59 2005 UTC (18 years, 10 months ago) by dpavlin
File size: 7584 byte(s)
lot of fixes to make search work

1 #!/usr/local/bin/perl -w
2 $| = 1;
3
4 use strict;
5 use DBI;
6 use lib "__INSTALLDIR__/lib";
7 use BackupPC::Lib;
8 use BackupPC::View;
9 use Data::Dumper;
10 use Getopt::Std;
11 use constant BPC_FTYPE_DIR => 5;
12
13
14 my $hosts;
15 my $bpc = BackupPC::Lib->new || die;
16 my %Conf = $bpc->Conf();
17 my $TopDir = $bpc->TopDir();
18 my @beenThere = ();
19
20 print Dumper(\%Conf);
21
22 my $dbh = DBI->connect("dbi:SQLite:dbname=$TopDir/$Conf{SearchDB}", "", "", { RaiseError => 1, AutoCommit => 0 });
23
24 my %opt;
25
26 if ( !getopts("cdu", \%opt ) ) {
27 print STDERR <<EOF;
28 usage: $0 (-c|-df|-u)
29
30 Options:
31 -c Create database on first use
32 -d Delete database before import
33 -u Update database (import new revisions)
34 EOF
35 exit 1;
36 }
37
38 ###################################create tables############################3
39
40 if ($opt{c})
41 {
42 print "creating database...";
43
44 $dbh->do(
45 q{
46 create table hosts
47 ( ID INTEGER PRIMARY KEY,
48 name VARCHAR(30) NOT NULL,
49 IP VARCHAR(20) NOT NULL
50 );
51 }
52 );
53
54 $dbh->do(
55 q{
56 create table shares
57 ( ID INTEGER PRIMARY KEY,
58 hostID INTEGER NOT NULL,
59 name VARCHAR(30) NOT NULL,
60 share VARCHAR(200) NOT NULL,
61 localpath VARCHAR(200)
62 );
63 }
64 );
65
66 $dbh->do(
67 q{
68 create table backups
69 ( hostID INTEGER NOT NULL,
70 num INTEGER NOT NULL,
71 date DATE,
72 type CHAR(1),
73 PRIMARY KEY(hostID, num)
74 );
75 }
76 );
77
78 $dbh->do(
79 q{
80 create table dvds
81 ( ID INTEGER PRIMARY KEY,
82 num INTEGER NOT NULL,
83 name VARCHAR(255) NOT NULL,
84 mjesto VARCHAR(255)
85 );
86 }
87 );
88
89 $dbh->do(
90 q{
91 create table files
92 ( ID INTEGER NOT NULL PRIMARY KEY,
93 shareID INTEGER NOT NULL,
94 backupNum INTEGER NOT NULL,
95 name VARCHAR(255) NOT NULL,
96 path VARCHAR(255) NOT NULL,
97 fullpath VARCHAR(255) NOT NULL,
98 date TIMESTAMP NOT NULL,
99 type INTEGER NOT NULL,
100 size INTEGER NOT NULL,
101 dvdid INTEGER
102 );
103 }
104 );
105 print "done\n";
106 }
107
108 if ($opt{d})
109 {
110 print("deleting db first...\n");
111
112 $dbh->do(
113 q{ DELETE FROM hosts; }
114 );
115 $dbh->do(
116 q{ DELETE FROM shares; }
117 );
118 $dbh->do(
119 q{ DELETE FROM files;}
120 );
121 $dbh->do(
122 q{ DELETE FROM dvds;}
123 );
124 $dbh->do(
125 q{ DELETE FROM backups; }
126 );
127 }
128
129 #################################INSERT VALUES#############################
130
131 # get hosts
132 $hosts = $bpc->HostInfoRead("localhost");
133 my $host_key;
134 my $hostID;
135 my $shareID;
136 foreach $host_key (keys %{$hosts})
137 {
138 my $hostname = $hosts->{$host_key}->{'host'};
139 my $backups;
140 my $sql;
141
142 $sql = q{ SELECT ID FROM hosts WHERE name=? };
143 my $st = $dbh->prepare($sql);
144 $st->bind_param(1,$hosts->{$host_key}->{'host'});
145 $st->execute();
146 my $tmp = $st->fetchrow_hashref();
147 if ($tmp->{'ID'} ne "")
148 {
149 $hostID = $tmp->{'ID'};
150 }
151 else
152 {
153 $sql = q{ INSERT INTO hosts ( ID, name, IP) VALUES (NULL,"}.
154 $hosts->{$host_key}->{'host'}."\", \"".
155 $hosts->{$host_key}->{'ip'}."\");";
156
157 $dbh->do($sql);
158 $hostID = $dbh->func('last_insert_rowid');
159
160 }
161 $st->finish();
162 print("processing host ".$hosts->{$host_key}->{'host'}.":\n");
163
164 # get backups for a host
165 my @backups = $bpc->BackupInfoRead($hostname);
166 foreach my $backup (@backups)
167 {
168 my $backupNum = $backup->{'num'};
169 my @backupShares = ();
170
171
172 if ($opt{u})
173 {
174 my $sql = q{
175 SELECT COUNT(*) AS broj
176 FROM backups
177 WHERE hostID=? AND
178 num=?
179 };
180
181 my $st = $dbh->prepare($sql);
182 $st->bind_param(1,$hostID);
183 $st->bind_param(2,$backupNum);
184 $st->execute();
185 my $tmp = $st->fetchrow_hashref();
186 $st->finish();
187 if ($tmp->{'broj'} > 0)
188 {
189 next;
190 }
191 }
192
193 print "\tprocessing backup no. $backupNum...";
194 my $sql =
195 q{
196 INSERT INTO backups (hostID, num, date, type)
197 VALUES
198 (}.$hostID.",". $backupNum.q{, }.$backup->{'endTime'}.",\"". $backup->{'type'}.q{");
199 };
200 $dbh->do($sql);
201
202 my $files = BackupPC::View->new($bpc, $hostname, \@backups);
203 @backupShares = $files->shareList($backupNum);
204 foreach my $share (@backupShares)
205 {
206 my @flattenedFiles = ();
207 clearBeenThereCache();
208 print "\n\t\tprocessing share ".$share."...";
209 $shareID = getShareID($share, $hostID, $hostname);
210
211 @flattenedFiles = recurseDir($bpc, $hostname, \@backups, $backupNum, $share, "");
212 print "done\n";
213 print "\t\tinserting data into db...";
214 foreach my $file (@flattenedFiles)
215 {
216 $dbh->do("INSERT INTO files(ID, shareID, backupNum, name, path, fullpath, date, type, size) VALUES "
217 ."( NULL, $shareID, "
218 .$backupNum.", \""
219 .$file->{'fileName'}."\", \""
220 .$file->{'relPath'}. "\", \""
221 .$file->{'fullPath'}."\", "
222 .$file->{'mtime'}.", "
223 .$file->{'type'}.", "
224 .$file->{'size'}.")"
225 );
226 }
227 print "done\n";
228 }
229 }
230 print "done.\n";
231 }
232 $dbh->commit();
233 $dbh->disconnect();
234
235
236 sub haveBeenThere
237 {
238 my ($where) = @_;
239
240 foreach my $st (@beenThere)
241 {
242 if ($where eq $st)
243 {
244 return 1;
245 }
246 }
247
248 push(@beenThere, $where);
249 return 0;
250 }
251
252 sub clearBeenThereCache
253 {
254 @beenThere = ();
255 }
256
257 sub getShareID()
258 {
259 my ($share, $hostID, $hostname) = @_;
260 my $tmp;
261
262 my $st = $dbh -> prepare(" SELECT shares.ID AS ID FROM shares WHERE hostID=? AND name=?");
263 $st -> execute($hostID,$share);
264 my $tmp = $st->fetchrow_hashref();
265 $st->finish();
266 if ($tmp)
267 {
268 return $tmp->{'ID'};
269 }
270 my $sql =
271 q{
272 INSERT INTO shares(ID,hostID,name,share,localpath)
273 VALUES
274 (NULL,}.
275 "$hostID,\"$share\",\"//$hostname$share\",NULL);";
276 $dbh->do($sql);
277 return $dbh->func('last_insert_rowid');
278 }
279
280 ####################################################
281 # recursing through filesystem structure and #
282 # and returning flattened files list #
283 ####################################################
284 sub recurseDir
285 {
286 my ($bpc, $hostname, $backups, $backupNo, $share, $dir) = @_;
287 my @ret = ();
288 my $files = BackupPC::View->new($bpc, $hostname, $backups);
289 my $filesInBackup = $files->dirAttrib($backupNo, $share, $dir);
290 my $file_key = "";
291
292
293 # first, add all the entries in current directory
294 foreach $file_key (keys %{$filesInBackup})
295 {
296 push(@ret, {
297 'fileName' => $file_key,
298 'relPath' => $filesInBackup->{$file_key}->{'relPath'},
299 'fullPath' => $filesInBackup->{$file_key}->{'fullPath'},
300 'sharePath'=> $filesInBackup->{$file_key}->{'sharePathM'},
301 'size' => $filesInBackup->{$file_key}->{'size'},
302 'mtime' => $filesInBackup->{$file_key}->{'mtime'},
303 'type' => $filesInBackup->{$file_key}->{'type'}
304 });
305 }
306
307 # then, recurse thru subfolders
308 foreach my $fold (@ret)
309 {
310 if ($fold->{'type'} == BPC_FTYPE_DIR &&
311 haveBeenThere($fold->{'relPath'}) != 1
312 )
313 {
314
315 push(@ret,
316 recurseDir($bpc, $hostname, $backups, $backupNo, $share, $fold->{'relPath'})
317 );
318 }
319 }
320 return @ret;
321 }
322

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26