/[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 80 - (hide annotations)
Fri Aug 26 23:50:05 2005 UTC (18 years, 8 months ago) by dpavlin
File size: 11478 byte(s)
minor tweak and new CSS theme

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 dpavlin 72 my $sth = $dbh->prepare(qq{ SELECT id, share FROM shares ORDER BY share} );
23 dpavlin 59 $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 dpavlin 79 my $iso = BackupPC::Lib::timeStamp($t);
36     $iso =~ s/\s/ /g;
37     return $iso;
38 dpavlin 51 }
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 dpavlin 79 -- dvds.name AS dvd
101     null AS dvd
102 dpavlin 31 };
103    
104     my $sql_from = qq{
105 dpavlin 16 FROM files
106     INNER JOIN shares ON files.shareID=shares.ID
107     INNER JOIN hosts ON hosts.ID = shares.hostID
108 dpavlin 66 INNER JOIN backups ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
109 dpavlin 55 };
110    
111     my $sql_dvd_from = qq{
112 dpavlin 79 -- LEFT JOIN dvds ON dvds.ID = files.dvdid
113 dpavlin 31 };
114 dpavlin 4
115 dpavlin 31 my $sql_where;
116     $sql_where = " WHERE ". $where if ($where);
117 dpavlin 4
118 dpavlin 31 my $sql_order = qq{
119 dpavlin 64 ORDER BY files.date
120 dpavlin 59 LIMIT $on_page
121     OFFSET ?
122 dpavlin 9 };
123 dpavlin 31
124 dpavlin 59 my $sql_count = qq{ select count(files.id) $sql_from $sql_where };
125     my $sql_results = qq{ select $sql_cols $sql_from $sql_dvd_from $sql_where $sql_order };
126    
127 dpavlin 31 $offset ||= 0;
128 dpavlin 59 $offset = ($offset * $on_page);
129 dpavlin 31
130 dpavlin 59 my $sth = $dbh->prepare($sql_count);
131 dpavlin 31 $sth->execute();
132     my ($results) = $sth->fetchrow_array();
133    
134 dpavlin 59 $sth = $dbh->prepare($sql_results);
135 dpavlin 31 $sth->execute( $offset );
136    
137 dpavlin 59 if ($sth->rows != $results) {
138     my $bug = "$0 BUG: [[ $sql_count ]] = $results while [[ $sql_results ]] = " . $sth->rows;
139     $bug =~ s/\s+/ /gs;
140     print STDERR "$bug\n";
141     }
142    
143 dpavlin 31 my @ret;
144 dpavlin 4
145 dpavlin 31 while (my $row = $sth->fetchrow_hashref()) {
146     push(@ret, {
147     'hname' => $row->{'hname'},
148     'sname' => $row->{'sname'},
149     'sharename' => $row->{'sharename'},
150 dpavlin 51 'backupno' => $row->{'backupnum'},
151 dpavlin 31 'fname' => $row->{'filename'},
152     'fpath' => $row->{'filepath'},
153 dpavlin 51 'networkpath' => $row->{'networkpath'},
154 dpavlin 31 'date' => $row->{'date'},
155     'type' => $row->{'filetype'},
156     'size' => $row->{'size'},
157     'id' => $row->{'fid'},
158     'dvd' => $row->{'dvd'}
159     });
160 dpavlin 4 }
161 dpavlin 59
162 dpavlin 31 $sth->finish();
163     $dbh->disconnect();
164     return ($results, \@ret);
165     }
166 dpavlin 4
167 dpavlin 51 sub getBackupsNotBurned() {
168    
169     my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
170 dpavlin 53 my $sql = q{
171     SELECT
172 dpavlin 66 backups.hostID AS hostid,
173 dpavlin 53 min(hosts.name) AS host,
174     backups.num AS backupno,
175     min(backups.type) AS type,
176 dpavlin 66 min(backups.date) AS date,
177     min(backups.size) AS size
178 dpavlin 79 FROM files
179     INNER JOIN shares ON files.shareID=shares.ID
180     INNER JOIN hosts ON hosts.ID = shares.hostID
181     INNER JOIN backups ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
182 dpavlin 53 WHERE
183     files.dvdid IS NULL
184     GROUP BY
185 dpavlin 66 backups.hostID, backups.num
186 dpavlin 58 ORDER BY min(backups.date)
187 dpavlin 53 };
188     my $sth = $dbh->prepare( $sql );
189     my @ret;
190     $sth->execute();
191 dpavlin 4
192 dpavlin 66 while ( my $row = $sth->fetchrow_hashref() ) {
193     $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
194     $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
195     push @ret, $row;
196 dpavlin 4 }
197    
198 dpavlin 53 return @ret;
199     }
200 dpavlin 4
201     sub displayBackupsGrid()
202     {
203     my $retHTML = "";
204     my $addForm = 1;
205    
206 dpavlin 31 if ($addForm) {
207 dpavlin 4
208     $retHTML .= <<EOF3;
209     <script language="javascript" type="text/javascript">
210     <!--
211    
212     function checkAll(location)
213     {
214     for (var i=0;i<document.forma.elements.length;i++)
215     {
216     var e = document.forma.elements[i];
217     if ((e.checked || !e.checked) && e.name != \'all\') {
218     if (eval("document.forma."+location+".checked")) {
219     e.checked = true;
220     } else {
221     e.checked = false;
222     }
223     }
224     }
225     }
226     //-->
227     </script>
228     EOF3
229 dpavlin 31 $retHTML .= q{<form name="forma" method="GET" action="}."$MyURL"."?action=burn\"";
230 dpavlin 4 $retHTML.= q{<input type="hidden" value="burn" name="action">};
231     $retHTML .= q{<input type="hidden" value="results" name="search_results">};
232     }
233 dpavlin 79 $retHTML .= qq{
234 dpavlin 80 <table style="fview" border="1" cellspacing="0" cellpadding="3">
235 dpavlin 79 <tr class="tableheader">
236     };
237 dpavlin 31
238     if ($addForm) {
239 dpavlin 4 $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";
240     }
241 dpavlin 58 $retHTML .= qq{
242 dpavlin 79 <td align="center">Host</td>
243     <td align="center">Backup no</td>
244     <td align="center">Type</td>
245     <td align="center">date</td>
246     <td align="center">age/days</td>
247     <td align="center">size/MB</td>
248 dpavlin 58 </tr>
249     };
250 dpavlin 4
251 dpavlin 31 my @backups = getBackupsNotBurned();
252     my $backup;
253    
254     if ($addForm) {
255 dpavlin 58 $retHTML .= qq{
256     <tr><td colspan=7 style="tableheader">
257 dpavlin 31 <input type="submit" value="Burn selected backups on medium" name="submitBurner">
258 dpavlin 58 </td></tr>
259     };
260 dpavlin 4 }
261 dpavlin 31
262     foreach $backup(@backups) {
263    
264     my $ftype = "";
265 dpavlin 4
266 dpavlin 31 $retHTML .= "<tr>";
267     if ($addForm) {
268 dpavlin 58 $retHTML .= '<td class="fview"><input type="checkbox" name="fcb' .
269     $backup->{'hostid'}.'_'.$backup->{'backupno'} .
270     '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupno'} .
271     '"></td>';
272 dpavlin 31 }
273 dpavlin 4
274 dpavlin 31 $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
275     '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .
276     '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
277 dpavlin 58 '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
278     '<td class="fviewborder">' . $backup->{'age'} . '</td>' .
279 dpavlin 66 '<td class="fviewborder">' . $backup->{'size'} . '</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 79 <div>
326     Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
327     </div>
328     <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
329     <tr class="fviewheader">
330     <td align="center">Share</td>
331     <td align="center">Type and Name</td>
332     <td align="center">#</td>
333     <td align="center">Size</td>
334     <td align="center">Date</td>
335     <td align="center">Media</td>
336 dpavlin 17 </tr>
337     };
338 dpavlin 31
339 dpavlin 17 my $file;
340 dpavlin 4
341 dpavlin 17 sub hilite_html($$) {
342     my ($html, $search) = @_;
343     $html =~ s#($search)#<b>$1</b>#gis;
344     return $html;
345 dpavlin 4 }
346 dpavlin 9
347 dpavlin 26 sub restore_link($$$$$$) {
348     my $type = shift;
349     my $action = 'RestoreFile';
350     $action = 'browse' if (lc($type) eq 'dir');
351     return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
352     }
353    
354 dpavlin 31 foreach $file (@{ $files }) {
355 dpavlin 24 my $typeStr = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
356 dpavlin 79 $retHTML .= qq{<tr class="fviewborder">};
357 dpavlin 9
358 dpavlin 79 $retHTML .=
359     qq{<td class="fviewborder" align="right">} . $file->{'sharename'} . qq{</td>} .
360 dpavlin 80 qq{<td class="fviewborder"><img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" alt="$typeStr" align="middle">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ) . qq{</td>} .
361 dpavlin 79 qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupno'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'fpath'} )}, $file->{'backupno'} ) . qq{</td>} .
362     qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
363     qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
364     qq{<td class="fviewborder">} . $file->{'dvd'} . qq{</td>};
365 dpavlin 9
366 dpavlin 17 $retHTML .= "</tr>";
367     }
368     $retHTML .= "</table>";
369    
370 dpavlin 31 # all variables which has to be transfered
371     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/) {
372     $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
373     }
374 dpavlin 17
375 dpavlin 31 my $del = '';
376     my $max_page = int( $results / $on_page );
377     my $page = 0;
378    
379     my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';
380    
381     $retHTML .= '<div style="text-align: center;">';
382    
383     if ($offset > 0) {
384     $retHTML .= sprintf($link_fmt, $offset - 1, '&lt;&lt;') . ' ';
385     }
386    
387     while ($page <= $max_page) {
388     if ($page == $offset) {
389     $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
390     } else {
391     $retHTML .= $del . sprintf($link_fmt, $page, $page + 1);
392 dpavlin 17 }
393 dpavlin 31
394     if ($page < $offset - $pager_pages && $page != 0) {
395     $retHTML .= " ... ";
396     $page = $offset - $pager_pages;
397     $del = '';
398     } elsif ($page > $offset + $pager_pages && $page != $max_page) {
399     $retHTML .= " ... ";
400     $page = $max_page;
401     $del = '';
402     } else {
403     $del = ' | ';
404     $page++;
405     }
406 dpavlin 17 }
407    
408 dpavlin 31 if ($offset < $max_page) {
409     $retHTML .= ' ' . sprintf($link_fmt, $offset + 1, '&gt;&gt;');
410     }
411    
412     $retHTML .= "</div>";
413    
414 dpavlin 17 $retHTML .= "</form>" if ($addForm);
415 dpavlin 31
416 dpavlin 17 return $retHTML;
417     }
418 dpavlin 4
419     1;

  ViewVC Help
Powered by ViewVC 1.1.26