/[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 16 by dpavlin, Mon Jul 11 11:51:09 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    
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'},                  });
                            'date'        => $tmp->{'date'},  
                            'type'        => $tmp->{'filetype'},  
                            'size'        => $tmp->{'size'},  
                            'id'          => $tmp->{'fid'},  
                            'dvd'         => $tmp->{'dvd'}  
                        }  
             );  
                                   
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 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          }          }
       $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.16  
changed lines
  Added in v.31

  ViewVC Help
Powered by ViewVC 1.1.26