/[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 9 by dpavlin, Thu Jun 23 12:36:22 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,          }
             ' strftime("%m", datetime(files.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_month_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_year_from'} ) && $param->{'search_year_from'} ne "") {  
         push( @conditions,  
             ' strftime("%Y", datetime(files.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_year_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_day_to'} )   && $param->{'search_day_to'} ne "" ) {  
         push( @conditions,  
             ' 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'} ."\"");  
     }  
44    
45      if ( defined( $param->{'search_host'} ) && $param->{'search_host'} ne "") {          my $backup_from = mk_iso_date('search_backup', 'from');
46        push( @conditions, ' backups.hostID = ' . $param->{'search_host'} );          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') >= '$backup_from' } if ($backup_from);
47      }          my $backup_to = mk_iso_date('search_backup', 'to');
48            push @conditions, qq{ date(backups.date, 'unixepoch','localtime') <= '$backup_to' } if ($backup_to);
49    
50            my $files_from = mk_iso_date('search', 'from');
51            push @conditions, qq{ date(files.date, 'unixepoch','localtime') >= '$files_from' } if ($files_from);
52            my $files_to = mk_iso_date('search', 'to');
53            push @conditions, qq{ date(files.date, 'unixepoch','localtime') <= '$files_to' } if ($files_to);
54    
55      if ( defined ($param->{'search_filename'}) && $param->{'search_filename'} ne "") {          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:",join(" | ",@conditions);
         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    
 sub getFiles($$)  
   {  
       my ($where, $offset) = @_;  
         
         
       my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",  
         "", "", { RaiseError => 1, AutoCommit => 1 } );  
       my $sql =            
         q{    
               SELECT files.id                       AS fid,  
                      hosts.name                     AS hname,  
                      shares.name                    AS sname,  
                      shares.share                   AS sharename,  
                      backups.num                    AS backupNum,  
                      files.name                     AS filename,  
                      files.path                     AS filepath,  
                      shares.share||files.fullpath AS networkPath,  
                      date(files.date, 'unixepoch', 'localtime') AS date,  
                      files.type                     AS filetype,  
                      files.size                     AS size,  
                      dvds.name                      AS dvd  
                   FROM  
                      files  
                         INNER JOIN shares  ON files.shareID=shares.ID  
                         INNER JOIN hosts   ON hosts.ID = shares.hostID  
                         INNER JOIN backups ON backups.hostID = hosts.ID  
                         LEFT  JOIN dvds    ON dvds.ID = files.dvdid  
               
           };  
68    
69        if (defined($where) && $where ne "")  sub getFiles($$) {
70          {          my ($where, $offset) = @_;
71              $sql .= " WHERE ". $where;        
72          }          my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",
73                    "", "", { RaiseError => 1, AutoCommit => 1 } );
74    
75        $sql .=          my $sql_cols = qq{
76          q{                            files.id                        AS fid,
77              ORDER BY files.id                  hosts.name                      AS hname,
78                LIMIT 100                  shares.name                     AS sname,
79                OFFSET ? * 100 + 1                  shares.share                    AS sharename,
80                    files.backupNum                 AS backupNum,
81                    files.name                      AS filename,
82                    files.path                      AS filepath,
83                    shares.share||files.fullpath    AS networkPath,
84                    date(files.date, 'unixepoch', 'localtime') AS date,
85                    files.type                      AS filetype,
86                    files.size                      AS size,
87                    dvds.name                       AS dvd
88          };          };
89          
90                  my $sql_from = qq{
91                          FROM files
92        my $st = $dbh->prepare(                          INNER JOIN shares       ON files.shareID=shares.ID
93            $sql                          INNER JOIN hosts        ON hosts.ID = shares.hostID
94            );                              INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID
95        if (!defined($offset) && $offset ne "")                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid
96        {          };
97          $st->bind_param(1, $offset);  
98        }          my $sql_where;
99        else          $sql_where = " WHERE ". $where if ($where);
100        {  
101          $st->bind_param(1,0);          my $sql_order = qq{
102        }                  ORDER BY files.id
103        $st->execute;                          LIMIT $on_page
104                                  OFFSET ?
105        my @ret = ();          };
106        my $tmp;  
107                  $offset ||= 0;
108        while ($tmp = $st->fetchrow_hashref())          $offset = ($offset * $on_page) + 1;
109          {  
110              push(@ret, {          my $sth = $dbh->prepare(qq{ select count(files.id) $sql_from $sql_where });
111                             'hname'       => $tmp->{'hname'},          $sth->execute();
112                             'sname'       => $tmp->{'sname'},  
113                             'sharename'   => $tmp->{'sharename'},          my ($results) = $sth->fetchrow_array();
114                             'backupno'    => $tmp->{'backupNum'},  
115                             'fname'       => $tmp->{'filename'},          $sth = $dbh->prepare(qq{ select $sql_cols $sql_from $sql_where $sql_order });
116                             'fpath'       => $tmp->{'filepath'},          $sth->execute( $offset );
117                             'networkpath' => $tmp->{'networkPath'},  
118                             'date'        => $tmp->{'date'},          my @ret;
119                             'type'        => $tmp->{'filetype'},        
120                             'size'        => $tmp->{'size'},          while (my $row = $sth->fetchrow_hashref()) {
121                             'id'          => $tmp->{'fid'},                  push(@ret, {
122                             'dvd'         => $tmp->{'dvd'}                          'hname'         => $row->{'hname'},
123                         }                          'sname'         => $row->{'sname'},
124              );                          'sharename'     => $row->{'sharename'},
125                                                            'backupno'      => $row->{'backupNum'},
126                            'fname'         => $row->{'filename'},
127                            'fpath'         => $row->{'filepath'},
128                            'networkpath'   => $row->{'networkPath'},
129                            'date'          => $row->{'date'},
130                            'type'          => $row->{'filetype'},
131                            'size'          => $row->{'size'},
132                            'id'            => $row->{'fid'},
133                            'dvd'           => $row->{'dvd'}
134                    });
135          }          }
136                
137        $st->finish();          $sth->finish();
138        $dbh->disconnect();          $dbh->disconnect();
139        return @ret;          return ($results, \@ret);
140    }  }
141    
142  sub getBackupsNotBurned()  sub getBackupsNotBurned()
143    {    {
# Line 227  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 247  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 271  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          }          }
       $retHTML .= "</table>";  
       if ($addForm)  
        {  
            $retHTML .= "</form>";  
        }  
         
       return $retHTML;  
     
     
   }        
248    
249  sub displayGrid($$$)          $retHTML .= "</table>";
250    {  
251        my ($where, $addForm, $offset) = @_;          if ($addForm) {
252        my $retHTML = "";                  $retHTML .= "</form>";
253            }
254                
255        if ($addForm)          return $retHTML;
256          {  }      
257                $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=search\"";  
258                $retHTML.= q{<input type="hidden" value="search" name="action">};  sub displayGrid($$$$) {
259                $retHTML .= q{<input type="hidden" value="results" name="search_results">};          my ($where, $addForm, $offset, $hilite) = @_;
260            my $retHTML = "";
261    
262            if ($addForm) {
263                    $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};
264                    $retHTML.= qq{<input type="hidden" value="search" name="action">};
265                    $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
266          }          }
267        $retHTML .= "<table style=\"fview\">";  
268        $retHTML .= "<tr> ";          my ($results, $files) = getFiles($where, $offset);
269        $retHTML .=  "<td class=\"tableheader\">Host</td> <td class=\"tableheader\">Name</td> <td class=\"tableheader\">Type</td> <td class=\"tableheader\">backup no.</td> <td class=\"tableheader\">size</td> <td class=\"tableheader\">date</td>  <td class=\"tableheader\">Media</td></tr>";  
270        my @files = getFiles($where, $offset);          my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
271        my $file;  
272            $retHTML .= qq{
273        foreach $file(@files)          <br/>Found $results files, showing $from - $to
274          {          <table style="fview" width="100%">
275              my $ftype = "";                  <tr>
276                                <td class="tableheader">Share</td>
277              if ($file->{'type'} == BPC_FTYPE_DIR)                  <td class="tableheader">Name</td>
278                {                  <td class="tableheader">Type</td>
279                    $ftype = "dir";                  <td class="tableheader">#</td>
280                }                  <td class="tableheader">Size</td>
281              else                  <td class="tableheader">Date</td>
282                {                  <td class="tableheader">Media</td>
283                    $ftype = "file";                  </tr>
284                }          };
285              $retHTML .= "<tr>";  
286              $retHTML .= "<td class=\"fviewborder\">" . $file->{'hname'} ."</td>";          my $file;
287              $retHTML .= "<td class=\"fviewborder\">" . $file->{'fname'} . "</td>";  
288              $retHTML .= "<td class=\"fviewborder\">" . $ftype . "</td>";          sub hilite_html($$) {
289              $retHTML .= "<td class=\"fviewborder\">" . $file->{'backupno'} . "</td>";                  my ($html, $search) = @_;
290              $retHTML .= "<td class=\"fviewborder\">" . $file->{'size'} . "</td>";                  $html =~ s#($search)#<b>$1</b>#gis;
291              $retHTML .= "<td class=\"fviewborder\">" . $file->{'date'} . "</td>";                  return $html;
             $retHTML .= "<td class=\"fviewborder\">" . $file->{'dvd'} . "</td>";  
             $retHTML .= "</tr>";  
292          }          }
       $retHTML .= "</table>";  
293    
294                  sub restore_link($$$$$$) {
295                    my $type = shift;
296                    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        $retHTML .= "<INPUT TYPE=\"hidden\" VALUE=\"\" NAME=\"offset\">";          foreach $file (@{ $files }) {
302        for (my $ii = 1; $ii <= $#files; $ii++)                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
303        {                  $retHTML .= "<tr>";
304            $retHTML .= "<a href = \"#\" onclick=\"document.forma.offset.value=$ii;document.forma.submit();\">$ii</a>";  
305            if ($ii < $#files)                  foreach my $v ((
306              {                          $file->{'sharename'},
307                  $retHTML .= " | ";                          qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),
308              }                          $typeStr,
309        }                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),
310                            $file->{'size'},
311                            $file->{'date'},
312                            $file->{'dvd'}
313                    )) {
314                            $retHTML .= qq{<td class="fviewborder">$v</td>};
315                    }
316    
317                    $retHTML .= "</tr>";
318            }
319            $retHTML .= "</table>";
320    
321         if ($addForm)          # all variables which has to be transfered
322         {          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 .= "</form>";                  $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
324         }          }
325          
326        return $retHTML;          my $del = '';
327    }          my $max_page = int( $results / $on_page );
328            my $page = 0;
329    
330            my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';
331    
332            $retHTML .= '<div style="text-align: center;">';
333    
334            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);
366    
367            return $retHTML;
368    }
369    
370  1;  1;

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

  ViewVC Help
Powered by ViewVC 1.1.26