/[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

Annotation of /trunk/lib/BackupPC/SearchLib.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (hide annotations)
Sun Aug 21 15:59:55 2005 UTC (18 years, 9 months ago) by dpavlin
File size: 11107 byte(s)
removed on-disk full path from database and queries, search now tries to
match full path and not only filename

1 dpavlin 4 #!/usr/bin/perl
2     package BackupPC::SearchLib;
3    
4     use strict;
5     use BackupPC::CGI::Lib qw(:all);
6     use BackupPC::Attrib qw(:all);
7     use DBI;
8 dpavlin 51 use DateTime;
9 dpavlin 31 use vars qw(%In $MyURL);
10 dpavlin 55 use Time::HiRes qw/time/;
11 dpavlin 4
12 dpavlin 31 my $on_page = 100;
13     my $pager_pages = 10;
14    
15 dpavlin 51 my $dsn = $Conf{SearchDSN};
16     my $db_user = $Conf{SearchUser} || '';
17    
18 dpavlin 4 sub getUnits() {
19 dpavlin 59 my @ret;
20    
21     my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
22     my $sth = $dbh->prepare(qq{ SELECT id, share FROM shares} );
23     $sth->execute();
24     push @ret, { 'id' => '', 'share' => '-'}; # dummy any
25    
26     while ( my $row = $sth->fetchrow_hashref() ) {
27     push @ret, $row;
28     }
29     $dbh->disconnect();
30     return @ret;
31 dpavlin 4 }
32    
33 dpavlin 51 sub epoch_to_iso {
34     my $t = shift || return;
35     my $dt = DateTime->from_epoch( epoch => $t ) || return;
36 dpavlin 59 print STDERR "BUG: $t != " . $dt->epoch . "\n" unless ($t == $dt->epoch);
37 dpavlin 51 return $dt->ymd . ' ' . $dt->hms;
38     }
39    
40 dpavlin 4 sub getWhere($) {
41 dpavlin 19 my ($param) = @_;
42     my @conditions;
43 dpavlin 4
44 dpavlin 51 sub mk_epoch_date($$) {
45 dpavlin 19 my ($name,$suffix) = @_;
46 dpavlin 4
47 dpavlin 19 my $yyyy = $param->{ $name . '_year_' . $suffix} || return;
48     my $mm .= $param->{ $name . '_month_' . $suffix} ||
49     ( $suffix eq 'from' ? 1 : 12);
50     my $dd .= $param->{ $name . '_day_' . $suffix} ||
51     ( $suffix eq 'from' ? 1 : 31);
52 dpavlin 51 my $dt = new DateTime(
53     year => $yyyy,
54     month => $mm,
55     day => $dd
56     );
57     return $dt->epoch || 'NULL';
58 dpavlin 19 }
59 dpavlin 4
60 dpavlin 51 my $backup_from = mk_epoch_date('search_backup', 'from');
61     push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
62     my $backup_to = mk_epoch_date('search_backup', 'to');
63     push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
64 dpavlin 4
65 dpavlin 51 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 dpavlin 19
70 dpavlin 59 print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" | ",@conditions);
71 dpavlin 4
72 dpavlin 60 push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
73 dpavlin 4
74 dpavlin 62 push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
75 dpavlin 19
76     return (
77     join(" and ", @conditions),
78     $files_from, $files_to,
79     $backup_from, $backup_to
80     );
81 dpavlin 4 }
82    
83 dpavlin 19
84 dpavlin 31 sub getFiles($$) {
85     my ($where, $offset) = @_;
86    
87 dpavlin 51 my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
88 dpavlin 31
89     my $sql_cols = qq{
90     files.id AS fid,
91     hosts.name AS hname,
92     shares.name AS sname,
93     shares.share AS sharename,
94     files.backupNum AS backupNum,
95     files.name AS filename,
96     files.path AS filepath,
97 dpavlin 51 files.date AS date,
98 dpavlin 31 files.type AS filetype,
99     files.size AS size,
100     dvds.name AS dvd
101     };
102    
103     my $sql_from = qq{
104 dpavlin 16 FROM files
105     INNER JOIN shares ON files.shareID=shares.ID
106     INNER JOIN hosts ON hosts.ID = shares.hostID
107 dpavlin 20 INNER JOIN backups ON backups.num = files.backupNum and backups.hostID = hosts.ID
108 dpavlin 55 };
109    
110     my $sql_dvd_from = qq{
111 dpavlin 16 LEFT JOIN dvds ON dvds.ID = files.dvdid
112 dpavlin 31 };
113 dpavlin 4
114 dpavlin 31 my $sql_where;
115     $sql_where = " WHERE ". $where if ($where);
116 dpavlin 4
117 dpavlin 31 my $sql_order = qq{
118     ORDER BY files.id
119 dpavlin 59 LIMIT $on_page
120     OFFSET ?
121 dpavlin 9 };
122 dpavlin 31
123 dpavlin 59 my $sql_count = qq{ select count(files.id) $sql_from $sql_where };
124     my $sql_results = qq{ select $sql_cols $sql_from $sql_dvd_from $sql_where $sql_order };
125    
126 dpavlin 31 $offset ||= 0;
127 dpavlin 59 $offset = ($offset * $on_page);
128 dpavlin 31
129 dpavlin 59 my $sth = $dbh->prepare($sql_count);
130 dpavlin 31 $sth->execute();
131     my ($results) = $sth->fetchrow_array();
132    
133 dpavlin 59 $sth = $dbh->prepare($sql_results);
134 dpavlin 31 $sth->execute( $offset );
135    
136 dpavlin 59 if ($sth->rows != $results) {
137     my $bug = "$0 BUG: [[ $sql_count ]] = $results while [[ $sql_results ]] = " . $sth->rows;
138     $bug =~ s/\s+/ /gs;
139     print STDERR "$bug\n";
140     }
141    
142 dpavlin 31 my @ret;
143 dpavlin 4
144 dpavlin 31 while (my $row = $sth->fetchrow_hashref()) {
145     push(@ret, {
146     'hname' => $row->{'hname'},
147     'sname' => $row->{'sname'},
148     'sharename' => $row->{'sharename'},
149 dpavlin 51 'backupno' => $row->{'backupnum'},
150 dpavlin 31 'fname' => $row->{'filename'},
151     'fpath' => $row->{'filepath'},
152 dpavlin 51 'networkpath' => $row->{'networkpath'},
153 dpavlin 31 'date' => $row->{'date'},
154     'type' => $row->{'filetype'},
155     'size' => $row->{'size'},
156     'id' => $row->{'fid'},
157     'dvd' => $row->{'dvd'}
158     });
159 dpavlin 4 }
160 dpavlin 59
161 dpavlin 31 $sth->finish();
162     $dbh->disconnect();
163     return ($results, \@ret);
164     }
165 dpavlin 4
166 dpavlin 51 sub getBackupsNotBurned() {
167    
168     my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
169 dpavlin 53 my $sql = q{
170     SELECT
171     hosts.ID AS hostid,
172     min(hosts.name) AS host,
173     backups.num AS backupno,
174     min(backups.type) AS type,
175     min(backups.date) AS date
176     FROM backups, shares, files, hosts
177     WHERE
178     backups.num = files.backupNum AND
179     shares.ID = files.shareID AND
180     backups.hostID = shares.hostID AND
181     hosts.ID = backups.hostID AND
182     files.dvdid IS NULL
183     GROUP BY
184     backups.hostID, backups.num, hosts.id
185 dpavlin 58 ORDER BY min(backups.date)
186 dpavlin 53 };
187     my $sth = $dbh->prepare( $sql );
188     my @ret;
189     $sth->execute();
190 dpavlin 4
191 dpavlin 53 while ( my $row = $sth->fetchrow_hashref() ) {
192     push(@ret, {
193 dpavlin 58 'host' => $row->{'host'},
194     'hostid' => $row->{'hostid'},
195     'backupno' => $row->{'backupno'},
196     'type' => $row->{'type'},
197     'date' => $row->{'date'},
198     'age' => sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) ),
199 dpavlin 4 }
200 dpavlin 53 );
201 dpavlin 4 }
202    
203 dpavlin 53 return @ret;
204     }
205 dpavlin 4
206     sub displayBackupsGrid()
207     {
208     my $retHTML = "";
209     my $addForm = 1;
210    
211 dpavlin 31 if ($addForm) {
212 dpavlin 4
213     $retHTML .= <<EOF3;
214     <script language="javascript" type="text/javascript">
215     <!--
216    
217     function checkAll(location)
218     {
219     for (var i=0;i<document.forma.elements.length;i++)
220     {
221     var e = document.forma.elements[i];
222     if ((e.checked || !e.checked) && e.name != \'all\') {
223     if (eval("document.forma."+location+".checked")) {
224     e.checked = true;
225     } else {
226     e.checked = false;
227     }
228     }
229     }
230     }
231     //-->
232     </script>
233     EOF3
234 dpavlin 31 $retHTML .= q{<form name="forma" method="GET" action="}."$MyURL"."?action=burn\"";
235 dpavlin 4 $retHTML.= q{<input type="hidden" value="burn" name="action">};
236     $retHTML .= q{<input type="hidden" value="results" name="search_results">};
237     }
238 dpavlin 31 $retHTML .= qq{<table style="fview"><tr>};
239    
240     if ($addForm) {
241 dpavlin 4 $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";
242     }
243 dpavlin 58 $retHTML .= qq{
244     <td class="tableheader">Host</td>
245     <td class="tableheader">Backup no</td>
246     <td class="tableheader">Type</td>
247     <td class="tableheader">date</td>
248     <td class="tableheader">age/days</td>
249     </tr>
250     };
251 dpavlin 4
252 dpavlin 31 my @backups = getBackupsNotBurned();
253     my $backup;
254    
255     if ($addForm) {
256 dpavlin 58 $retHTML .= qq{
257     <tr><td colspan=7 style="tableheader">
258 dpavlin 31 <input type="submit" value="Burn selected backups on medium" name="submitBurner">
259 dpavlin 58 </td></tr>
260     };
261 dpavlin 4 }
262 dpavlin 31
263     foreach $backup(@backups) {
264    
265     my $ftype = "";
266 dpavlin 4
267 dpavlin 31 $retHTML .= "<tr>";
268     if ($addForm) {
269 dpavlin 58 $retHTML .= '<td class="fview"><input type="checkbox" name="fcb' .
270     $backup->{'hostid'}.'_'.$backup->{'backupno'} .
271     '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupno'} .
272     '"></td>';
273 dpavlin 31 }
274 dpavlin 4
275 dpavlin 31 $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
276     '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .
277     '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
278 dpavlin 58 '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
279     '<td class="fviewborder">' . $backup->{'age'} . '</td>' .
280 dpavlin 31 '</tr>';
281 dpavlin 4 }
282 dpavlin 31
283     $retHTML .= "</table>";
284    
285     if ($addForm) {
286     $retHTML .= "</form>";
287     }
288 dpavlin 4
289 dpavlin 31 return $retHTML;
290     }
291 dpavlin 4
292 dpavlin 17 sub displayGrid($$$$) {
293     my ($where, $addForm, $offset, $hilite) = @_;
294     my $retHTML = "";
295    
296 dpavlin 55 my $start_t = time();
297    
298 dpavlin 31 my ($results, $files) = getFiles($where, $offset);
299    
300 dpavlin 55 my $dur_t = time() - $start_t;
301     my $dur = sprintf("%0.4fs", $dur_t);
302    
303 dpavlin 31 my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
304    
305 dpavlin 59 if ($results <= 0) {
306     $retHTML .= qq{
307     <p style="color: red;">No results found...</p>
308     };
309     return $retHTML;
310     } else {
311     # DEBUG
312     #use Data::Dumper;
313     #$retHTML .= '<pre>' . Dumper($files) . '</pre>';
314     }
315    
316    
317     if ($addForm) {
318     $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};
319     $retHTML.= qq{<input type="hidden" value="search" name="action">};
320     $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
321     }
322    
323    
324 dpavlin 17 $retHTML .= qq{
325 dpavlin 55 <br/>Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
326 dpavlin 17 <table style="fview" width="100%">
327     <tr>
328 dpavlin 26 <td class="tableheader">Share</td>
329 dpavlin 24 <td class="tableheader">Name</td>
330 dpavlin 17 <td class="tableheader">Type</td>
331 dpavlin 24 <td class="tableheader">#</td>
332     <td class="tableheader">Size</td>
333     <td class="tableheader">Date</td>
334 dpavlin 17 <td class="tableheader">Media</td>
335     </tr>
336     };
337 dpavlin 31
338 dpavlin 17 my $file;
339 dpavlin 4
340 dpavlin 17 sub hilite_html($$) {
341     my ($html, $search) = @_;
342     $html =~ s#($search)#<b>$1</b>#gis;
343     return $html;
344 dpavlin 4 }
345 dpavlin 9
346 dpavlin 26 sub restore_link($$$$$$) {
347     my $type = shift;
348     my $action = 'RestoreFile';
349     $action = 'browse' if (lc($type) eq 'dir');
350     return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
351     }
352    
353 dpavlin 31 foreach $file (@{ $files }) {
354 dpavlin 24 my $typeStr = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
355 dpavlin 17 $retHTML .= "<tr>";
356 dpavlin 9
357 dpavlin 17 foreach my $v ((
358 dpavlin 26 $file->{'sharename'},
359 dpavlin 24 qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),
360     $typeStr,
361 dpavlin 26 restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),
362 dpavlin 17 $file->{'size'},
363 dpavlin 51 epoch_to_iso( $file->{'date'} ),
364 dpavlin 17 $file->{'dvd'}
365     )) {
366     $retHTML .= qq{<td class="fviewborder">$v</td>};
367     }
368 dpavlin 9
369 dpavlin 17 $retHTML .= "</tr>";
370     }
371     $retHTML .= "</table>";
372    
373 dpavlin 31 # all variables which has to be transfered
374     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/) {
375     $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
376     }
377 dpavlin 17
378 dpavlin 31 my $del = '';
379     my $max_page = int( $results / $on_page );
380     my $page = 0;
381    
382     my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';
383    
384     $retHTML .= '<div style="text-align: center;">';
385    
386     if ($offset > 0) {
387     $retHTML .= sprintf($link_fmt, $offset - 1, '&lt;&lt;') . ' ';
388     }
389    
390     while ($page <= $max_page) {
391     if ($page == $offset) {
392     $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
393     } else {
394     $retHTML .= $del . sprintf($link_fmt, $page, $page + 1);
395 dpavlin 17 }
396 dpavlin 31
397     if ($page < $offset - $pager_pages && $page != 0) {
398     $retHTML .= " ... ";
399     $page = $offset - $pager_pages;
400     $del = '';
401     } elsif ($page > $offset + $pager_pages && $page != $max_page) {
402     $retHTML .= " ... ";
403     $page = $max_page;
404     $del = '';
405     } else {
406     $del = ' | ';
407     $page++;
408     }
409 dpavlin 17 }
410    
411 dpavlin 31 if ($offset < $max_page) {
412     $retHTML .= ' ' . sprintf($link_fmt, $offset + 1, '&gt;&gt;');
413     }
414    
415     $retHTML .= "</div>";
416    
417 dpavlin 17 $retHTML .= "</form>" if ($addForm);
418 dpavlin 31
419 dpavlin 17 return $retHTML;
420     }
421 dpavlin 4
422     1;

  ViewVC Help
Powered by ViewVC 1.1.26