/[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 64 by dpavlin, Sun Aug 21 17:08:55 2005 UTC revision 86 by dpavlin, Sun Aug 28 12:35:59 2005 UTC
# Line 15  my $pager_pages = 10; Line 15  my $pager_pages = 10;
15  my $dsn = $Conf{SearchDSN};  my $dsn = $Conf{SearchDSN};
16  my $db_user = $Conf{SearchUser} || '';  my $db_user = $Conf{SearchUser} || '';
17    
18    my $index_path = $Conf{HyperEstraierIndex};
19    if ($index_path) {
20            $index_path = $TopDir . '/' . $index_path;
21            $index_path =~ s#//#/#g;
22    }
23    
24    my $dbh;
25    
26    sub get_dbh {
27            $dbh ||= DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
28            return $dbh;
29    }
30    
31  sub getUnits() {  sub getUnits() {
32          my @ret;          my @ret;
33    
34          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );          my $dbh = get_dbh();
35          my $sth = $dbh->prepare(qq{ SELECT id, share FROM shares} );          my $sth = $dbh->prepare(qq{
36                    SELECT
37                            shares.id       as id,
38                            hosts.name || ':' || shares.name as share
39                    FROM shares
40                    JOIN hosts on hostid = hosts.id
41                    ORDER BY share
42            } );
43          $sth->execute();          $sth->execute();
44          push @ret, { 'id' => '', 'share' => '-'};       # dummy any          push @ret, { 'id' => '', 'share' => '-'};       # dummy any
45    
46          while ( my $row = $sth->fetchrow_hashref() ) {          while ( my $row = $sth->fetchrow_hashref() ) {
47                  push @ret, $row;                  push @ret, $row;
48          }          }
         $dbh->disconnect();  
49          return @ret;          return @ret;
50  }  }
51    
52  sub epoch_to_iso {  sub epoch_to_iso {
53          my $t = shift || return;          my $t = shift || return;
54          $t += 60 * 60 * +2;     # FIXME add TZ          my $iso = BackupPC::Lib::timeStamp(undef, $t);
55          my $dt = DateTime->from_epoch( epoch => $t ) || return;          $iso =~ s/\s/ /g;
56          print STDERR "BUG: $t != " . $dt->epoch . "\n" unless ($t == $dt->epoch);          return $iso;
         return $dt->ymd . ' ' . $dt->hms;  
57  }  }
58    
59  sub getWhere($) {  sub dates_from_form($) {
60          my ($param)    = @_;          my $param = shift || return;
         my @conditions;  
61    
62          sub mk_epoch_date($$) {          sub mk_epoch_date($$) {
63                  my ($name,$suffix) = @_;                  my ($name,$suffix) = @_;
# Line 58  sub getWhere($) { Line 75  sub getWhere($) {
75                  return $dt->epoch || 'NULL';                  return $dt->epoch || 'NULL';
76          }          }
77    
78          my $backup_from = mk_epoch_date('search_backup', 'from');          return (
79                    mk_epoch_date('search_backup', 'from'),
80                    mk_epoch_date('search_backup', 'to'),
81                    mk_epoch_date('search', 'from'),
82                    mk_epoch_date('search', 'to'),
83            );
84    }
85    
86    
87    sub getWhere($) {
88            my $param = shift || return;
89    
90            my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
91    
92            my @conditions;
93          push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);          push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
         my $backup_to = mk_epoch_date('search_backup', 'to');  
94          push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);          push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
   
         my $files_from = mk_epoch_date('search', 'from');  
95          push @conditions, qq{ files.date >= $files_from } if ($files_from);          push @conditions, qq{ files.date >= $files_from } if ($files_from);
         my $files_to = mk_epoch_date('search', 'to');  
96          push @conditions, qq{ files.date <= $files_to } if ($files_to);          push @conditions, qq{ files.date <= $files_to } if ($files_to);
97    
98          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);
       
         push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});  
99    
100            push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
101          push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});          push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
102    
103          return (          return join(" and ", @conditions);
                 join(" and ", @conditions),  
                 $files_from, $files_to,  
                 $backup_from, $backup_to  
         );  
104  }  }
105    
106    
107  sub getFiles($$) {  sub getFiles($$) {
108          my ($where, $offset) = @_;          my ($param, $offset) = @_;
109    
110          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );          my $dbh = get_dbh();
111    
112          my $sql_cols = qq{          my $sql_cols = qq{
113                  files.id                        AS fid,                  files.id                        AS fid,
114                  hosts.name                      AS hname,                  hosts.name                      AS hname,
115                  shares.name                     AS sname,                  shares.name                     AS sname,
116                  shares.share                    AS sharename,                  -- shares.share                 AS sharename,
117                  files.backupNum                 AS backupNum,                  files.backupnum                 AS backupnum,
118                  files.name                      AS filename,                  -- files.name                   AS filename,
119                  files.path                      AS filepath,                  files.path                      AS filepath,
120                  files.date                      AS date,                  files.date                      AS date,
121                  files.type                      AS filetype,                  files.type                      AS type,
122                  files.size                      AS size,                  files.size                      AS size,
123                  dvds.name                       AS dvd                  -- dvds.name                    AS dvd
124                    null                            AS dvd
125          };          };
126    
127          my $sql_from = qq{          my $sql_from = qq{
128                  FROM files                  FROM files
129                          INNER JOIN shares       ON files.shareID=shares.ID                          INNER JOIN shares       ON files.shareID=shares.ID
130                          INNER JOIN hosts        ON hosts.ID = shares.hostID                          INNER JOIN hosts        ON hosts.ID = shares.hostID
131                          INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID                          INNER JOIN backups      ON backups.num = files.backupnum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
132          };          };
133    
134          my $sql_dvd_from = qq{          my $sql_dvd_from = qq{
135                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid                          -- LEFT  JOIN dvds              ON dvds.ID = files.dvdid
136          };          };
137    
138          my $sql_where;          my $sql_where;
139            my $where = getWhere($param);
140          $sql_where = " WHERE ". $where if ($where);          $sql_where = " WHERE ". $where if ($where);
141    
142          my $sql_order = qq{          my $sql_order = qq{
# Line 143  sub getFiles($$) { Line 167  sub getFiles($$) {
167          my @ret;          my @ret;
168                
169          while (my $row = $sth->fetchrow_hashref()) {          while (my $row = $sth->fetchrow_hashref()) {
170                  push(@ret, {                  push @ret, $row;
                         'hname'         => $row->{'hname'},  
                         'sname'         => $row->{'sname'},  
                         'sharename'     => $row->{'sharename'},  
                         'backupno'      => $row->{'backupnum'},  
                         'fname'         => $row->{'filename'},  
                         'fpath'         => $row->{'filepath'},  
                         'networkpath'   => $row->{'networkpath'},  
                         'date'          => $row->{'date'},  
                         'type'          => $row->{'filetype'},  
                         'size'          => $row->{'size'},  
                         'id'            => $row->{'fid'},  
                         'dvd'           => $row->{'dvd'}  
                 });  
171          }          }
172            
173          $sth->finish();          $sth->finish();
         $dbh->disconnect();  
174          return ($results, \@ret);          return ($results, \@ret);
175  }  }
176    
177    sub getFilesHyperEstraier($$) {
178            my ($param, $offset) = @_;
179    
180            die "no index_path?" unless ($index_path);
181    
182            use HyperEstraier;
183    
184            # open the database
185            my $db = HyperEstraier::Database->new();
186            $db->open($index_path, $HyperEstraier::ESTDBREADER);
187    
188            # create a search condition object
189            my $cond = HyperEstraier::Condition->new();
190    
191            my $q = $param->{'search_filename'};
192            my $shareid = $param->{'search_share'};
193    
194            if ($q) {
195                    $q =~ s/(.)/$1 /g;
196    
197                    # set the search phrase to the search condition object
198                    $cond->set_phrase($q);
199    
200                    my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
201    
202                    $cond->add_attr("backup_date NUMGE $backup_from") if ($backup_from);
203                    $cond->add_attr("backup_date NUMLE $backup_to") if ($backup_to);
204    
205                    $cond->add_attr("date NUMGE $files_from") if ($files_from);
206                    $cond->add_attr("date NUMLE $files_to") if ($files_to);
207    
208                    $cond->add_attr("shareid NUMEQ $shareid") if ($shareid);
209            }
210    
211            $offset ||= 0;
212            $offset = ($offset * $on_page);
213    
214    #       $cond->set_max( $offset + $on_page );
215            $cond->set_options( $HyperEstraier::Condition::SURE );
216            $cond->set_order( 'date NUMA' );
217    
218            # get the result of search
219            my $result = $db->search($cond, 0);
220            $result->get(0);
221    
222            my @res;
223            my $hits = $result->size;
224    
225            # for each document in result
226            for my $i ($offset .. $result->size-1) {
227                    my $id = $result->get($i);
228                    my $doc = $db->get_doc($id, 0);
229    
230                    my $row;
231                    foreach my $c (qw/fid hname sname backupnum fiilename filepath date type size/) {
232                            $row->{$c} = $doc->attr($c);
233                    }
234                    push @res, $row;
235            }
236    
237            return ($hits, \@res);
238    }
239    
240  sub getBackupsNotBurned() {  sub getBackupsNotBurned() {
241    
242          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );          my $dbh = get_dbh();
243          my $sql = q{          my $sql = q{
244          SELECT          SELECT
245                  hosts.ID                AS hostid,                  backups.hostID          AS hostid,
246                  min(hosts.name)         AS host,                  min(hosts.name)         AS host,
247                  backups.num             AS backupno,                  backups.num             AS backupnum,
248                  min(backups.type)       AS type,                  min(backups.type)       AS type,
249                  min(backups.date)       AS date                  min(backups.date)       AS date,
250          FROM backups, shares, files, hosts                  min(backups.size)       AS size
251            FROM files
252                    INNER JOIN shares       ON files.shareID=shares.ID
253                    INNER JOIN hosts        ON hosts.ID = shares.hostID
254                    INNER JOIN backups      ON backups.num = files.backupnum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
255          WHERE          WHERE
                 backups.num     = files.backupNum       AND  
                 shares.ID       = files.shareID         AND          
                 backups.hostID  = shares.hostID         AND  
                 hosts.ID        = backups.hostID        AND  
256                  files.dvdid     IS NULL                  files.dvdid     IS NULL
257          GROUP BY          GROUP BY
258                  backups.hostID, backups.num, hosts.id                  backups.hostID, backups.num
259          ORDER BY min(backups.date)          ORDER BY min(backups.date)
260          };          };
261          my $sth = $dbh->prepare( $sql );          my $sth = $dbh->prepare( $sql );
262          my @ret;          my @ret;
263          $sth->execute();          $sth->execute();
264    
265          while ( my $row = $sth->fetchrow_hashref() ) {                while ( my $row = $sth->fetchrow_hashref() ) {
266                  push(@ret, {                  $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
267                           'host'         => $row->{'host'},                  $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
268                           'hostid'       => $row->{'hostid'},                  push @ret, $row;
                          'backupno'     => $row->{'backupno'},  
                          'type'         => $row->{'type'},  
                          'date'         => $row->{'date'},  
                          'age'          => sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) ),  
                        }  
                 );  
269          }          }
270                
271          return @ret;                return @ret;      
# Line 236  EOF3 Line 303  EOF3
303                $retHTML.= q{<input type="hidden" value="burn" name="action">};                $retHTML.= q{<input type="hidden" value="burn" name="action">};
304                $retHTML .= q{<input type="hidden" value="results" name="search_results">};                $retHTML .= q{<input type="hidden" value="results" name="search_results">};
305          }          }
306          $retHTML .= qq{<table style="fview"><tr>};          $retHTML .= qq{
307                    <table style="fview" border="1" cellspacing="0" cellpadding="3">
308                    <tr class="tableheader">
309            };
310    
311          if ($addForm) {          if ($addForm) {
312              $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>";
313          }          }
314          $retHTML .=  qq{          $retHTML .=  qq{
315                  <td class="tableheader">Host</td>                  <td align="center">Host</td>
316                  <td class="tableheader">Backup no</td>                  <td align="center">Backup no</td>
317                  <td class="tableheader">Type</td>                  <td align="center">Type</td>
318                  <td class="tableheader">date</td>                  <td align="center">date</td>
319                  <td class="tableheader">age/days</td>                  <td align="center">age/days</td>
320                    <td align="center">size/MB</td>
321                  </tr>                  </tr>
322          };          };
323    
# Line 268  EOF3 Line 339  EOF3
339                  $retHTML .= "<tr>";                  $retHTML .= "<tr>";
340                  if ($addForm) {                  if ($addForm) {
341                          $retHTML .= '<td class="fview"><input type="checkbox" name="fcb' .                          $retHTML .= '<td class="fview"><input type="checkbox" name="fcb' .
342                                  $backup->{'hostid'}.'_'.$backup->{'backupno'} .                                  $backup->{'hostid'}.'_'.$backup->{'backupnum'} .
343                                  '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupno'} .                                  '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupnum'} .
344                                  '"></td>';                                  '"></td>';
345                  }                            }          
346                            
347                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
348                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'backupnum'} . '</td>' .
349                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
350                          '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .                          '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
351                          '<td class="fviewborder">' . $backup->{'age'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'age'} . '</td>' .
352                            '<td class="fviewborder">' . $backup->{'size'} . '</td>' .
353                          '</tr>';                          '</tr>';
354          }          }
355    
# Line 290  EOF3 Line 362  EOF3
362          return $retHTML;          return $retHTML;
363  }        }      
364    
365  sub displayGrid($$$$) {  sub displayGrid($) {
366          my ($where, $addForm, $offset, $hilite) = @_;          my ($param) = @_;
367    
368            my $offset = $param->{'offset'};
369            my $hilite = $param->{'search_filename'};
370    
371          my $retHTML = "";          my $retHTML = "";
372    
373          my $start_t = time();          my $start_t = time();
374    
375          my ($results, $files) = getFiles($where, $offset);          my ($results, $files);
376            if ($param->{'use_hest'}) {
377                    ($results, $files) = getFilesHyperEstraier($param, $offset);
378            } else {
379                    ($results, $files) = getFiles($param, $offset);
380            }
381    
382          my $dur_t = time() - $start_t;          my $dur_t = time() - $start_t;
383          my $dur = sprintf("%0.4fs", $dur_t);          my $dur = sprintf("%0.4fs", $dur_t);
# Line 315  sub displayGrid($$$$) { Line 396  sub displayGrid($$$$) {
396          }          }
397    
398    
         if ($addForm) {  
                 $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};  
                 $retHTML.= qq{<input type="hidden" value="search" name="action">};  
                 $retHTML .= qq{<input type="hidden" value="results" name="search_results">};  
         }  
   
   
399          $retHTML .= qq{          $retHTML .= qq{
400          <br/>Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)          <div>
401          <table style="fview" width="100%">          Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
402                  <tr>          </div>
403                  <td class="tableheader">Share</td>          <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
404                  <td class="tableheader">Name</td>                  <tr class="fviewheader">
405                  <td class="tableheader">Type</td>                  <td align="center">Share</td>
406                  <td class="tableheader">#</td>                  <td align="center">Type and Name</td>
407                  <td class="tableheader">Size</td>                  <td align="center">#</td>
408                  <td class="tableheader">Date</td>                  <td align="center">Size</td>
409                  <td class="tableheader">Media</td>                  <td align="center">Date</td>
410                    <td align="center">Media</td>
411                  </tr>                  </tr>
412          };          };
413    
# Line 353  sub displayGrid($$$$) { Line 428  sub displayGrid($$$$) {
428    
429          foreach $file (@{ $files }) {          foreach $file (@{ $files }) {
430                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
431                  $retHTML .= "<tr>";                  $retHTML .= qq{<tr class="fviewborder">};
432    
433                  foreach my $v ((                  $retHTML .=
434                          $file->{'sharename'},                          qq{<td class="fviewborder" align="right">} . $file->{'hname'} . ':' . $file->{'sname'} . qq{</td>} .
435                          qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),                          qq{<td class="fviewborder"><img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" alt="$typeStr" align="middle">&nbsp;} . hilite_html( $file->{'filepath'}, $hilite ) . qq{</td>} .
436                          $typeStr,                          qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupnum'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'filepath'} )}, $file->{'backupnum'} ) . qq{</td>} .
437                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),                          qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
438                          $file->{'size'},                          qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
439                          epoch_to_iso( $file->{'date'} ),                          qq{<td class="fviewborder">} . $file->{'dvd'} . qq{</td>};
                         $file->{'dvd'}  
                 )) {  
                         $retHTML .= qq{<td class="fviewborder">$v</td>};  
                 }  
440    
441                  $retHTML .= "</tr>";                  $retHTML .= "</tr>";
442          }          }
# Line 380  sub displayGrid($$$$) { Line 451  sub displayGrid($$$$) {
451          my $max_page = int( $results / $on_page );          my $max_page = int( $results / $on_page );
452          my $page = 0;          my $page = 0;
453    
454          my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';          sub page_link($$$) {
455                    my ($param,$page,$display) = @_;
456    
457                    $param->{'offset'} = $page;
458    
459                    my $html = '<a href = "' . $MyURL;
460                    my $del = '?';
461                    foreach my $k (keys %{ $param }) {
462                            if ($param->{$k}) {
463                                    $html .= $del . $k . '=' . ${EscURI( $param->{$k} )};
464                                    $del = '&';
465                            }
466                    }
467                    $html .= '">' . $display . '</a>';
468            }
469    
470          $retHTML .= '<div style="text-align: center;">';          $retHTML .= '<div style="text-align: center;">';
471    
472          if ($offset > 0) {          if ($offset > 0) {
473                  $retHTML .= sprintf($link_fmt, $offset - 1, '&lt;&lt;') . ' ';                  $retHTML .= page_link($param, $offset - 1, '&lt;&lt;') . ' ';
474          }          }
475    
476          while ($page <= $max_page) {          while ($page <= $max_page) {
477                  if ($page == $offset) {                  if ($page == $offset) {
478                          $retHTML .= $del . '<b>' . ($page + 1) . '</b>';                          $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
479                  } else {                  } else {
480                          $retHTML .= $del . sprintf($link_fmt, $page, $page + 1);                          $retHTML .= $del . page_link($param, $page, $page + 1);
481                  }                  }
482    
483                  if ($page < $offset - $pager_pages && $page != 0) {                  if ($page < $offset - $pager_pages && $page != 0) {
# Line 410  sub displayGrid($$$$) { Line 495  sub displayGrid($$$$) {
495          }          }
496    
497          if ($offset < $max_page) {          if ($offset < $max_page) {
498                  $retHTML .= ' ' . sprintf($link_fmt, $offset + 1, '&gt;&gt;');                  $retHTML .= ' ' . page_link($param, $offset + 1, '&gt;&gt;');
499          }          }
500    
501          $retHTML .= "</div>";          $retHTML .= "</div>";
502    
         $retHTML .= "</form>" if ($addForm);  
   
503          return $retHTML;          return $retHTML;
504  }  }
505    

Legend:
Removed from v.64  
changed lines
  Added in v.86

  ViewVC Help
Powered by ViewVC 1.1.26