/[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 17 by dpavlin, Mon Jul 11 13:22:38 2005 UTC revision 31 by dpavlin, Sun Jul 31 16:16:55 2005 UTC
# Line 4  package BackupPC::SearchLib; Line 4  package BackupPC::SearchLib;
4  use strict;  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);
 use Data::Dumper;  
7  use DBI;  use DBI;
8    use vars qw(%In $MyURL);
9    
10    my $on_page = 100;
11    my $pager_pages = 10;
12    
13  sub getUnits() {  sub getUnits() {
14      my @ret = ();      my @ret = ();
# Line 25  sub getUnits() { Line 28  sub getUnits() {
28  }  }
29    
30  sub getWhere($) {  sub getWhere($) {
31      my ($param)    = @_;          my ($param)    = @_;
32      my $retSQL     = "";          my @conditions;
     my @conditions = ();  
     my $cond;  
33    
34                sub mk_iso_date($$) {
35                      my ($name,$suffix) = @_;
       
     if ( defined( $param->{'search_backup_day_from'} ) && $param->{'search_backup_day_from'} ne "") {  
         push( @conditions,  
             ' strftime("%d", datetime(backups.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_backup_day_from'} ."\"");  
     }  
     if ( defined( $param->{'search_backup_day_to'} ) && $param->{'search_backup_day_to'} ne "") {  
         push( @conditions,  
             ' strftime("%d", datetime(backups.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_backup_day_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_backup_month_from'} ) && $param->{'search_backup_month_from'} ne "") {  
         push( @conditions,  
             ' strftime("%m", datetime(backups.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_backup_month_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_backup_month_to'} ) && $param->{'search_backup_month_to'} ne "") {  
         push( @conditions,  
             ' strftime("%m", datetime(backups.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_backup_month_to'}  ."\"");  
     }  
     if ( defined( $param->{'search_backup_year_from'} ) && $param->{'search_backup_year_from'} ne "") {  
         push( @conditions,  
             ' strftime("%Y", datetime(backups.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_backup_year_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_backup_year_to'} ) && $param->{'search_backup_year_to'} ne "") {  
         push( @conditions,  
             ' strftime("%Y", datetime(backups.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_backup_year_to'}  ."\"");  
     }  
36    
37      if ( defined( $param->{'search_day_from'} )   && $param->{'search_day_from'} ne "" ) {                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;
38          push( @conditions,                  my $mm .= $param->{ $name . '_month_' . $suffix} ||
39              ' strftime("%d", datetime(files.date, "unixepoch","localtime")) >= "'                          ( $suffix eq 'from' ? 1 : 12);
40                . $param->{'search_day_from'}  ."\"");                  my $dd .= $param->{ $name . '_day_' . $suffix} ||
41      }                          ( $suffix eq 'from' ? 1 : 31);
42      if ( defined( $param->{'search_month_from'} ) && $param->{'search_month_from'} ne "") {                  return sprintf("%04d-%02d-%02d", $yyyy, $mm, $dd);
43          push( @conditions,          }
44              ' strftime("%m", datetime(files.date, "unixepoch","localtime")) >= "'  
45                . $param->{'search_month_from'}  ."\"");          my $backup_from = mk_iso_date('search_backup', 'from');
46      }          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') >= '$backup_from' } if ($backup_from);
47      if ( defined( $param->{'search_year_from'} ) && $param->{'search_year_from'} ne "") {          my $backup_to = mk_iso_date('search_backup', 'to');
48          push( @conditions,          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') <= '$backup_to' } if ($backup_to);
49              ' strftime("%Y", datetime(files.date, "unixepoch","localtime")) >= "'  
50                . $param->{'search_year_from'}  ."\"");          my $files_from = mk_iso_date('search', 'from');
51      }          push @conditions, qq{ date(files.date, 'unixepoch','localtime') >= '$files_from' } if ($files_from);
52      if ( defined( $param->{'search_day_to'} )   && $param->{'search_day_to'} ne "" ) {          my $files_to = mk_iso_date('search', 'to');
53          push( @conditions,          push @conditions, qq{ date(files.date, 'unixepoch','localtime') <= '$files_to' } if ($files_to);
             ' strftime("%d", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_day_to'}  ."\"");  
     }  
     if ( defined( $param->{'search_month_to'} ) && $param->{'search_month_to'} ne "" ) {  
         push( @conditions,  
             ' strftime("%m", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_month_to'} ."\"" );  
     }  
     if ( defined( $param->{'search_year_to'} )&& $param->{'search_year_to'} ne "" )  {  
         push( @conditions,  
             ' strftime("%Y", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_year_to'} ."\"");  
     }  
54    
55      if ( defined( $param->{'search_host'} ) && $param->{'search_host'} ne "") {          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:",join(" | ",@conditions);
       push( @conditions, ' backups.hostID = ' . $param->{'search_host'} );  
     }  
   
     if ( defined ($param->{'search_filename'}) && $param->{'search_filename'} ne "") {  
         push (@conditions, " files.name LIKE '".$param->{'search_filename'}."%'");  
         }  
56            
57      $retSQL = "";          push( @conditions, ' backups.hostID = ' . $param->{'search_host'} ) if ($param->{'search_host'});
     foreach $cond(@conditions)  
       {  
           if ($retSQL ne "")  
             {  
                 $retSQL .= " AND ";  
             }  
           $retSQL .= $cond;  
       }        
58    
59                push (@conditions, " upper(files.name) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
60      return $retSQL;  
61            return (
62                    join(" and ", @conditions),
63                    $files_from, $files_to,
64                    $backup_from, $backup_to
65            );
66  }  }
67    
68  sub getFiles($$)  
69    {  sub getFiles($$) {
70        my ($where, $offset) = @_;          my ($where, $offset) = @_;
71          
72                  my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",
73        my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",                  "", "", { RaiseError => 1, AutoCommit => 1 } );
74          "", "", { RaiseError => 1, AutoCommit => 1 } );  
75        my $sql =                    my $sql_cols = qq{
76          q{                    files.id                        AS fid,
77                  SELECT  files.id                        AS fid,                  hosts.name                      AS hname,
78                          hosts.name                      AS hname,                  shares.name                     AS sname,
79                          shares.name                     AS sname,                  shares.share                    AS sharename,
80                          shares.share                    AS sharename,                  files.backupNum                 AS backupNum,
81                          files.backupNum                 AS backupNum,                  files.name                      AS filename,
82                          files.name                      AS filename,                  files.path                      AS filepath,
83                          files.path                      AS filepath,                  shares.share||files.fullpath    AS networkPath,
84                          shares.share||files.fullpath    AS networkPath,                  date(files.date, 'unixepoch', 'localtime') AS date,
85                          date(files.date, 'unixepoch', 'localtime') AS date,                  files.type                      AS filetype,
86                          files.type                      AS filetype,                  files.size                      AS size,
87                          files.size                      AS size,                  dvds.name                       AS dvd
88                          dvds.name                       AS dvd          };
89    
90            my $sql_from = qq{
91                  FROM files                  FROM files
92                          INNER JOIN shares       ON files.shareID=shares.ID                          INNER JOIN shares       ON files.shareID=shares.ID
93                          INNER JOIN hosts        ON hosts.ID = shares.hostID                          INNER JOIN hosts        ON hosts.ID = shares.hostID
94                            INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID
95                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid
96            };          };
97    
98        if (defined($where) && $where ne "")          my $sql_where;
99          {          $sql_where = " WHERE ". $where if ($where);
             $sql .= " WHERE ". $where;        
         }  
100    
101        $sql .=          my $sql_order = qq{
102          q{                            ORDER BY files.id
103              ORDER BY files.id                          LIMIT $on_page
104                LIMIT 100                          OFFSET ?
               OFFSET ? * 100 + 1  
105          };          };
106          
107                  $offset ||= 0;
108                  $offset = ($offset * $on_page) + 1;
109        my $st = $dbh->prepare(  
110            $sql          my $sth = $dbh->prepare(qq{ select count(files.id) $sql_from $sql_where });
111            );              $sth->execute();
112        if (!defined($offset) && $offset ne "")  
113        {          my ($results) = $sth->fetchrow_array();
114          $st->bind_param(1, $offset);  
115        }          $sth = $dbh->prepare(qq{ select $sql_cols $sql_from $sql_where $sql_order });
116        else          $sth->execute( $offset );
117        {  
118          $st->bind_param(1,0);          my @ret;
119        }        
120        $st->execute;          while (my $row = $sth->fetchrow_hashref()) {
121                          push(@ret, {
122        my @ret = ();                          'hname'         => $row->{'hname'},
123        my $tmp;                          'sname'         => $row->{'sname'},
124                                  'sharename'     => $row->{'sharename'},
125        while ($tmp = $st->fetchrow_hashref())                          'backupno'      => $row->{'backupNum'},
126          {                          'fname'         => $row->{'filename'},
127              push(@ret, {                          'fpath'         => $row->{'filepath'},
128                             'hname'       => $tmp->{'hname'},                          'networkpath'   => $row->{'networkPath'},
129                             'sname'       => $tmp->{'sname'},                          'date'          => $row->{'date'},
130                             'sharename'   => $tmp->{'sharename'},                          'type'          => $row->{'filetype'},
131                             'backupno'    => $tmp->{'backupNum'},                          'size'          => $row->{'size'},
132                             'fname'       => $tmp->{'filename'},                          'id'            => $row->{'fid'},
133                             'fpath'       => $tmp->{'filepath'},                          'dvd'           => $row->{'dvd'}
134                             'networkpath' => $tmp->{'networkPath'},                  });
135                             'date'        => $tmp->{'date'},          }
136                             'type'        => $tmp->{'filetype'},        
137                             'size'        => $tmp->{'size'},          $sth->finish();
138                             'id'          => $tmp->{'fid'},          $dbh->disconnect();
139                             'dvd'         => $tmp->{'dvd'}          return ($results, \@ret);
140                         }  }
             );  
                                   
         }  
         
       $st->finish();  
       $dbh->disconnect();  
       return @ret;  
   }  
141    
142  sub getBackupsNotBurned()  sub getBackupsNotBurned()
143    {    {
# Line 224  sub getBackupsNotBurned() Line 164  sub getBackupsNotBurned()
164        my @ret = ();        my @ret = ();
165        $st -> execute();        $st -> execute();
166    
167        while ( my $tmp = $st -> fetchrow_hashref() )        while ( my $row = $st -> fetchrow_hashref() )
168          {                    {          
169              push(@ret, {              push(@ret, {
170                           'host'     => $tmp->{'host'},                           'host'     => $row->{'host'},
171                           'hostid'   => $tmp->{'hostID'},                           'hostid'   => $row->{'hostID'},
172                           'backupno' => $tmp->{'backupno'},                           'backupno' => $row->{'backupno'},
173                           'type'     => $tmp->{'type'},                           'type'     => $row->{'type'},
174                           'date'     => $tmp->{'date'}                           'date'     => $row->{'date'}
175                         }                         }
176              );              );
177          }          }
# Line 244  sub displayBackupsGrid() Line 184  sub displayBackupsGrid()
184        my $retHTML = "";        my $retHTML = "";
185        my $addForm = 1;        my $addForm = 1;
186                
187        if ($addForm)        if ($addForm) {
         {  
188    
189              $retHTML .= <<EOF3;              $retHTML .= <<EOF3;
190  <script language="javascript" type="text/javascript">  <script language="javascript" type="text/javascript">
# Line 268  sub displayBackupsGrid() Line 207  sub displayBackupsGrid()
207  //-->  //-->
208  </script>        </script>      
209  EOF3  EOF3
210                $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=burn\"";                $retHTML .= q{<form name="forma" method="GET" action="}."$MyURL"."?action=burn\"";
211                $retHTML.= q{<input type="hidden" value="burn" name="action">};                $retHTML.= q{<input type="hidden" value="burn" name="action">};
212                $retHTML .= q{<input type="hidden" value="results" name="search_results">};                $retHTML .= q{<input type="hidden" value="results" name="search_results">};
213          }          }
214        $retHTML .= "<table style=\"fview\">";          $retHTML .= qq{<table style="fview"><tr>};
215        $retHTML .= "<tr> ";  
216        if ($addForm)          if ($addForm) {
         {  
217              $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>";
218          }          }
219        $retHTML .=  "<td class=\"tableheader\">Host</td> <td class=\"tableheader\">Backup no</td> <td class=\"tableheader\">Type</td> <td class=\"tableheader\">date</td></tr>";          $retHTML .=  qq{<td class="tableheader">Host</td><td class="tableheader">Backup no</td><td class="tableheader">Type</td><td class="tableheader">date</td></tr>};
220        my @backups = getBackupsNotBurned();  
221        my $backup;          my @backups = getBackupsNotBurned();
222            my $backup;
223        if ($addForm)  
224          {          if ($addForm) {
225              $retHTML .= "<tr>";                  $retHTML .= qq{<tr><td colspan=7 style="tableheader">
226              $retHTML .= "<td colspan=7 style=\"tableheader\">";                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">
227              $retHTML .= "<input type=\"submit\" value=\"Burn selected backups on medium\" name=\"submitBurner\">";                          </td></tr>};
             $retHTML .= "</td>";  
             $retHTML .= "</tr>";  
               
228          }          }
229        foreach $backup(@backups)  
230          {          foreach $backup(@backups) {
231              my $ftype = "";  
232                    my $ftype = "";
233                            
234              $retHTML .= "<tr>";                  $retHTML .= "<tr>";
235              if ($addForm)                  if ($addForm) {
236                {                          $retHTML .= qq{<td class="fview"><input type="checkbox" name="fcb} .
237                    $retHTML .= "<td class=\"fview\"> <input type=\"checkbox\" name=\"fcb"                                  $backup->{'hostid'}."_".$backup->{'backupno'} .
238                      .$backup->{'hostid'}."_".$backup->{'backupno'}                                  qq{" value="} . $backup->{'hostid'}."_".$backup->{'backupno'} .
239                    ."\" value=\"".$backup->{'hostid'}."_".$backup->{'backupno'}."\"> </td>";                                  qq{"></td>};
240                }                      }          
241                            
242              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'host'} . "</td>";                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
243              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'backupno'} . "</td>";                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .
244              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'type'} . "</td>";                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
245              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'date'} . "<td>";                          '<td class="fviewborder">' . $backup->{'date'} . '<td>' .
246              $retHTML .= "</tr>";                          '</tr>';
247          }          }
248        $retHTML .= "</table>";  
249        if ($addForm)          $retHTML .= "</table>";
250         {  
251             $retHTML .= "</form>";          if ($addForm) {
252         }                  $retHTML .= "</form>";
253            }
254                
255        return $retHTML;          return $retHTML;
256      }      
     
   }        
257    
258  sub displayGrid($$$$) {  sub displayGrid($$$$) {
259          my ($where, $addForm, $offset, $hilite) = @_;          my ($where, $addForm, $offset, $hilite) = @_;
260          my $retHTML = "";          my $retHTML = "";
261    
262          if ($addForm) {          if ($addForm) {
263                  $retHTML .= qq{<form name="forma" method="POST" action="}.$MyURL.qq{?action=search">};                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};
264                  $retHTML.= qq{<input type="hidden" value="search" name="action">};                  $retHTML.= qq{<input type="hidden" value="search" name="action">};
265                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
266          }          }
267    
268            my ($results, $files) = getFiles($where, $offset);
269    
270            my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
271    
272          $retHTML .= qq{          $retHTML .= qq{
273            <br/>Found $results files, showing $from - $to
274          <table style="fview" width="100%">          <table style="fview" width="100%">
275                  <tr>                  <tr>
276                  <td class="tableheader">Host</td>                  <td class="tableheader">Share</td>
                 <td class="tableheader">Type</td>  
277                  <td class="tableheader">Name</td>                  <td class="tableheader">Name</td>
278                  <td class="tableheader">backup no.</td>                  <td class="tableheader">Type</td>
279                  <td class="tableheader">size</td>                  <td class="tableheader">#</td>
280                  <td class="tableheader">date</td>                  <td class="tableheader">Size</td>
281                    <td class="tableheader">Date</td>
282                  <td class="tableheader">Media</td>                  <td class="tableheader">Media</td>
283                  </tr>                  </tr>
284          };          };
285          my @files = getFiles($where, $offset);  
286          my $file;          my $file;
287    
288          sub hilite_html($$) {          sub hilite_html($$) {
# Line 350  sub displayGrid($$$$) { Line 291  sub displayGrid($$$$) {
291                  return $html;                  return $html;
292          }          }
293    
294          foreach $file (@files) {          sub restore_link($$$$$$) {
295                  my $ftype = "file";                  my $type = shift;
296                  $ftype = "dir" if ($file->{'type'} == BPC_FTYPE_DIR);                  my $action = 'RestoreFile';
297                    $action = 'browse' if (lc($type) eq 'dir');
298                    return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
299            }
300    
301            foreach $file (@{ $files }) {
302                    my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
303                  $retHTML .= "<tr>";                  $retHTML .= "<tr>";
304    
305                  foreach my $v ((                  foreach my $v ((
306                          $file->{'hname'},                          $file->{'sharename'},
307                          $ftype,                          qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),
308                          hilite_html( $file->{'fpath'}, $hilite ),                          $typeStr,
309                          $file->{'backupno'},                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),
310                          $file->{'size'},                          $file->{'size'},
311                          $file->{'date'},                          $file->{'date'},
312                          $file->{'dvd'}                          $file->{'dvd'}
# Line 372  sub displayGrid($$$$) { Line 318  sub displayGrid($$$$) {
318          }          }
319          $retHTML .= "</table>";          $retHTML .= "</table>";
320    
321          # skip pager          # all variables which has to be transfered
322          return $retHTML;          foreach my $n (qw/search_day_from search_month_from search_year_from search_day_to search_month_to search_year_to search_backup_day_from search_backup_month_from search_backup_year_from search_backup_day_to search_backup_month_to search_backup_year_to search_filename offset/) {
323                    $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
324            }
325    
326            my $del = '';
327            my $max_page = int( $results / $on_page );
328            my $page = 0;
329    
330          $retHTML .= "<INPUT TYPE=\"hidden\" VALUE=\"\" NAME=\"offset\">";          my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';
331          for (my $ii = 1; $ii <= $#files; $ii++) {  
332                  $retHTML .= "<a href = \"#\" onclick=\"document.forma.offset.value=$ii;document.forma.submit();\">$ii</a>";          $retHTML .= '<div style="text-align: center;">';
333                  if ($ii < $#files) {  
334                          $retHTML .= " | ";          if ($offset > 0) {
335                    $retHTML .= sprintf($link_fmt, $offset - 1, '&lt;&lt;') . ' ';
336            }
337    
338            while ($page <= $max_page) {
339                    if ($page == $offset) {
340                            $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
341                    } else {
342                            $retHTML .= $del . sprintf($link_fmt, $page, $page + 1);
343                    }
344    
345                    if ($page < $offset - $pager_pages && $page != 0) {
346                            $retHTML .= " ... ";
347                            $page = $offset - $pager_pages;
348                            $del = '';
349                    } elsif ($page > $offset + $pager_pages && $page != $max_page) {
350                            $retHTML .= " ... ";
351                            $page = $max_page;
352                            $del = '';
353                    } else {
354                            $del = ' | ';
355                            $page++;
356                  }                  }
357          }          }
358    
359            if ($offset < $max_page) {
360                    $retHTML .= ' ' . sprintf($link_fmt, $offset + 1, '&gt;&gt;');
361            }
362    
363            $retHTML .= "</div>";
364    
365          $retHTML .= "</form>" if ($addForm);          $retHTML .= "</form>" if ($addForm);
366          
367          return $retHTML;          return $retHTML;
368  }  }
369    

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

  ViewVC Help
Powered by ViewVC 1.1.26