/[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 51 by dpavlin, Sat Aug 20 16:40:11 2005 UTC revision 80 by dpavlin, Fri Aug 26 23:50:05 2005 UTC
# Line 7  use BackupPC::Attrib qw(:all); Line 7  use BackupPC::Attrib qw(:all);
7  use DBI;  use DBI;
8  use DateTime;  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;
# Line 15  my $dsn = $Conf{SearchDSN}; Line 16  my $dsn = $Conf{SearchDSN};
16  my $db_user = $Conf{SearchUser} || '';  my $db_user = $Conf{SearchUser} || '';
17    
18  sub getUnits() {  sub getUnits() {
19      my @ret = ();          my @ret;
20      my $tmp;  
21      my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
22      my $st =          my $sth = $dbh->prepare(qq{ SELECT id, share FROM shares ORDER BY share} );
23        $dbh->prepare(          $sth->execute();
24          " SELECT shares.ID AS ID, shares.share AS name FROM shares;");          push @ret, { 'id' => '', 'share' => '-'};       # dummy any
25      $st->execute();  
26      push (@ret, { 'ID' => '', 'name' => '-'});          while ( my $row = $sth->fetchrow_hashref() ) {
27      while ( $tmp = $st->fetchrow_hashref() ) {                  push @ret, $row;
28          push( @ret, { 'ID' => $tmp->{'ID'}, 'name' => $tmp->{'name'} } );          }
29      }          $dbh->disconnect();
30      $dbh->disconnect();          return @ret;
     return @ret;  
31  }  }
32    
33  sub epoch_to_iso {  sub epoch_to_iso {
34          my $t = shift || return;          my $t = shift || return;
35          my $dt = DateTime->from_epoch( epoch => $t ) || return;          my $iso = BackupPC::Lib::timeStamp($t);
36  print STDERR "$t == ",$dt->epoch,"\n";          $iso =~ s/\s/ /g;
37          return $dt->ymd . ' ' . $dt->hms;          return $iso;
38  }  }
39    
40  sub getWhere($) {  sub getWhere($) {
# Line 67  sub getWhere($) { Line 67  sub getWhere($) {
67          my $files_to = mk_epoch_date('search', 'to');          my $files_to = mk_epoch_date('search', 'to');
68          push @conditions, qq{ files.date <= $files_to } if ($files_to);          push @conditions, qq{ files.date <= $files_to } if ($files_to);
69    
70          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:",join(" | ",@conditions);          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, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
73    
74          push (@conditions, " upper(files.name) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});          push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
75    
76          return (          return (
77                  join(" and ", @conditions),                  join(" and ", @conditions),
# Line 94  sub getFiles($$) { Line 94  sub getFiles($$) {
94                  files.backupNum                 AS backupNum,                  files.backupNum                 AS backupNum,
95                  files.name                      AS filename,                  files.name                      AS filename,
96                  files.path                      AS filepath,                  files.path                      AS filepath,
                 shares.share||files.fullpath    AS networkPath,  
97                  files.date                      AS date,                  files.date                      AS date,
98                  files.type                      AS filetype,                  files.type                      AS filetype,
99                  files.size                      AS size,                  files.size                      AS size,
100                  dvds.name                       AS dvd                  -- dvds.name                    AS dvd
101                    null                            AS dvd
102          };          };
103    
104          my $sql_from = qq{          my $sql_from = qq{
105                  FROM files                  FROM files
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 AND backups.shareID = shares.ID
109                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid          };
110    
111            my $sql_dvd_from = qq{
112                            -- LEFT  JOIN dvds              ON dvds.ID = files.dvdid
113          };          };
114    
115          my $sql_where;          my $sql_where;
116          $sql_where = " WHERE ". $where if ($where);          $sql_where = " WHERE ". $where if ($where);
117    
118          my $sql_order = qq{          my $sql_order = qq{
119                  ORDER BY files.id                  ORDER BY files.date
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 147  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);
# Line 156  sub getFiles($$) { Line 167  sub getFiles($$) {
167  sub getBackupsNotBurned() {  sub getBackupsNotBurned() {
168    
169          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
170        my $sql = q{          my $sql = q{
171            SELECT          SELECT
172              hosts.ID         AS hostID,                  backups.hostID          AS hostid,
173              hosts.name       AS host,                  min(hosts.name)         AS host,
174              backups.num      AS backupno,                  backups.num             AS backupno,
175              backups.type     AS type,                  min(backups.type)       AS type,
176              backups.date     AS date                  min(backups.date)       AS date,
177            FROM backups, shares, files, hosts                  min(backups.size)       AS size
178            WHERE          FROM files
179              backups.num    = files.backupNum  AND                  INNER JOIN shares       ON files.shareID=shares.ID
180              shares.ID      = files.shareID    AND                            INNER JOIN hosts        ON hosts.ID = shares.hostID
181              backups.hostID = shares.hostID    AND                  INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
182              hosts.ID       = backups.hostID   AND          WHERE
183              files.dvdid    IS NULL                  files.dvdid     IS NULL
184            GROUP BY          GROUP BY
185              backups.hostID, backups.num                  backups.hostID, backups.num
186        };          ORDER BY min(backups.date)
187        my $st = $dbh -> prepare( $sql );          };
188        my @ret = ();          my $sth = $dbh->prepare( $sql );
189        $st -> execute();          my @ret;
190            $sth->execute();
191        while ( my $row = $st -> fetchrow_hashref() )  
192          {                    while ( my $row = $sth->fetchrow_hashref() ) {
193              push(@ret, {                  $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
194                           'host'     => $row->{'host'},                  $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
195                           'hostid'   => $row->{'hostID'},                  push @ret, $row;
                          'backupno' => $row->{'backupno'},  
                          'type'     => $row->{'type'},  
                          'date'     => $row->{'date'}  
                        }  
             );  
196          }          }
197                
198        return @ret;                return @ret;      
199    }  }
200    
201  sub displayBackupsGrid()  sub displayBackupsGrid()
202    {    {
# Line 224  EOF3 Line 230  EOF3
230                $retHTML.= q{<input type="hidden" value="burn" name="action">};                $retHTML.= q{<input type="hidden" value="burn" name="action">};
231                $retHTML .= q{<input type="hidden" value="results" name="search_results">};                $retHTML .= q{<input type="hidden" value="results" name="search_results">};
232          }          }
233          $retHTML .= qq{<table style="fview"><tr>};          $retHTML .= qq{
234                    <table style="fview" border="1" cellspacing="0" cellpadding="3">
235                    <tr class="tableheader">
236            };
237    
238          if ($addForm) {          if ($addForm) {
239              $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>";
240          }          }
241          $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{
242                    <td align="center">Host</td>
243                    <td align="center">Backup no</td>
244                    <td align="center">Type</td>
245                    <td align="center">date</td>
246                    <td align="center">age/days</td>
247                    <td align="center">size/MB</td>
248                    </tr>
249            };
250    
251          my @backups = getBackupsNotBurned();          my @backups = getBackupsNotBurned();
252          my $backup;          my $backup;
253    
254          if ($addForm) {          if ($addForm) {
255                  $retHTML .= qq{<tr><td colspan=7 style="tableheader">                  $retHTML .= qq{
256                            <tr><td colspan=7 style="tableheader">
257                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">
258                          </td></tr>};                          </td></tr>
259                    };
260          }          }
261    
262          foreach $backup(@backups) {          foreach $backup(@backups) {
# Line 246  EOF3 Line 265  EOF3
265                            
266                  $retHTML .= "<tr>";                  $retHTML .= "<tr>";
267                  if ($addForm) {                  if ($addForm) {
268                          $retHTML .= qq{<td class="fview"><input type="checkbox" name="fcb} .                          $retHTML .= '<td class="fview"><input type="checkbox" name="fcb' .
269                                  $backup->{'hostid'}."_".$backup->{'backupno'} .                                  $backup->{'hostid'}.'_'.$backup->{'backupno'} .
270                                  qq{" value="} . $backup->{'hostid'}."_".$backup->{'backupno'} .                                  '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupno'} .
271                                  qq{"></td>};                                  '"></td>';
272                  }                            }          
273                            
274                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
275                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .
276                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
277                          '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '<td>' .                          '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
278                            '<td class="fviewborder">' . $backup->{'age'} . '</td>' .
279                            '<td class="fviewborder">' . $backup->{'size'} . '</td>' .
280                          '</tr>';                          '</tr>';
281          }          }
282    
# Line 272  sub displayGrid($$$$) { Line 293  sub displayGrid($$$$) {
293          my ($where, $addForm, $offset, $hilite) = @_;          my ($where, $addForm, $offset, $hilite) = @_;
294          my $retHTML = "";          my $retHTML = "";
295    
296            my $start_t = time();
297    
298            my ($results, $files) = getFiles($where, $offset);
299    
300            my $dur_t = time() - $start_t;
301            my $dur = sprintf("%0.4fs", $dur_t);
302    
303            my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
304    
305            if ($results <= 0) {
306                    $retHTML .= qq{
307                            <p style="color: red;">No results found...</p>
308                    };
309                    return $retHTML;
310            } else {
311                    # DEBUG
312                    #use Data::Dumper;
313                    #$retHTML .= '<pre>' . Dumper($files) . '</pre>';
314            }
315    
316    
317          if ($addForm) {          if ($addForm) {
318                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};
319                  $retHTML.= qq{<input type="hidden" value="search" name="action">};                  $retHTML.= qq{<input type="hidden" value="search" name="action">};
320                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
321          }          }
322    
         my ($results, $files) = getFiles($where, $offset);  
   
         my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);  
323    
324          $retHTML .= qq{          $retHTML .= qq{
325          <br/>Found $results files, showing $from - $to          <div>
326          <table style="fview" width="100%">          Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
327                  <tr>          </div>
328                  <td class="tableheader">Share</td>          <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
329                  <td class="tableheader">Name</td>                  <tr class="fviewheader">
330                  <td class="tableheader">Type</td>                  <td align="center">Share</td>
331                  <td class="tableheader">#</td>                  <td align="center">Type and Name</td>
332                  <td class="tableheader">Size</td>                  <td align="center">#</td>
333                  <td class="tableheader">Date</td>                  <td align="center">Size</td>
334                  <td class="tableheader">Media</td>                  <td align="center">Date</td>
335                    <td align="center">Media</td>
336                  </tr>                  </tr>
337          };          };
338    
# Line 313  sub displayGrid($$$$) { Line 353  sub displayGrid($$$$) {
353    
354          foreach $file (@{ $files }) {          foreach $file (@{ $files }) {
355                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
356                  $retHTML .= "<tr>";                  $retHTML .= qq{<tr class="fviewborder">};
357    
358                  foreach my $v ((                  $retHTML .=
359                          $file->{'sharename'},                          qq{<td class="fviewborder" align="right">} . $file->{'sharename'} . qq{</td>} .
360                          qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),                          qq{<td class="fviewborder"><img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" alt="$typeStr" align="middle">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ) . qq{</td>} .
361                          $typeStr,                          qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupno'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'fpath'} )}, $file->{'backupno'} ) . qq{</td>} .
362                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),                          qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
363                          $file->{'size'},                          qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
364                          epoch_to_iso( $file->{'date'} ),                          qq{<td class="fviewborder">} . $file->{'dvd'} . qq{</td>};
                         $file->{'dvd'}  
                 )) {  
                         $retHTML .= qq{<td class="fviewborder">$v</td>};  
                 }  
365    
366                  $retHTML .= "</tr>";                  $retHTML .= "</tr>";
367          }          }

Legend:
Removed from v.51  
changed lines
  Added in v.80

  ViewVC Help
Powered by ViewVC 1.1.26