--- trunk/bin/BackupPC_updatedb 2005/08/20 11:24:55 44 +++ trunk/bin/BackupPC_updatedb 2005/08/20 15:01:48 49 @@ -1,8 +1,9 @@ #!/usr/local/bin/perl -w use strict; -use DBI; use lib "__INSTALLDIR__/lib"; + +use DBI; use BackupPC::Lib; use BackupPC::View; use Data::Dumper; @@ -10,6 +11,7 @@ use Time::HiRes qw/time/; use File::Pid; use POSIX qw/strftime/; + use constant BPC_FTYPE_DIR => 5; my $debug = 0; @@ -35,8 +37,12 @@ my $beenThere = {}; my $dsn = "dbi:SQLite:dbname=$TopDir/$Conf{SearchDB}"; +my $user = ''; -my $dbh = DBI->connect($dsn, "", "", { RaiseError => 1, AutoCommit => 0 }); +# DEBUG option! +($dsn,$user) = qw/dbi:Pg:dbname=backuppc dpavlin/; + +my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 }); my %opt; @@ -56,11 +62,18 @@ ###################################create tables############################3 if ($opt{c}) { + sub do_index { + my $index = shift || return; + my ($table,$col,$unique) = split(/_/, $index); + $unique ||= ''; + $dbh->do(qq{ create $unique index $index on $table($col) }); + } + print "creating tables...\n"; $dbh->do(qq{ create table hosts ( - ID INTEGER PRIMARY KEY, + ID SERIAL PRIMARY KEY, name VARCHAR(30) NOT NULL, IP VARCHAR(15) ); @@ -68,7 +81,7 @@ $dbh->do(qq{ create table shares ( - ID INTEGER PRIMARY KEY, + ID SERIAL PRIMARY KEY, hostID INTEGER NOT NULL references hosts(id), name VARCHAR(30) NOT NULL, share VARCHAR(200) NOT NULL, @@ -80,15 +93,17 @@ create table backups ( hostID INTEGER NOT NULL references hosts(id), num INTEGER NOT NULL, - date DATE, - type CHAR(1), + date integer NOT NULL, + type CHAR(4) not null, PRIMARY KEY(hostID, num) ); }); + do_index('backups_num_unique'); + $dbh->do(qq{ create table dvds ( - ID INTEGER PRIMARY KEY, + ID SERIAL PRIMARY KEY, num INTEGER NOT NULL, name VARCHAR(255) NOT NULL, mjesto VARCHAR(255) @@ -97,20 +112,20 @@ $dbh->do(qq{ create table files ( - ID INTEGER NOT NULL PRIMARY KEY, + ID SERIAL PRIMARY KEY, shareID INTEGER NOT NULL references shares(id), backupNum INTEGER NOT NULL references backups(num), name VARCHAR(255) NOT NULL, path VARCHAR(255) NOT NULL, fullpath VARCHAR(255) NOT NULL, - date TIMESTAMP NOT NULL, + date integer NOT NULL, type INTEGER NOT NULL, size INTEGER NOT NULL, dvdid INTEGER references dvds(id) ); }); - print "creating indexes...\n"; + print "creating indexes:"; foreach my $index (qw( hosts_name @@ -124,20 +139,24 @@ files_date files_size )) { - my ($table,$col) = split(/_/, $index); - $dbh->do(qq{ create index $index on $table($col) }); + print " $index"; + do_index($index); } + print "...\n"; + $dbh->commit; } if ($opt{d}) { print "deleting "; - foreach my $table (qw(hosts shares files dvds backups)) { + foreach my $table (qw(files dvds backups shares hosts)) { print "$table "; $dbh->do(qq{ DELETE FROM $table }); } print " done...\n"; + + eval { $dbh->commit; }; } if ($opt{v}) { @@ -191,7 +210,7 @@ $hosts->{$host_key}->{'ip'} ); - $hostID = $dbh->func('last_insert_rowid'); + $hostID = $dbh->last_insert_id(undef,undef,'hosts',undef); } print("host ".$hosts->{$host_key}->{'host'}.": "); @@ -219,6 +238,14 @@ my ($broj) = $sth->{backups_broj}->fetchrow_array(); next if ($broj > 0); + $sth->{insert_backups}->execute( + $hostID, + $backupNum, + $backup->{'endTime'}, + $backup->{'type'} + ); + $dbh->commit(); + my $files = BackupPC::View->new($bpc, $hostname, \@backups, 1); foreach my $share ($files->shareList($backupNum)) { @@ -235,14 +262,6 @@ $dbh->commit(); } - $sth->{insert_backups}->execute( - $hostID, - $backupNum, - $backup->{'endTime'}, - $backup->{'type'} - ); - $dbh->commit(); - } } undef $sth; @@ -275,15 +294,20 @@ $drop_down =~ s#//+#/#g; $sth->{insert_share}->execute($hostID,$share, $drop_down ,undef); - return $dbh->func('last_insert_rowid'); + return $dbh->last_insert_id(undef,undef,'shares',undef); } sub found_in_db { - my ($shareID,undef,$name,$path,undef,$date,undef,$size) = @_; + my @data = @_; + shift @data; + + my ($key, $shareID,undef,$name,$path,undef,$date,undef,$size) = @_; + + return $beenThere->{$key} if (defined($beenThere->{$key})); $sth->{file_in_db} ||= $dbh->prepare(qq{ - SELECT count(*) FROM files + SELECT 1 FROM files WHERE shareID = ? and path = ? and name = ? and @@ -293,8 +317,12 @@ my @param = ($shareID,$path,$name,$date,$size); $sth->{file_in_db}->execute(@param); - my ($rows) = $sth->{file_in_db}->fetchrow_array(); -# print STDERR ( $rows ? '+' : '-' ), join(" ",@param), "\n"; + my $rows = $sth->{file_in_db}->rows; + print STDERR "## found_in_db ",( $rows ? '+' : '-' ), join(" ",@param), "\n" if ($debug >= 3); + + $beenThere->{$key}++; + + $sth->{'insert_files'}->execute(@data) unless ($rows); return $rows; } @@ -313,6 +341,7 @@ { # scope my @stack; + print STDERR "# dirAttrib($backupNum, $share, $dir)\n" if ($debug >= 2); my $filesInBackup = $files->dirAttrib($backupNum, $share, $dir); # first, add all the entries in current directory @@ -338,9 +367,9 @@ )); - if (! $beenThere->{$key} && ! found_in_db(@data)) { + if (! defined($beenThere->{$key}) && ! found_in_db($key, @data)) { print STDERR "# key: $key [", $beenThere->{$key},"]" if ($debug >= 2); - $sth->{'insert_files'}->execute(@data); + if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) { $new_dirs++; print STDERR " dir\n" if ($debug >= 2); @@ -349,7 +378,6 @@ print STDERR " file\n" if ($debug >= 2); } } - $beenThere->{$key}++; if ($filesInBackup->{$path_key}->{'type'} == BPC_FTYPE_DIR) { $nr_dirs++;