/[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 186 - (hide annotations)
Wed Oct 12 12:53:27 2005 UTC (18 years, 7 months ago) by dpavlin
File size: 21659 byte(s)
 r8484@llin:  dpavlin | 2005-10-12 14:53:21 +0200
 fix bug with same dates in from and to field

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 123 my $hest_index_path = $Conf{HyperEstraierIndex};
19 dpavlin 86
20 dpavlin 84 my $dbh;
21    
22     sub get_dbh {
23     $dbh ||= DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
24     return $dbh;
25     }
26    
27 dpavlin 4 sub getUnits() {
28 dpavlin 59 my @ret;
29    
30 dpavlin 84 my $dbh = get_dbh();
31 dpavlin 86 my $sth = $dbh->prepare(qq{
32     SELECT
33     shares.id as id,
34     hosts.name || ':' || shares.name as share
35     FROM shares
36     JOIN hosts on hostid = hosts.id
37     ORDER BY share
38     } );
39 dpavlin 59 $sth->execute();
40     push @ret, { 'id' => '', 'share' => '-'}; # dummy any
41    
42     while ( my $row = $sth->fetchrow_hashref() ) {
43     push @ret, $row;
44     }
45     return @ret;
46 dpavlin 4 }
47    
48 dpavlin 51 sub epoch_to_iso {
49     my $t = shift || return;
50 dpavlin 86 my $iso = BackupPC::Lib::timeStamp(undef, $t);
51 dpavlin 79 $iso =~ s/\s/ /g;
52     return $iso;
53 dpavlin 51 }
54    
55 dpavlin 83 sub dates_from_form($) {
56     my $param = shift || return;
57 dpavlin 4
58 dpavlin 51 sub mk_epoch_date($$) {
59 dpavlin 19 my ($name,$suffix) = @_;
60 dpavlin 4
61 dpavlin 87 my $yyyy = $param->{ $name . '_year_' . $suffix} || return undef;
62 dpavlin 19 my $mm .= $param->{ $name . '_month_' . $suffix} ||
63     ( $suffix eq 'from' ? 1 : 12);
64     my $dd .= $param->{ $name . '_day_' . $suffix} ||
65     ( $suffix eq 'from' ? 1 : 31);
66 dpavlin 87
67     $yyyy =~ s/\D//g;
68     $mm =~ s/\D//g;
69     $dd =~ s/\D//g;
70    
71 dpavlin 186 my $h = my $m = my $s = 0;
72     if ($suffix eq 'to') {
73     $h = 23;
74     $m = 59;
75     $s = 59;
76     }
77    
78 dpavlin 51 my $dt = new DateTime(
79     year => $yyyy,
80     month => $mm,
81 dpavlin 186 day => $dd,
82     hour => $h,
83     minute => $m,
84     second => $s,
85 dpavlin 51 );
86 dpavlin 87 print STDERR "mk_epoch_date($name,$suffix) [$yyyy-$mm-$dd] = " . $dt->ymd . " " . $dt->hms . "\n";
87 dpavlin 51 return $dt->epoch || 'NULL';
88 dpavlin 19 }
89 dpavlin 4
90 dpavlin 87 my @ret = (
91 dpavlin 83 mk_epoch_date('search_backup', 'from'),
92     mk_epoch_date('search_backup', 'to'),
93     mk_epoch_date('search', 'from'),
94     mk_epoch_date('search', 'to'),
95     );
96 dpavlin 87
97     return @ret;
98    
99 dpavlin 83 }
100    
101    
102     sub getWhere($) {
103     my $param = shift || return;
104    
105     my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
106    
107     my @conditions;
108 dpavlin 51 push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
109     push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
110     push @conditions, qq{ files.date >= $files_from } if ($files_from);
111     push @conditions, qq{ files.date <= $files_to } if ($files_to);
112 dpavlin 19
113 dpavlin 186 print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" and ",@conditions);
114 dpavlin 83
115 dpavlin 60 push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
116 dpavlin 62 push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
117 dpavlin 19
118 dpavlin 83 return join(" and ", @conditions);
119 dpavlin 4 }
120    
121 dpavlin 19
122 dpavlin 87 sub getFiles($) {
123     my ($param) = @_;
124 dpavlin 31
125 dpavlin 87 my $offset = $param->{'offset'} || 0;
126     $offset *= $on_page;
127    
128 dpavlin 84 my $dbh = get_dbh();
129 dpavlin 31
130     my $sql_cols = qq{
131     files.id AS fid,
132     hosts.name AS hname,
133     shares.name AS sname,
134 dpavlin 86 files.backupnum AS backupnum,
135 dpavlin 31 files.path AS filepath,
136 dpavlin 51 files.date AS date,
137 dpavlin 86 files.type AS type,
138 dpavlin 87 files.size AS size
139 dpavlin 31 };
140    
141     my $sql_from = qq{
142 dpavlin 16 FROM files
143     INNER JOIN shares ON files.shareID=shares.ID
144     INNER JOIN hosts ON hosts.ID = shares.hostID
145 dpavlin 87 INNER JOIN backups ON backups.num = files.backupnum and backups.hostID = hosts.ID AND backups.shareID = files.shareID
146 dpavlin 55 };
147    
148 dpavlin 31 my $sql_where;
149 dpavlin 83 my $where = getWhere($param);
150 dpavlin 31 $sql_where = " WHERE ". $where if ($where);
151 dpavlin 4
152 dpavlin 31 my $sql_order = qq{
153 dpavlin 64 ORDER BY files.date
154 dpavlin 59 LIMIT $on_page
155     OFFSET ?
156 dpavlin 9 };
157 dpavlin 31
158 dpavlin 59 my $sql_count = qq{ select count(files.id) $sql_from $sql_where };
159 dpavlin 87 my $sql_results = qq{ select $sql_cols $sql_from $sql_where $sql_order };
160 dpavlin 59
161     my $sth = $dbh->prepare($sql_count);
162 dpavlin 31 $sth->execute();
163     my ($results) = $sth->fetchrow_array();
164    
165 dpavlin 59 $sth = $dbh->prepare($sql_results);
166 dpavlin 31 $sth->execute( $offset );
167    
168 dpavlin 59 if ($sth->rows != $results) {
169     my $bug = "$0 BUG: [[ $sql_count ]] = $results while [[ $sql_results ]] = " . $sth->rows;
170     $bug =~ s/\s+/ /gs;
171     print STDERR "$bug\n";
172     }
173    
174 dpavlin 31 my @ret;
175 dpavlin 4
176 dpavlin 31 while (my $row = $sth->fetchrow_hashref()) {
177 dpavlin 86 push @ret, $row;
178 dpavlin 4 }
179 dpavlin 59
180 dpavlin 31 $sth->finish();
181     return ($results, \@ret);
182     }
183 dpavlin 4
184 dpavlin 117 sub getHyperEstraier_url($) {
185     my ($use_hest) = @_;
186    
187     return unless $use_hest;
188    
189     use HyperEstraier;
190     my ($index_path, $index_node_url);
191    
192     if ($use_hest =~ m#^http://#) {
193     $index_node_url = $use_hest;
194     } else {
195     $index_path = $TopDir . '/' . $index_path;
196     $index_path =~ s#//#/#g;
197     }
198     return ($index_path, $index_node_url);
199     }
200    
201 dpavlin 87 sub getFilesHyperEstraier($) {
202     my ($param) = @_;
203 dpavlin 86
204 dpavlin 87 my $offset = $param->{'offset'} || 0;
205     $offset *= $on_page;
206    
207 dpavlin 123 die "no index_path?" unless ($hest_index_path);
208 dpavlin 86
209     use HyperEstraier;
210    
211 dpavlin 123 my ($index_path, $index_node_url) = getHyperEstraier_url($hest_index_path);
212 dpavlin 117
213 dpavlin 86 # open the database
214 dpavlin 117 my $db;
215     if ($index_path) {
216     $db = HyperEstraier::Database->new();
217     $db->open($index_path, $HyperEstraier::ESTDBREADER);
218     } elsif ($index_node_url) {
219     $db ||= HyperEstraier::Node->new($index_node_url);
220     $db->set_auth('admin', 'admin');
221     } else {
222     die "BUG: unimplemented";
223     }
224 dpavlin 86
225     # create a search condition object
226     my $cond = HyperEstraier::Condition->new();
227    
228     my $q = $param->{'search_filename'};
229     my $shareid = $param->{'search_share'};
230    
231 dpavlin 88 if (length($q) > 0) {
232 dpavlin 91 # exact match
233     $cond->add_attr("filepath ISTRINC $q");
234    
235 dpavlin 86 $q =~ s/(.)/$1 /g;
236     # set the search phrase to the search condition object
237     $cond->set_phrase($q);
238 dpavlin 87 }
239 dpavlin 86
240 dpavlin 87 my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
241 dpavlin 86
242 dpavlin 87 $cond->add_attr("backup_date NUMGE $backup_from") if ($backup_from);
243     $cond->add_attr("backup_date NUMLE $backup_to") if ($backup_to);
244 dpavlin 86
245 dpavlin 87 $cond->add_attr("date NUMGE $files_from") if ($files_from);
246     $cond->add_attr("date NUMLE $files_to") if ($files_to);
247 dpavlin 86
248 dpavlin 87 $cond->add_attr("shareid NUMEQ $shareid") if ($shareid);
249 dpavlin 86
250     # $cond->set_max( $offset + $on_page );
251     $cond->set_options( $HyperEstraier::Condition::SURE );
252     $cond->set_order( 'date NUMA' );
253    
254     # get the result of search
255     my @res;
256 dpavlin 117 my ($result, $hits);
257 dpavlin 86
258 dpavlin 117 if ($index_path) {
259     $result = $db->search($cond, 0);
260     $hits = $result->size;
261     } elsif ($index_node_url) {
262     $result = $db->search($cond, 0);
263     $hits = $result->doc_num;
264     } else {
265     die "BUG: unimplemented";
266     }
267    
268 dpavlin 86 # for each document in result
269 dpavlin 87 for my $i ($offset .. ($offset + $on_page - 1)) {
270     last if ($i >= $hits);
271    
272 dpavlin 117 my $doc;
273     if ($index_path) {
274     my $id = $result->get($i);
275     $doc = $db->get_doc($id, 0);
276     } elsif ($index_node_url) {
277     $doc = $result->get_doc($i);
278     } else {
279     die "BUG: unimplemented";
280     }
281 dpavlin 86
282     my $row;
283     foreach my $c (qw/fid hname sname backupnum fiilename filepath date type size/) {
284     $row->{$c} = $doc->attr($c);
285     }
286     push @res, $row;
287     }
288    
289     return ($hits, \@res);
290     }
291    
292 dpavlin 109 sub getGzipName($$$)
293     {
294     my ($host, $share, $backupnum) = @_;
295     my $ret = $Conf{GzipSchema};
296    
297     $share =~ s/\//_/g;
298     $ret =~ s/\\h/$host/ge;
299     $ret =~ s/\\s/$share/ge;
300     $ret =~ s/\\n/$backupnum/ge;
301 dpavlin 155
302     $ret =~ s/__+/_/g;
303    
304 dpavlin 109 return $ret;
305    
306     }
307    
308 iklaric 143 sub getGzipSize($$)
309     {
310     my ($hostID, $backupNum) = @_;
311     my $ret;
312     my $sql;
313     my $dbh = get_dbh();
314    
315     $sql = q{
316     SELECT hosts.name as host,
317     shares.name as share,
318     backups.num as backupnum
319     FROM hosts, backups, shares
320     WHERE shares.id=backups.shareid AND
321     hosts.id =backups.hostid AND
322     hosts.id=? AND
323 dpavlin 145 backups.num=?
324 iklaric 143 };
325     my $sth = $dbh->prepare($sql);
326 dpavlin 145 $sth->execute($hostID, $backupNum);
327    
328     my $row = $sth->fetchrow_hashref();
329 iklaric 143
330     my (undef,undef,undef,undef,undef,undef,undef,$ret,undef,undef,undef,undef,undef) =
331     stat( $Conf{InstallDir}.'/'.$Conf{GzipTempDir}.'/'.
332     getGzipName($row->{'host'}, $row->{share}, $row->{'backupnum'}));
333    
334     return $ret;
335     }
336    
337 dpavlin 51 sub getBackupsNotBurned() {
338    
339 dpavlin 84 my $dbh = get_dbh();
340 iklaric 121
341 dpavlin 122 my $sql = q{
342 iklaric 121 SELECT
343     backups.hostID AS hostID,
344     hosts.name AS host,
345     shares.name AS share,
346 dpavlin 145 backups.num AS backupnum,
347 iklaric 121 backups.type AS type,
348     backups.date AS date,
349 dpavlin 145 backups.size AS size,
350 dpavlin 161 backups.id AS id,
351     backups.inc_size AS inc_size
352 iklaric 121 FROM backups
353 dpavlin 122 INNER JOIN shares ON backups.shareID=shares.ID
354     INNER JOIN hosts ON backups.hostID = hosts.ID
355 iklaric 137 LEFT OUTER JOIN archive_backup ON archive_backup.backup_id = backups.id
356 dpavlin 171 WHERE backups.inc_size > 0 AND backups.inc_deleted is false AND archive_backup.backup_id IS NULL
357 dpavlin 122 GROUP BY
358     backups.hostID,
359     hosts.name,
360     shares.name,
361     backups.num,
362     backups.shareid,
363     backups.id,
364     backups.type,
365     backups.date,
366 dpavlin 161 backups.size,
367     backups.inc_size
368 iklaric 121 ORDER BY backups.date
369 dpavlin 53 };
370     my $sth = $dbh->prepare( $sql );
371     my @ret;
372     $sth->execute();
373 dpavlin 4
374 dpavlin 66 while ( my $row = $sth->fetchrow_hashref() ) {
375     $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
376     $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
377 dpavlin 161
378     # do some cluster calculation (approximate) and convert to kB
379 dpavlin 166 $row->{'inc_size'} = int(($row->{'inc_size'} + 1023 ) / ( 2 * 1024 ) * 2);
380 dpavlin 66 push @ret, $row;
381 dpavlin 4 }
382    
383 dpavlin 53 return @ret;
384     }
385 dpavlin 4
386 dpavlin 126 sub displayBackupsGrid() {
387    
388     my $retHTML .= q{
389 ravilov 140 <form id="forma" method="POST" action="}.$MyURL.q{?action=burn">
390 dpavlin 126 };
391    
392 dpavlin 127 $retHTML .= <<'EOF3';
393 ravilov 140 <style type="text/css">
394 dpavlin 127 <!--
395 ravilov 140 DIV#fixedBox {
396 dpavlin 128 position: absolute;
397 ravilov 140 top: 50em;
398     left: -24%;
399 dpavlin 128 padding: 0.5em;
400 ravilov 140 width: 20%;
401     background-color: #E0F0E0;
402     border: 1px solid #00C000;
403 dpavlin 128 }
404 ravilov 140
405     DIV#fixedBox, DIV#fixedBox INPUT, DIV#fixedBox TEXTAREA {
406     font-size: 10pt;
407 dpavlin 128 }
408 dpavlin 127
409 ravilov 140 FORM>DIV#fixedBox {
410     position: fixed !important;
411     left: 0.5em !important;
412     top: auto !important;
413     bottom: 1em !important;
414     width: 15% !important;
415     }
416    
417     DIV#fixedBox INPUT[type=text], DIV#fixedBox TEXTAREA {
418     border: 1px solid #00C000;
419     }
420    
421     DIV#fixedBox #note {
422     display: block;
423 dpavlin 128 width: 100%;
424     }
425    
426 ravilov 140 DIV#fixedBox #submitBurner {
427     display: block;
428 dpavlin 128 width: 100%;
429 ravilov 140 margin-top: 0.5em;
430     cursor: pointer;
431     }
432    
433     * HTML {
434     overflow-y: hidden;
435     }
436    
437     * HTML BODY {
438     overflow-y: auto;
439 dpavlin 128 height: 100%;
440 ravilov 140 font-size: 100%;
441     }
442    
443     * HTML DIV#fixedBox {
444     position: absolute;
445     }
446    
447     #mContainer, #gradient, #mask, #progressIndicator {
448 dpavlin 128 display: block;
449 ravilov 140 width: 100%;
450     font-size: 10pt;
451     font-weight: bold;
452     text-align: center;
453     vertical-align: middle;
454     padding: 1px;
455 dpavlin 128 }
456    
457 ravilov 140 #gradient, #mask, #progressIndicator {
458     left: 0;
459     border-width: 1px;
460     border-style: solid;
461     border-color: #000000;
462     color: #404040;
463     margin: 0.4em;
464 dpavlin 128 position: absolute;
465 ravilov 140 margin-left: -1px;
466     margin-top: -1px;
467     margin-bottom: -1px;
468     overflow: hidden;
469     }
470    
471     #mContainer {
472 dpavlin 128 display: block;
473 ravilov 140 position: relative;
474     padding: 0px;
475     margin-top: 0.4em;
476     margin-bottom: 0.5em;
477     }
478    
479     #gradient {
480     z-index: 1;
481     background-color: #FFFF00;
482     }
483    
484     #mask {
485     z-index: 2;
486 dpavlin 128 background-color: #FFFFFF;
487     }
488    
489     #progressIndicator {
490 ravilov 140 z-index: 3;
491     background-color: transparent;
492 dpavlin 128 }
493 dpavlin 127 -->
494     </style>
495 ravilov 140 <script type="text/javascript">
496 dpavlin 4 <!--
497    
498 dpavlin 126 var debug_div = null;
499 dpavlin 149 EOF3
500 dpavlin 126
501 dpavlin 149 # take maximum archive size from configuration
502     $retHTML .= 'var media_size = '. $Conf{MaxArchiveSize} .';';
503    
504     $retHTML .= <<'EOF3';
505    
506 dpavlin 126 function debug(msg) {
507     // return; // Disable debugging
508    
509     if (! debug_div) debug_div = document.getElementById('debug');
510    
511     // this will create debug div if it doesn't exist.
512     if (! debug_div) {
513     debug_div = document.createElement('div');
514     if (document.body) document.body.appendChild(debug_div);
515     else debug_div = null;
516     }
517     if (debug_div) {
518     debug_div.appendChild(document.createTextNode(msg));
519     debug_div.appendChild(document.createElement("br"));
520     }
521     }
522    
523    
524     var element_id_cache = Array();
525    
526     function element_id(name,element) {
527     if (! element_id_cache[name]) {
528     element_id_cache[name] = self.document.getElementById(name);
529     }
530     return element_id_cache[name];
531     }
532    
533     function checkAll(location) {
534 ravilov 142 var f = element_id('forma') || null;
535     if (!f) return false;
536    
537     var len = f.elements.length;
538 dpavlin 126 var check_all = element_id('allFiles');
539 ravilov 142 var suma = check_all.checked ? (parseInt(f.elements['totalsize'].value) || 0) : 0;
540 dpavlin 126
541     for (var i = 0; i < len; i++) {
542 ravilov 142 var e = f.elements[i];
543     if (e.name != 'all' && e.name.substr(0, 3) == 'fcb') {
544 dpavlin 126 if (check_all.checked) {
545 ravilov 142 if (e.checked) continue;
546 dpavlin 129 var el = element_id("fss" + e.name.substr(3));
547     var size = parseInt(el.value) || 0;
548     debug('suma: '+suma+' size: '+size);
549     if ((suma + size) < media_size) {
550     suma += size;
551     e.checked = true;
552     } else {
553     break;
554     }
555 dpavlin 126 } else {
556     e.checked = false;
557     }
558     }
559     }
560 dpavlin 129 update_sum(suma);
561     }
562 dpavlin 126
563 dpavlin 129 function update_sum(suma) {
564 ravilov 141 element_id('forma').elements['totalsize'].value = suma;
565 dpavlin 129 pbar_set(suma, media_size);
566 ravilov 141 debug('total size: ' + suma);
567 dpavlin 126 }
568 dpavlin 129
569 dpavlin 126 function sumiraj(e) {
570 ravilov 141 var suma = parseInt(element_id('forma').elements['totalsize'].value) || 0;
571 dpavlin 126 var len = element_id('forma').elements.length;
572     if (e) {
573 ravilov 140 var size = parseInt( element_id("fss" + e.name.substr(3)).value);
574 dpavlin 126 if (e.checked) {
575     suma += size;
576     } else {
577     suma -= size;
578     }
579     } else {
580     suma = 0;
581     for (var i = 0; i < len; i++) {
582     var e = element_id('forma').elements[i];
583 dpavlin 127 if (e.name != 'all' && e.checked && e.name.substr(0,3) == 'fcb') {
584 dpavlin 126 var el = element_id("fss" + e.name.substr(3));
585     if (el && el.value) suma += parseInt(el.value) || 0;
586     }
587     }
588     }
589 dpavlin 129 update_sum(suma);
590 iklaric 121 return suma;
591 dpavlin 126 }
592    
593 dpavlin 128 /* progress bar */
594    
595 ravilov 140 var _pbar_width = null;
596 dpavlin 128 var _pbar_warn = 10; // change color in last 10%
597    
598     function pbar_reset() {
599     element_id("mask").style.left = "0px";
600     _pbar_width = element_id("mContainer").offsetWidth - 2;
601     element_id("mask").style.width = _pbar_width + "px";
602 ravilov 140 element_id("mask").style.display = "block";
603 dpavlin 128 element_id("progressIndicator").style.zIndex = 10;
604     element_id("progressIndicator").innerHTML = "0";
605     }
606    
607     function dec2hex(d) {
608 ravilov 140 var hch = '0123456789ABCDEF';
609     var a = d % 16;
610     var q = (d - a) / 16;
611     return hch.charAt(q) + hch.charAt(a);
612 dpavlin 128 }
613    
614     function pbar_set(amount, max) {
615 ravilov 140 debug('pbar_set('+amount+', '+max+')');
616 dpavlin 128
617 ravilov 140 if (_pbar_width == null) {
618     var _mc = element_id("mContainer");
619     if (_pbar_width == null) _pbar_width = parseInt(_mc.offsetWidth ? (_mc.offsetWidth - 2) : 0) || null;
620     if (_pbar_width == null) _pbar_width = parseInt(_mc.clientWidth ? (_mc.clientWidth + 2) : 0) || null;
621     if (_pbar_width == null) _pbar_width = 0;
622     }
623 dpavlin 128
624 ravilov 140 var pcnt = Math.floor(amount * 100 / max);
625 dpavlin 128 var p90 = 100 - _pbar_warn;
626     var pcol = pcnt - p90;
627 ravilov 140 if (Math.round(pcnt) <= 100) {
628 dpavlin 128 if (pcol < 0) pcol = 0;
629     var e = element_id("submitBurner");
630 ravilov 140 debug('enable_button');
631     e.disabled = false;
632     var a = e.getAttributeNode('disabled') || null;
633     if (a) e.removeAttributeNode(a);
634     } else {
635 dpavlin 128 debug('disable button');
636     pcol = _pbar_warn;
637     var e = element_id("submitBurner");
638 ravilov 140 if (!e.disabled) e.disabled = true;
639 dpavlin 128 }
640 ravilov 140 var col_g = Math.floor((_pbar_warn - pcol) * 255 / _pbar_warn);
641     var col = '#FF' + dec2hex(col_g) + '00';
642 dpavlin 128
643     //debug('pcol: '+pcol+' g:'+col_g+' _pbar_warn:'+ _pbar_warn + ' color: '+col);
644     element_id("gradient").style.backgroundColor = col;
645    
646     element_id("progressIndicator").innerHTML = pcnt + '%';
647     //element_id("progressIndicator").innerHTML = amount;
648    
649 ravilov 140 element_id("mask").style.clip = 'rect(' + Array(
650     '0px',
651     element_id("mask").offsetWidth + 'px',
652     element_id("mask").offsetHeight + 'px',
653     Math.round(_pbar_width * amount / max) + 'px'
654     ).join(' ') + ')';
655 dpavlin 128 }
656    
657 dpavlin 126 if (!self.body) self.body = new Object();
658     self.onload = self.document.onload = self.body.onload = function() {
659 ravilov 140 //pbar_reset();
660 dpavlin 126 sumiraj();
661 ravilov 140 };
662 dpavlin 126
663 ravilov 140 // -->
664 dpavlin 126 </script>
665 dpavlin 127 <div id="fixedBox">
666    
667 ravilov 140 Size: <input type="text" name="totalsize" size="7" readonly="readonly" style="text-align:right;" value="0" /> kB
668 dpavlin 128
669     <div id="mContainer">
670 ravilov 140 <div id="gradient">&nbsp;</div>
671     <div id="mask">&nbsp;</div>
672     <div id="progressIndicator">0%</div>
673 dpavlin 128 </div>
674 ravilov 140 <br/>
675 dpavlin 128
676 dpavlin 126 Note:
677 ravilov 140 <textarea name="note" cols="10" rows="5" id="note"></textarea>
678 dpavlin 127
679 ravilov 140 <input type="submit" id="submitBurner" value="Burn selected" name="submitBurner" />
680    
681 dpavlin 126 </div>
682 ravilov 140 <!--
683 dpavlin 127 <div id="debug" style="float: right; width: 10em; border: 1px #ff0000 solid; background-color: #ffe0e0; -moz-opacity: 0.7;">
684     no debug output yet
685     </div>
686 ravilov 140 -->
687 dpavlin 4 EOF3
688 dpavlin 102 $retHTML .= q{
689 iklaric 121 <input type="hidden" value="burn" name="action">
690     <input type="hidden" value="results" name="search_results">
691     <table style="fview" border="0" cellspacing="0" cellpadding="2">
692     <tr class="tableheader">
693     <td class="tableheader">
694 dpavlin 126 <input type="checkbox" name="allFiles" id="allFiles" onClick="checkAll('allFiles');">
695 iklaric 121 </td>
696     <td align="center">Share</td>
697     <td align="center">Backup no</td>
698     <td align="center">Type</td>
699     <td align="center">date</td>
700     <td align="center">age/days</td>
701     <td align="center">size/MB</td>
702 dpavlin 161 <td align="center">gzip size/kB</td>
703 iklaric 121 </tr>
704 dpavlin 102
705 dpavlin 58 };
706 dpavlin 4
707 dpavlin 102 my @color = (' bgcolor="#e0e0e0"', '');
708 dpavlin 31
709 dpavlin 102 my $i = 0;
710     my $host = '';
711 dpavlin 31
712 dpavlin 102 foreach my $backup ( getBackupsNotBurned() ) {
713 dpavlin 31
714 dpavlin 102 if ($host ne $backup->{'host'}) {
715     $i++;
716     $host = $backup->{'host'};
717     }
718 dpavlin 31 my $ftype = "";
719 dpavlin 125
720 dpavlin 145 my $checkbox_key = $backup->{'hostid'}. '_' .$backup->{'backupnum'} . '_' . $backup->{'id'};
721    
722 dpavlin 102 $retHTML .=
723 dpavlin 125 '<tr' . $color[$i %2 ] . '>
724     <td class="fview">';
725 dpavlin 145
726 dpavlin 161 if (($backup->{'inc_size'} || 0) > 0) {
727 dpavlin 125 $retHTML .= '
728 dpavlin 145 <input type="checkbox" name="fcb' . $checkbox_key . '" value="' . $checkbox_key . '" onClick="sumiraj(this);">';
729 dpavlin 125 }
730 dpavlin 145
731 dpavlin 125 $retHTML .=
732     '</td>' .
733 dpavlin 102 '<td align="right">' . $backup->{'host'} . ':' . $backup->{'share'} . '</td>' .
734     '<td align="center">' . $backup->{'backupnum'} . '</td>' .
735     '<td align="center">' . $backup->{'type'} . '</td>' .
736     '<td align="center">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
737     '<td align="center">' . $backup->{'age'} . '</td>' .
738     '<td align="right">' . $backup->{'size'} . '</td>' .
739 dpavlin 161 '<td align="right">' . $backup->{'inc_size'} .
740     '<input type="hidden" iD="fss'.$checkbox_key .'" value="'. $backup->{'inc_size'} .'"></td>' .
741 dpavlin 125
742 dpavlin 102 "</tr>\n";
743 dpavlin 4 }
744 dpavlin 31
745     $retHTML .= "</table>";
746 dpavlin 102 $retHTML .= "</form>";
747 dpavlin 4
748 dpavlin 31 return $retHTML;
749     }
750 dpavlin 4
751 dpavlin 86 sub displayGrid($) {
752     my ($param) = @_;
753 dpavlin 83
754     my $offset = $param->{'offset'};
755     my $hilite = $param->{'search_filename'};
756    
757 dpavlin 17 my $retHTML = "";
758    
759 dpavlin 55 my $start_t = time();
760    
761 dpavlin 86 my ($results, $files);
762 dpavlin 88 if ($param->{'use_hest'} && length($hilite) > 0) {
763 dpavlin 87 ($results, $files) = getFilesHyperEstraier($param);
764 dpavlin 86 } else {
765 dpavlin 87 ($results, $files) = getFiles($param);
766 dpavlin 86 }
767 dpavlin 31
768 dpavlin 55 my $dur_t = time() - $start_t;
769     my $dur = sprintf("%0.4fs", $dur_t);
770    
771 dpavlin 31 my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
772    
773 dpavlin 59 if ($results <= 0) {
774     $retHTML .= qq{
775     <p style="color: red;">No results found...</p>
776     };
777     return $retHTML;
778     } else {
779     # DEBUG
780     #use Data::Dumper;
781     #$retHTML .= '<pre>' . Dumper($files) . '</pre>';
782     }
783    
784    
785 dpavlin 17 $retHTML .= qq{
786 dpavlin 79 <div>
787     Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
788     </div>
789     <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
790     <tr class="fviewheader">
791 dpavlin 87 <td></td>
792 dpavlin 79 <td align="center">Share</td>
793     <td align="center">Type and Name</td>
794     <td align="center">#</td>
795     <td align="center">Size</td>
796     <td align="center">Date</td>
797     <td align="center">Media</td>
798 dpavlin 17 </tr>
799     };
800 dpavlin 31
801 dpavlin 17 my $file;
802 dpavlin 4
803 dpavlin 17 sub hilite_html($$) {
804     my ($html, $search) = @_;
805     $html =~ s#($search)#<b>$1</b>#gis;
806     return $html;
807 dpavlin 4 }
808 dpavlin 9
809 dpavlin 26 sub restore_link($$$$$$) {
810     my $type = shift;
811     my $action = 'RestoreFile';
812     $action = 'browse' if (lc($type) eq 'dir');
813     return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
814     }
815    
816 dpavlin 87 my $i = $offset * $on_page;
817    
818 dpavlin 31 foreach $file (@{ $files }) {
819 dpavlin 87 $i++;
820    
821 dpavlin 24 my $typeStr = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
822 dpavlin 79 $retHTML .= qq{<tr class="fviewborder">};
823 dpavlin 9
824 dpavlin 88 $retHTML .= qq{<td class="fviewborder">$i</td>};
825 dpavlin 87
826 dpavlin 79 $retHTML .=
827 dpavlin 86 qq{<td class="fviewborder" align="right">} . $file->{'hname'} . ':' . $file->{'sname'} . qq{</td>} .
828     qq{<td class="fviewborder"><img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" alt="$typeStr" align="middle">&nbsp;} . hilite_html( $file->{'filepath'}, $hilite ) . qq{</td>} .
829     qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupnum'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'filepath'} )}, $file->{'backupnum'} ) . qq{</td>} .
830 dpavlin 79 qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
831     qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
832 dpavlin 87 qq{<td class="fviewborder">} . '?' . qq{</td>};
833 dpavlin 9
834 dpavlin 17 $retHTML .= "</tr>";
835     }
836     $retHTML .= "</table>";
837    
838 dpavlin 31 # all variables which has to be transfered
839     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/) {
840     $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
841     }
842 dpavlin 17
843 dpavlin 31 my $del = '';
844     my $max_page = int( $results / $on_page );
845     my $page = 0;
846    
847 dpavlin 85 sub page_link($$$) {
848     my ($param,$page,$display) = @_;
849 dpavlin 31
850 dpavlin 85 $param->{'offset'} = $page;
851    
852     my $html = '<a href = "' . $MyURL;
853     my $del = '?';
854     foreach my $k (keys %{ $param }) {
855     if ($param->{$k}) {
856     $html .= $del . $k . '=' . ${EscURI( $param->{$k} )};
857     $del = '&';
858     }
859     }
860     $html .= '">' . $display . '</a>';
861     }
862    
863 dpavlin 31 $retHTML .= '<div style="text-align: center;">';
864    
865     if ($offset > 0) {
866 dpavlin 85 $retHTML .= page_link($param, $offset - 1, '&lt;&lt;') . ' ';
867 dpavlin 31 }
868    
869     while ($page <= $max_page) {
870     if ($page == $offset) {
871     $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
872     } else {
873 dpavlin 85 $retHTML .= $del . page_link($param, $page, $page + 1);
874 dpavlin 17 }
875 dpavlin 31
876     if ($page < $offset - $pager_pages && $page != 0) {
877     $retHTML .= " ... ";
878     $page = $offset - $pager_pages;
879     $del = '';
880     } elsif ($page > $offset + $pager_pages && $page != $max_page) {
881     $retHTML .= " ... ";
882     $page = $max_page;
883     $del = '';
884     } else {
885     $del = ' | ';
886     $page++;
887     }
888 dpavlin 17 }
889    
890 dpavlin 31 if ($offset < $max_page) {
891 dpavlin 85 $retHTML .= ' ' . page_link($param, $offset + 1, '&gt;&gt;');
892 dpavlin 31 }
893    
894     $retHTML .= "</div>";
895    
896 dpavlin 17 return $retHTML;
897     }
898 dpavlin 4
899     1;

  ViewVC Help
Powered by ViewVC 1.1.26