/[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 8 - (hide annotations)
Thu Jun 23 12:22:21 2005 UTC (18 years, 10 months ago) by dpavlin
File size: 7575 byte(s)
fix

1 dpavlin 8 #!/usr/local/bin/perl
2 dpavlin 6 $| = 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 dpavlin 8 $hosts = $bpc->HostInfoRead();
131     print Dumper($hosts);
132 dpavlin 6 my $hostID;
133     my $shareID;
134 dpavlin 8 foreach my $host_key (keys %{$hosts})
135 dpavlin 6 {
136 dpavlin 8 my $hostname = $hosts->{$host_key}->{'host'} || die "can't find host for $host_key";
137 dpavlin 6 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 dpavlin 8 if (my $tmp = $st->fetchrow_hashref())
145 dpavlin 6 {
146     $hostID = $tmp->{'ID'};
147     }
148     else
149     {
150     $sql = q{ INSERT INTO hosts ( ID, name, IP) VALUES (NULL,"}.
151     $hosts->{$host_key}->{'host'}."\", \"".
152     $hosts->{$host_key}->{'ip'}."\");";
153    
154     $dbh->do($sql);
155     $hostID = $dbh->func('last_insert_rowid');
156    
157     }
158     $st->finish();
159     print("processing host ".$hosts->{$host_key}->{'host'}.":\n");
160    
161     # get backups for a host
162     my @backups = $bpc->BackupInfoRead($hostname);
163     foreach my $backup (@backups)
164     {
165     my $backupNum = $backup->{'num'};
166     my @backupShares = ();
167    
168    
169     if ($opt{u})
170     {
171     my $sql = q{
172     SELECT COUNT(*) AS broj
173     FROM backups
174     WHERE hostID=? AND
175     num=?
176     };
177    
178     my $st = $dbh->prepare($sql);
179     $st->bind_param(1,$hostID);
180     $st->bind_param(2,$backupNum);
181     $st->execute();
182     my $tmp = $st->fetchrow_hashref();
183     $st->finish();
184     if ($tmp->{'broj'} > 0)
185     {
186     next;
187     }
188     }
189    
190     print "\tprocessing backup no. $backupNum...";
191     my $sql =
192     q{
193     INSERT INTO backups (hostID, num, date, type)
194     VALUES
195     (}.$hostID.",". $backupNum.q{, }.$backup->{'endTime'}.",\"". $backup->{'type'}.q{");
196     };
197     $dbh->do($sql);
198    
199     my $files = BackupPC::View->new($bpc, $hostname, \@backups);
200     @backupShares = $files->shareList($backupNum);
201     foreach my $share (@backupShares)
202     {
203     my @flattenedFiles = ();
204     clearBeenThereCache();
205     print "\n\t\tprocessing share ".$share."...";
206     $shareID = getShareID($share, $hostID, $hostname);
207    
208     @flattenedFiles = recurseDir($bpc, $hostname, \@backups, $backupNum, $share, "");
209     print "done\n";
210     print "\t\tinserting data into db...";
211     foreach my $file (@flattenedFiles)
212     {
213     $dbh->do("INSERT INTO files(ID, shareID, backupNum, name, path, fullpath, date, type, size) VALUES "
214     ."( NULL, $shareID, "
215     .$backupNum.", \""
216     .$file->{'fileName'}."\", \""
217     .$file->{'relPath'}. "\", \""
218     .$file->{'fullPath'}."\", "
219     .$file->{'mtime'}.", "
220     .$file->{'type'}.", "
221     .$file->{'size'}.")"
222     );
223     }
224     print "done\n";
225     }
226     }
227     print "done.\n";
228     }
229     $dbh->commit();
230     $dbh->disconnect();
231    
232    
233     sub haveBeenThere
234     {
235     my ($where) = @_;
236    
237     foreach my $st (@beenThere)
238     {
239     if ($where eq $st)
240     {
241     return 1;
242     }
243     }
244    
245     push(@beenThere, $where);
246     return 0;
247     }
248    
249     sub clearBeenThereCache
250     {
251     @beenThere = ();
252     }
253    
254     sub getShareID()
255     {
256     my ($share, $hostID, $hostname) = @_;
257     my $tmp;
258    
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();
262     $st->finish();
263     if ($tmp)
264     {
265     return $tmp->{'ID'};
266     }
267     my $sql =
268     q{
269     INSERT INTO shares(ID,hostID,name,share,localpath)
270     VALUES
271     (NULL,}.
272     "$hostID,\"$share\",\"//$hostname$share\",NULL);";
273     $dbh->do($sql);
274     return $dbh->func('last_insert_rowid');
275     }
276    
277     ####################################################
278     # recursing through filesystem structure and #
279     # and returning flattened files list #
280     ####################################################
281     sub recurseDir
282     {
283     my ($bpc, $hostname, $backups, $backupNo, $share, $dir) = @_;
284     my @ret = ();
285     my $files = BackupPC::View->new($bpc, $hostname, $backups);
286     my $filesInBackup = $files->dirAttrib($backupNo, $share, $dir);
287     my $file_key = "";
288    
289    
290     # first, add all the entries in current directory
291     foreach $file_key (keys %{$filesInBackup})
292     {
293     push(@ret, {
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'}
301     });
302     }
303    
304     # then, recurse thru subfolders
305     foreach my $fold (@ret)
306     {
307     if ($fold->{'type'} == BPC_FTYPE_DIR &&
308     haveBeenThere($fold->{'relPath'}) != 1
309     )
310     {
311    
312     push(@ret,
313     recurseDir($bpc, $hostname, $backups, $backupNo, $share, $fold->{'relPath'})
314     );
315     }
316     }
317     return @ret;
318     }
319    

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26