/[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 19 by dpavlin, Mon Jul 11 14:32:40 2005 UTC revision 51 by dpavlin, Sat Aug 20 16:40:11 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 DateTime;
9    use vars qw(%In $MyURL);
10    
11    my $on_page = 100;
12    my $pager_pages = 10;
13    
14    my $dsn = $Conf{SearchDSN};
15    my $db_user = $Conf{SearchUser} || '';
16    
17  sub getUnits() {  sub getUnits() {
18      my @ret = ();      my @ret = ();
19      my $tmp;      my $tmp;
20      my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",      my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
         "", "", { RaiseError => 1, AutoCommit => 1 } );  
21      my $st =      my $st =
22        $dbh->prepare(        $dbh->prepare(
23          " SELECT shares.ID AS ID, shares.share AS name FROM shares;");          " SELECT shares.ID AS ID, shares.share AS name FROM shares;");
# Line 24  sub getUnits() { Line 30  sub getUnits() {
30      return @ret;      return @ret;
31  }  }
32    
33    sub epoch_to_iso {
34            my $t = shift || return;
35            my $dt = DateTime->from_epoch( epoch => $t ) || return;
36    print STDERR "$t == ",$dt->epoch,"\n";
37            return $dt->ymd . ' ' . $dt->hms;
38    }
39    
40  sub getWhere($) {  sub getWhere($) {
41          my ($param)    = @_;          my ($param)    = @_;
42          my @conditions;          my @conditions;
43    
44          sub mk_iso_date($$) {          sub mk_epoch_date($$) {
45                  my ($name,$suffix) = @_;                  my ($name,$suffix) = @_;
46    
47                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;
# Line 36  sub getWhere($) { Line 49  sub getWhere($) {
49                          ( $suffix eq 'from' ? 1 : 12);                          ( $suffix eq 'from' ? 1 : 12);
50                  my $dd .= $param->{ $name . '_day_' . $suffix} ||                  my $dd .= $param->{ $name . '_day_' . $suffix} ||
51                          ( $suffix eq 'from' ? 1 : 31);                          ( $suffix eq 'from' ? 1 : 31);
52                  return sprintf("%04d-%02d-%02d", $yyyy, $mm, $dd);                  my $dt = new DateTime(
53          }                          year => $yyyy,
54                            month => $mm,
55          my $backup_from = mk_iso_date('search_backup', 'from');                          day => $dd
56          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') >= '$backup_from' } if ($backup_from);                  );
57          my $backup_to = mk_iso_date('search_backup', 'to');                  return $dt->epoch || 'NULL';
58          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') <= '$backup_to' } if ($backup_to);          }
59    
60          my $files_from = mk_iso_date('search', 'from');          my $backup_from = mk_epoch_date('search_backup', 'from');
61          push @conditions, qq{ date(files.date, 'unixepoch','localtime') >= '$files_from' } if ($files_from);          push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
62          my $files_to = mk_iso_date('search', 'to');          my $backup_to = mk_epoch_date('search_backup', 'to');
63          push @conditions, qq{ date(files.date, 'unixepoch','localtime') <= '$files_to' } if ($files_to);          push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
64    
65            my $files_from = mk_epoch_date('search', 'from');
66            push @conditions, qq{ files.date >= $files_from } if ($files_from);
67            my $files_to = mk_epoch_date('search', 'to');
68            push @conditions, qq{ files.date <= $files_to } if ($files_to);
69    
70          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, ' backups.hostID = ' . $param->{'search_host'} ) if ($param->{'search_host'});
73    
74          push (@conditions, " files.name LIKE '".$param->{'search_filename'}."%'") if ($param->{'search_filename'});          push (@conditions, " upper(files.name) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
75    
76          return (          return (
77                  join(" and ", @conditions),                  join(" and ", @conditions),
# Line 63  sub getWhere($) { Line 81  sub getWhere($) {
81  }  }
82    
83    
84  sub getFiles($$)  sub getFiles($$) {
85    {          my ($where, $offset) = @_;
86        my ($where, $offset) = @_;  
87                  my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
88          
89        my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $sql_cols = qq{
90          "", "", { RaiseError => 1, AutoCommit => 1 } );                  files.id                        AS fid,
91        my $sql =                            hosts.name                      AS hname,
92          q{                    shares.name                     AS sname,
93                  SELECT  files.id                        AS fid,                  shares.share                    AS sharename,
94                          hosts.name                      AS hname,                  files.backupNum                 AS backupNum,
95                          shares.name                     AS sname,                  files.name                      AS filename,
96                          shares.share                    AS sharename,                  files.path                      AS filepath,
97                          files.backupNum                 AS backupNum,                  shares.share||files.fullpath    AS networkPath,
98                          files.name                      AS filename,                  files.date                      AS date,
99                          files.path                      AS filepath,                  files.type                      AS filetype,
100                          shares.share||files.fullpath    AS networkPath,                  files.size                      AS size,
101                          date(files.date, 'unixepoch', 'localtime') AS date,                  dvds.name                       AS dvd
102                          files.type                      AS filetype,          };
103                          files.size                      AS size,  
104                          dvds.name                       AS dvd          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                          INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID
109                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid
110            };          };
111    
112        if (defined($where) && $where ne "")          my $sql_where;
113          {          $sql_where = " WHERE ". $where if ($where);
             $sql .= " WHERE ". $where;        
         }  
114    
115        $sql .=          my $sql_order = qq{
116          q{                            ORDER BY files.id
117              ORDER BY files.id                          LIMIT $on_page
118                LIMIT 100                          OFFSET ?
               OFFSET ? * 100 + 1  
119          };          };
         
         
         
       my $st = $dbh->prepare(  
           $sql  
           );      
       if (!defined($offset) && $offset ne "")  
       {  
         $st->bind_param(1, $offset);  
       }  
       else  
       {  
         $st->bind_param(1,0);  
       }  
       $st->execute;  
         
       my @ret = ();  
       my $tmp;  
         
       while ($tmp = $st->fetchrow_hashref())  
         {  
             push(@ret, {  
                            'hname'       => $tmp->{'hname'},  
                            'sname'       => $tmp->{'sname'},  
                            'sharename'   => $tmp->{'sharename'},  
                            'backupno'    => $tmp->{'backupNum'},  
                            'fname'       => $tmp->{'filename'},  
                            'fpath'       => $tmp->{'filepath'},  
                            'networkpath' => $tmp->{'networkPath'},  
                            'date'        => $tmp->{'date'},  
                            'type'        => $tmp->{'filetype'},  
                            'size'        => $tmp->{'size'},  
                            'id'          => $tmp->{'fid'},  
                            'dvd'         => $tmp->{'dvd'}  
                        }  
             );  
                                   
         }  
         
       $st->finish();  
       $dbh->disconnect();  
       return @ret;  
   }  
120    
121  sub getBackupsNotBurned()          $offset ||= 0;
122    {          $offset = ($offset * $on_page) + 1;
123        my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",  
124          "", "", { RaiseError => 1, AutoCommit => 1 } );                my $sth = $dbh->prepare(qq{ select count(files.id) $sql_from $sql_where });
125            $sth->execute();
126    
127            my ($results) = $sth->fetchrow_array();
128    
129            $sth = $dbh->prepare(qq{ select $sql_cols $sql_from $sql_where $sql_order });
130            $sth->execute( $offset );
131    
132            my @ret;
133          
134            while (my $row = $sth->fetchrow_hashref()) {
135                    push(@ret, {
136                            'hname'         => $row->{'hname'},
137                            'sname'         => $row->{'sname'},
138                            'sharename'     => $row->{'sharename'},
139                            'backupno'      => $row->{'backupnum'},
140                            'fname'         => $row->{'filename'},
141                            'fpath'         => $row->{'filepath'},
142                            'networkpath'   => $row->{'networkpath'},
143                            'date'          => $row->{'date'},
144                            'type'          => $row->{'filetype'},
145                            'size'          => $row->{'size'},
146                            'id'            => $row->{'fid'},
147                            'dvd'           => $row->{'dvd'}
148                    });
149            }
150          
151            $sth->finish();
152            $dbh->disconnect();
153            return ($results, \@ret);
154    }
155    
156    sub getBackupsNotBurned() {
157    
158            my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
159        my $sql = q{        my $sql = q{
160            SELECT            SELECT
161              hosts.ID         AS hostID,              hosts.ID         AS hostID,
# Line 171  sub getBackupsNotBurned() Line 177  sub getBackupsNotBurned()
177        my @ret = ();        my @ret = ();
178        $st -> execute();        $st -> execute();
179    
180        while ( my $tmp = $st -> fetchrow_hashref() )        while ( my $row = $st -> fetchrow_hashref() )
181          {                    {          
182              push(@ret, {              push(@ret, {
183                           'host'     => $tmp->{'host'},                           'host'     => $row->{'host'},
184                           'hostid'   => $tmp->{'hostID'},                           'hostid'   => $row->{'hostID'},
185                           'backupno' => $tmp->{'backupno'},                           'backupno' => $row->{'backupno'},
186                           'type'     => $tmp->{'type'},                           'type'     => $row->{'type'},
187                           'date'     => $tmp->{'date'}                           'date'     => $row->{'date'}
188                         }                         }
189              );              );
190          }          }
# Line 191  sub displayBackupsGrid() Line 197  sub displayBackupsGrid()
197        my $retHTML = "";        my $retHTML = "";
198        my $addForm = 1;        my $addForm = 1;
199                
200        if ($addForm)        if ($addForm) {
         {  
201    
202              $retHTML .= <<EOF3;              $retHTML .= <<EOF3;
203  <script language="javascript" type="text/javascript">  <script language="javascript" type="text/javascript">
# Line 215  sub displayBackupsGrid() Line 220  sub displayBackupsGrid()
220  //-->  //-->
221  </script>        </script>      
222  EOF3  EOF3
223                $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=burn\"";                $retHTML .= q{<form name="forma" method="GET" action="}."$MyURL"."?action=burn\"";
224                $retHTML.= q{<input type="hidden" value="burn" name="action">};                $retHTML.= q{<input type="hidden" value="burn" name="action">};
225                $retHTML .= q{<input type="hidden" value="results" name="search_results">};                $retHTML .= q{<input type="hidden" value="results" name="search_results">};
226          }          }
227        $retHTML .= "<table style=\"fview\">";          $retHTML .= qq{<table style="fview"><tr>};
228        $retHTML .= "<tr> ";  
229        if ($addForm)          if ($addForm) {
         {  
230              $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>";
231          }          }
232        $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>};
233        my @backups = getBackupsNotBurned();  
234        my $backup;          my @backups = getBackupsNotBurned();
235            my $backup;
236        if ($addForm)  
237          {          if ($addForm) {
238              $retHTML .= "<tr>";                  $retHTML .= qq{<tr><td colspan=7 style="tableheader">
239              $retHTML .= "<td colspan=7 style=\"tableheader\">";                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">
240              $retHTML .= "<input type=\"submit\" value=\"Burn selected backups on medium\" name=\"submitBurner\">";                          </td></tr>};
             $retHTML .= "</td>";  
             $retHTML .= "</tr>";  
               
241          }          }
242        foreach $backup(@backups)  
243          {          foreach $backup(@backups) {
244              my $ftype = "";  
245                    my $ftype = "";
246                            
247              $retHTML .= "<tr>";                  $retHTML .= "<tr>";
248              if ($addForm)                  if ($addForm) {
249                {                          $retHTML .= qq{<td class="fview"><input type="checkbox" name="fcb} .
250                    $retHTML .= "<td class=\"fview\"> <input type=\"checkbox\" name=\"fcb"                                  $backup->{'hostid'}."_".$backup->{'backupno'} .
251                      .$backup->{'hostid'}."_".$backup->{'backupno'}                                  qq{" value="} . $backup->{'hostid'}."_".$backup->{'backupno'} .
252                    ."\" value=\"".$backup->{'hostid'}."_".$backup->{'backupno'}."\"> </td>";                                  qq{"></td>};
253                }                      }          
254                            
255              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'host'} . "</td>";                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
256              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'backupno'} . "</td>";                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .
257              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'type'} . "</td>";                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
258              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'date'} . "<td>";                          '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '<td>' .
259              $retHTML .= "</tr>";                          '</tr>';
260          }          }
261        $retHTML .= "</table>";  
262        if ($addForm)          $retHTML .= "</table>";
263         {  
264             $retHTML .= "</form>";          if ($addForm) {
265         }                  $retHTML .= "</form>";
266            }
267                
268        return $retHTML;          return $retHTML;
269      }      
     
   }        
270    
271  sub displayGrid($$$$) {  sub displayGrid($$$$) {
272          my ($where, $addForm, $offset, $hilite) = @_;          my ($where, $addForm, $offset, $hilite) = @_;
273          my $retHTML = "";          my $retHTML = "";
274    
275          if ($addForm) {          if ($addForm) {
276                  $retHTML .= qq{<form name="forma" method="POST" action="}.$MyURL.qq{?action=search">};                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};
277                  $retHTML.= qq{<input type="hidden" value="search" name="action">};                  $retHTML.= qq{<input type="hidden" value="search" name="action">};
278                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
279          }          }
280    
281            my ($results, $files) = getFiles($where, $offset);
282    
283            my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
284    
285          $retHTML .= qq{          $retHTML .= qq{
286            <br/>Found $results files, showing $from - $to
287          <table style="fview" width="100%">          <table style="fview" width="100%">
288                  <tr>                  <tr>
289                  <td class="tableheader">Host</td>                  <td class="tableheader">Share</td>
                 <td class="tableheader">Type</td>  
290                  <td class="tableheader">Name</td>                  <td class="tableheader">Name</td>
291                  <td class="tableheader">backup no.</td>                  <td class="tableheader">Type</td>
292                  <td class="tableheader">size</td>                  <td class="tableheader">#</td>
293                  <td class="tableheader">date</td>                  <td class="tableheader">Size</td>
294                    <td class="tableheader">Date</td>
295                  <td class="tableheader">Media</td>                  <td class="tableheader">Media</td>
296                  </tr>                  </tr>
297          };          };
298          my @files = getFiles($where, $offset);  
299          my $file;          my $file;
300    
301          sub hilite_html($$) {          sub hilite_html($$) {
# Line 297  sub displayGrid($$$$) { Line 304  sub displayGrid($$$$) {
304                  return $html;                  return $html;
305          }          }
306    
307          foreach $file (@files) {          sub restore_link($$$$$$) {
308                  my $ftype = "file";                  my $type = shift;
309                  $ftype = "dir" if ($file->{'type'} == BPC_FTYPE_DIR);                  my $action = 'RestoreFile';
310                    $action = 'browse' if (lc($type) eq 'dir');
311                    return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
312            }
313    
314            foreach $file (@{ $files }) {
315                    my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
316                  $retHTML .= "<tr>";                  $retHTML .= "<tr>";
317    
318                  foreach my $v ((                  foreach my $v ((
319                          $file->{'hname'},                          $file->{'sharename'},
320                          $ftype,                          qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),
321                          hilite_html( $file->{'fpath'}, $hilite ),                          $typeStr,
322                          $file->{'backupno'},                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),
323                          $file->{'size'},                          $file->{'size'},
324                          $file->{'date'},                          epoch_to_iso( $file->{'date'} ),
325                          $file->{'dvd'}                          $file->{'dvd'}
326                  )) {                  )) {
327                          $retHTML .= qq{<td class="fviewborder">$v</td>};                          $retHTML .= qq{<td class="fviewborder">$v</td>};
# Line 319  sub displayGrid($$$$) { Line 331  sub displayGrid($$$$) {
331          }          }
332          $retHTML .= "</table>";          $retHTML .= "</table>";
333    
334          # skip pager          # all variables which has to be transfered
335          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/) {
336                    $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
337            }
338    
339            my $del = '';
340            my $max_page = int( $results / $on_page );
341            my $page = 0;
342    
343            my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';
344    
345            $retHTML .= '<div style="text-align: center;">';
346    
347          $retHTML .= "<INPUT TYPE=\"hidden\" VALUE=\"\" NAME=\"offset\">";          if ($offset > 0) {
348          for (my $ii = 1; $ii <= $#files; $ii++) {                  $retHTML .= sprintf($link_fmt, $offset - 1, '&lt;&lt;') . ' ';
349                  $retHTML .= "<a href = \"#\" onclick=\"document.forma.offset.value=$ii;document.forma.submit();\">$ii</a>";          }
350                  if ($ii < $#files) {  
351                          $retHTML .= " | ";          while ($page <= $max_page) {
352                    if ($page == $offset) {
353                            $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
354                    } else {
355                            $retHTML .= $del . sprintf($link_fmt, $page, $page + 1);
356                    }
357    
358                    if ($page < $offset - $pager_pages && $page != 0) {
359                            $retHTML .= " ... ";
360                            $page = $offset - $pager_pages;
361                            $del = '';
362                    } elsif ($page > $offset + $pager_pages && $page != $max_page) {
363                            $retHTML .= " ... ";
364                            $page = $max_page;
365                            $del = '';
366                    } else {
367                            $del = ' | ';
368                            $page++;
369                  }                  }
370          }          }
371    
372            if ($offset < $max_page) {
373                    $retHTML .= ' ' . sprintf($link_fmt, $offset + 1, '&gt;&gt;');
374            }
375    
376            $retHTML .= "</div>";
377    
378          $retHTML .= "</form>" if ($addForm);          $retHTML .= "</form>" if ($addForm);
379          
380          return $retHTML;          return $retHTML;
381  }  }
382    

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

  ViewVC Help
Powered by ViewVC 1.1.26