/[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 55 - (hide annotations)
Sun Aug 21 13:44:20 2005 UTC (18 years, 8 months ago) by dpavlin
File size: 10628 byte(s)
removed dvds from count sql, added duration of search, cosmetic changes in output

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

  ViewVC Help
Powered by ViewVC 1.1.26