/[BackupPC]/trunk/lib/BackupPC/SearchLib.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/lib/BackupPC/SearchLib.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 31 by dpavlin, Sun Jul 31 16:16:55 2005 UTC revision 59 by dpavlin, Sun Aug 21 15:29:24 2005 UTC
# Line 5  use strict; Line 5  use strict;
5  use BackupPC::CGI::Lib qw(:all);  use BackupPC::CGI::Lib qw(:all);
6  use BackupPC::Attrib qw(:all);  use BackupPC::Attrib qw(:all);
7  use DBI;  use DBI;
8    use DateTime;
9  use vars qw(%In $MyURL);  use vars qw(%In $MyURL);
10    use Time::HiRes qw/time/;
11    
12  my $on_page = 100;  my $on_page = 100;
13  my $pager_pages = 10;  my $pager_pages = 10;
14    
15    my $dsn = $Conf{SearchDSN};
16    my $db_user = $Conf{SearchUser} || '';
17    
18  sub getUnits() {  sub getUnits() {
19      my @ret = ();          my @ret;
20      my $tmp;  
21      my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
22          "", "", { RaiseError => 1, AutoCommit => 1 } );          my $sth = $dbh->prepare(qq{ SELECT id, share FROM shares} );
23      my $st =          $sth->execute();
24        $dbh->prepare(          push @ret, { 'id' => '', 'share' => '-'};       # dummy any
25          " SELECT shares.ID AS ID, shares.share AS name FROM shares;");  
26      $st->execute();          while ( my $row = $sth->fetchrow_hashref() ) {
27      push (@ret, { 'ID' => '', 'name' => '-'});                  push @ret, $row;
28      while ( $tmp = $st->fetchrow_hashref() ) {          }
29          push( @ret, { 'ID' => $tmp->{'ID'}, 'name' => $tmp->{'name'} } );          $dbh->disconnect();
30      }          return @ret;
31      $dbh->disconnect();  }
32      return @ret;  
33    sub epoch_to_iso {
34            my $t = shift || return;
35            my $dt = DateTime->from_epoch( epoch => $t ) || return;
36            print STDERR "BUG: $t != " . $dt->epoch . "\n" unless ($t == $dt->epoch);
37            return $dt->ymd . ' ' . $dt->hms;
38  }  }
39    
40  sub getWhere($) {  sub getWhere($) {
41          my ($param)    = @_;          my ($param)    = @_;
42          my @conditions;          my @conditions;
43    
44          sub mk_iso_date($$) {          sub mk_epoch_date($$) {
45                  my ($name,$suffix) = @_;                  my ($name,$suffix) = @_;
46    
47                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;
# Line 39  sub getWhere($) { Line 49  sub getWhere($) {
49                          ( $suffix eq 'from' ? 1 : 12);                          ( $suffix eq 'from' ? 1 : 12);
50                  my $dd .= $param->{ $name . '_day_' . $suffix} ||                  my $dd .= $param->{ $name . '_day_' . $suffix} ||
51                          ( $suffix eq 'from' ? 1 : 31);                          ( $suffix eq 'from' ? 1 : 31);
52                  return sprintf("%04d-%02d-%02d", $yyyy, $mm, $dd);                  my $dt = new DateTime(
53          }                          year => $yyyy,
54                            month => $mm,
55                            day => $dd
56                    );
57                    return $dt->epoch || 'NULL';
58            }
59    
60            my $backup_from = mk_epoch_date('search_backup', 'from');
61            push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
62            my $backup_to = mk_epoch_date('search_backup', 'to');
63            push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
64    
65            my $files_from = mk_epoch_date('search', 'from');
66            push @conditions, qq{ files.date >= $files_from } if ($files_from);
67            my $files_to = mk_epoch_date('search', 'to');
68            push @conditions, qq{ files.date <= $files_to } if ($files_to);
69    
70          my $backup_from = mk_iso_date('search_backup', 'from');          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" | ",@conditions);
         push @conditions, qq{ date(backups.date, 'unixepoch','localtime') >= '$backup_from' } if ($backup_from);  
         my $backup_to = mk_iso_date('search_backup', 'to');  
         push @conditions, qq{ date(backups.date, 'unixepoch','localtime') <= '$backup_to' } if ($backup_to);  
   
         my $files_from = mk_iso_date('search', 'from');  
         push @conditions, qq{ date(files.date, 'unixepoch','localtime') >= '$files_from' } if ($files_from);  
         my $files_to = mk_iso_date('search', 'to');  
         push @conditions, qq{ date(files.date, 'unixepoch','localtime') <= '$files_to' } if ($files_to);  
   
         print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:",join(" | ",@conditions);  
71            
72          push( @conditions, ' backups.hostID = ' . $param->{'search_host'} ) if ($param->{'search_host'});          push( @conditions, ' backups.hostID = ' . $param->{'search_host'} ) if ($param->{'search_host'});
73    
# Line 69  sub getWhere($) { Line 84  sub getWhere($) {
84  sub getFiles($$) {  sub getFiles($$) {
85          my ($where, $offset) = @_;          my ($where, $offset) = @_;
86    
87          my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
                 "", "", { RaiseError => 1, AutoCommit => 1 } );  
88    
89          my $sql_cols = qq{          my $sql_cols = qq{
90                  files.id                        AS fid,                  files.id                        AS fid,
# Line 81  sub getFiles($$) { Line 95  sub getFiles($$) {
95                  files.name                      AS filename,                  files.name                      AS filename,
96                  files.path                      AS filepath,                  files.path                      AS filepath,
97                  shares.share||files.fullpath    AS networkPath,                  shares.share||files.fullpath    AS networkPath,
98                  date(files.date, 'unixepoch', 'localtime') AS date,                  files.date                      AS date,
99                  files.type                      AS filetype,                  files.type                      AS filetype,
100                  files.size                      AS size,                  files.size                      AS size,
101                  dvds.name                       AS dvd                  dvds.name                       AS dvd
# Line 92  sub getFiles($$) { Line 106  sub getFiles($$) {
106                          INNER JOIN shares       ON files.shareID=shares.ID                          INNER JOIN shares       ON files.shareID=shares.ID
107                          INNER JOIN hosts        ON hosts.ID = shares.hostID                          INNER JOIN hosts        ON hosts.ID = shares.hostID
108                          INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID                          INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID
109            };
110    
111            my $sql_dvd_from = qq{
112                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid
113          };          };
114    
# Line 100  sub getFiles($$) { Line 117  sub getFiles($$) {
117    
118          my $sql_order = qq{          my $sql_order = qq{
119                  ORDER BY files.id                  ORDER BY files.id
120                          LIMIT $on_page                  LIMIT $on_page
121                          OFFSET ?                  OFFSET ?
122          };          };
123    
124            my $sql_count = qq{ select count(files.id) $sql_from $sql_where };
125            my $sql_results = qq{ select $sql_cols $sql_from $sql_dvd_from $sql_where $sql_order };
126    
127          $offset ||= 0;          $offset ||= 0;
128          $offset = ($offset * $on_page) + 1;          $offset = ($offset * $on_page);
129    
130          my $sth = $dbh->prepare(qq{ select count(files.id) $sql_from $sql_where });          my $sth = $dbh->prepare($sql_count);
131          $sth->execute();          $sth->execute();
   
132          my ($results) = $sth->fetchrow_array();          my ($results) = $sth->fetchrow_array();
133    
134          $sth = $dbh->prepare(qq{ select $sql_cols $sql_from $sql_where $sql_order });          $sth = $dbh->prepare($sql_results);
135          $sth->execute( $offset );          $sth->execute( $offset );
136    
137            if ($sth->rows != $results) {
138                    my $bug = "$0 BUG: [[ $sql_count ]] = $results while [[ $sql_results ]] = " . $sth->rows;
139                    $bug =~ s/\s+/ /gs;
140                    print STDERR "$bug\n";
141            }
142    
143          my @ret;          my @ret;
144                
145          while (my $row = $sth->fetchrow_hashref()) {          while (my $row = $sth->fetchrow_hashref()) {
# Line 122  sub getFiles($$) { Line 147  sub getFiles($$) {
147                          'hname'         => $row->{'hname'},                          'hname'         => $row->{'hname'},
148                          'sname'         => $row->{'sname'},                          'sname'         => $row->{'sname'},
149                          'sharename'     => $row->{'sharename'},                          'sharename'     => $row->{'sharename'},
150                          'backupno'      => $row->{'backupNum'},                          'backupno'      => $row->{'backupnum'},
151                          'fname'         => $row->{'filename'},                          'fname'         => $row->{'filename'},
152                          'fpath'         => $row->{'filepath'},                          'fpath'         => $row->{'filepath'},
153                          'networkpath'   => $row->{'networkPath'},                          'networkpath'   => $row->{'networkpath'},
154                          'date'          => $row->{'date'},                          'date'          => $row->{'date'},
155                          'type'          => $row->{'filetype'},                          'type'          => $row->{'filetype'},
156                          'size'          => $row->{'size'},                          'size'          => $row->{'size'},
# Line 133  sub getFiles($$) { Line 158  sub getFiles($$) {
158                          'dvd'           => $row->{'dvd'}                          'dvd'           => $row->{'dvd'}
159                  });                  });
160          }          }
161              
162          $sth->finish();          $sth->finish();
163          $dbh->disconnect();          $dbh->disconnect();
164          return ($results, \@ret);          return ($results, \@ret);
165  }  }
166    
167  sub getBackupsNotBurned()  sub getBackupsNotBurned() {
168    {  
169        my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
170          "", "", { RaiseError => 1, AutoCommit => 1 } );                my $sql = q{
171        my $sql = q{          SELECT
172            SELECT                  hosts.ID                AS hostid,
173              hosts.ID         AS hostID,                  min(hosts.name)         AS host,
174              hosts.name       AS host,                  backups.num             AS backupno,
175              backups.num      AS backupno,                  min(backups.type)       AS type,
176              backups.type     AS type,                  min(backups.date)       AS date
177              backups.date     AS date          FROM backups, shares, files, hosts
178            FROM backups, shares, files, hosts          WHERE
179            WHERE                  backups.num     = files.backupNum       AND
180              backups.num    = files.backupNum  AND                  shares.ID       = files.shareID         AND        
181              shares.ID      = files.shareID    AND                            backups.hostID  = shares.hostID         AND
182              backups.hostID = shares.hostID    AND                  hosts.ID        = backups.hostID        AND
183              hosts.ID       = backups.hostID   AND                  files.dvdid     IS NULL
184              files.dvdid    IS NULL          GROUP BY
185            GROUP BY                  backups.hostID, backups.num, hosts.id
186              backups.hostID, backups.num          ORDER BY min(backups.date)
187        };          };
188        my $st = $dbh -> prepare( $sql );          my $sth = $dbh->prepare( $sql );
189        my @ret = ();          my @ret;
190        $st -> execute();          $sth->execute();
191    
192        while ( my $row = $st -> fetchrow_hashref() )          while ( my $row = $sth->fetchrow_hashref() ) {      
193          {                            push(@ret, {
194              push(@ret, {                           'host'         => $row->{'host'},
195                           'host'     => $row->{'host'},                           'hostid'       => $row->{'hostid'},
196                           'hostid'   => $row->{'hostID'},                           'backupno'     => $row->{'backupno'},
197                           'backupno' => $row->{'backupno'},                           'type'         => $row->{'type'},
198                           'type'     => $row->{'type'},                           'date'         => $row->{'date'},
199                           'date'     => $row->{'date'}                           'age'          => sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) ),
200                         }                         }
201              );                  );
202          }          }
203                
204        return @ret;                return @ret;      
205    }  }
206    
207  sub displayBackupsGrid()  sub displayBackupsGrid()
208    {    {
# Line 216  EOF3 Line 241  EOF3
241          if ($addForm) {          if ($addForm) {
242              $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";              $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";
243          }          }
244          $retHTML .=  qq{<td class="tableheader">Host</td><td class="tableheader">Backup no</td><td class="tableheader">Type</td><td class="tableheader">date</td></tr>};          $retHTML .=  qq{
245                    <td class="tableheader">Host</td>
246                    <td class="tableheader">Backup no</td>
247                    <td class="tableheader">Type</td>
248                    <td class="tableheader">date</td>
249                    <td class="tableheader">age/days</td>
250                    </tr>
251            };
252    
253          my @backups = getBackupsNotBurned();          my @backups = getBackupsNotBurned();
254          my $backup;          my $backup;
255    
256          if ($addForm) {          if ($addForm) {
257                  $retHTML .= qq{<tr><td colspan=7 style="tableheader">                  $retHTML .= qq{
258                            <tr><td colspan=7 style="tableheader">
259                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">
260                          </td></tr>};                          </td></tr>
261                    };
262          }          }
263    
264          foreach $backup(@backups) {          foreach $backup(@backups) {
# Line 233  EOF3 Line 267  EOF3
267                            
268                  $retHTML .= "<tr>";                  $retHTML .= "<tr>";
269                  if ($addForm) {                  if ($addForm) {
270                          $retHTML .= qq{<td class="fview"><input type="checkbox" name="fcb} .                          $retHTML .= '<td class="fview"><input type="checkbox" name="fcb' .
271                                  $backup->{'hostid'}."_".$backup->{'backupno'} .                                  $backup->{'hostid'}.'_'.$backup->{'backupno'} .
272                                  qq{" value="} . $backup->{'hostid'}."_".$backup->{'backupno'} .                                  '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupno'} .
273                                  qq{"></td>};                                  '"></td>';
274                  }                            }          
275                            
276                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
277                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .
278                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
279                          '<td class="fviewborder">' . $backup->{'date'} . '<td>' .                          '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
280                            '<td class="fviewborder">' . $backup->{'age'} . '</td>' .
281                          '</tr>';                          '</tr>';
282          }          }
283    
# Line 259  sub displayGrid($$$$) { Line 294  sub displayGrid($$$$) {
294          my ($where, $addForm, $offset, $hilite) = @_;          my ($where, $addForm, $offset, $hilite) = @_;
295          my $retHTML = "";          my $retHTML = "";
296    
297            my $start_t = time();
298    
299            my ($results, $files) = getFiles($where, $offset);
300    
301            my $dur_t = time() - $start_t;
302            my $dur = sprintf("%0.4fs", $dur_t);
303    
304            my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
305    
306            if ($results <= 0) {
307                    $retHTML .= qq{
308                            <p style="color: red;">No results found...</p>
309                    };
310                    return $retHTML;
311            } else {
312                    # DEBUG
313                    #use Data::Dumper;
314                    #$retHTML .= '<pre>' . Dumper($files) . '</pre>';
315            }
316    
317    
318          if ($addForm) {          if ($addForm) {
319                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};
320                  $retHTML.= qq{<input type="hidden" value="search" name="action">};                  $retHTML.= qq{<input type="hidden" value="search" name="action">};
321                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
322          }          }
323    
         my ($results, $files) = getFiles($where, $offset);  
   
         my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);  
324    
325          $retHTML .= qq{          $retHTML .= qq{
326          <br/>Found $results files, showing $from - $to          <br/>Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
327          <table style="fview" width="100%">          <table style="fview" width="100%">
328                  <tr>                  <tr>
329                  <td class="tableheader">Share</td>                  <td class="tableheader">Share</td>
# Line 308  sub displayGrid($$$$) { Line 361  sub displayGrid($$$$) {
361                          $typeStr,                          $typeStr,
362                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),
363                          $file->{'size'},                          $file->{'size'},
364                          $file->{'date'},                          epoch_to_iso( $file->{'date'} ),
365                          $file->{'dvd'}                          $file->{'dvd'}
366                  )) {                  )) {
367                          $retHTML .= qq{<td class="fviewborder">$v</td>};                          $retHTML .= qq{<td class="fviewborder">$v</td>};

Legend:
Removed from v.31  
changed lines
  Added in v.59

  ViewVC Help
Powered by ViewVC 1.1.26