/[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 142 - (hide annotations)
Fri Oct 7 08:58:45 2005 UTC (18 years, 7 months ago) by ravilov
File size: 20745 byte(s)
fix proslog fixa: nije dobro radilo odcheckiranje glavnog checkboxa, niti checkiranje checkboxova ako se vec checkirani "preklapaju" sa onima koje bi checkAll() htio checkirati

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

  ViewVC Help
Powered by ViewVC 1.1.26