/[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 7 - (show annotations)
Thu Jun 23 10:14:10 2005 UTC (18 years, 10 months ago) by dpavlin
File size: 7561 byte(s)
removed backup

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

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26