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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 129 by dpavlin, Thu Sep 22 14:25:51 2005 UTC revision 254 by dpavlin, Mon Dec 12 16:07:27 2005 UTC
# Line 8  use DBI; Line 8  use DBI;
8  use DateTime;  use DateTime;
9  use vars qw(%In $MyURL);  use vars qw(%In $MyURL);
10  use Time::HiRes qw/time/;  use Time::HiRes qw/time/;
11    use XML::Writer;
12    use IO::File;
13    
14  my $on_page = 100;  my $on_page = 100;
15  my $pager_pages = 10;  my $pager_pages = 10;
# Line 68  sub dates_from_form($) { Line 70  sub dates_from_form($) {
70                  $mm =~ s/\D//g;                  $mm =~ s/\D//g;
71                  $dd =~ s/\D//g;                  $dd =~ s/\D//g;
72    
73                    my $h = my $m = my $s = 0;
74                    if ($suffix eq 'to') {
75                            $h = 23;
76                            $m = 59;
77                            $s = 59;
78                    }
79    
80                  my $dt = new DateTime(                  my $dt = new DateTime(
81                          year => $yyyy,                          year => $yyyy,
82                          month => $mm,                          month => $mm,
83                          day => $dd                          day => $dd,
84                            hour => $h,
85                            minute => $m,
86                            second => $s,
87                  );                  );
88                  print STDERR "mk_epoch_date($name,$suffix) [$yyyy-$mm-$dd] = " . $dt->ymd . " " . $dt->hms . "\n";                  print STDERR "mk_epoch_date($name,$suffix) [$yyyy-$mm-$dd] = " . $dt->ymd . " " . $dt->hms . "\n";
89                  return $dt->epoch || 'NULL';                  return $dt->epoch || 'NULL';
# Line 100  sub getWhere($) { Line 112  sub getWhere($) {
112          push @conditions, qq{ files.date >= $files_from } if ($files_from);          push @conditions, qq{ files.date >= $files_from } if ($files_from);
113          push @conditions, qq{ files.date <= $files_to } if ($files_to);          push @conditions, qq{ files.date <= $files_to } if ($files_to);
114    
115          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" | ",@conditions);          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" and ",@conditions);
116    
117          push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});          push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
118          push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});          push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
# Line 108  sub getWhere($) { Line 120  sub getWhere($) {
120          return join(" and ", @conditions);          return join(" and ", @conditions);
121  }  }
122    
123    my $sort_def = {
124            search => {
125                    default => 'date_a',
126                    sql => {
127                            share_d => 'shares.name DESC',
128                            share_a => 'shares.name ASC',
129                            path_d => 'files.path DESC',
130                            path_a => 'files.path ASC',
131                            num_d => 'files.backupnum DESC',
132                            num_a => 'files.backupnum ASC',
133                            size_d => 'files.size DESC',
134                            size_a => 'files.size ASC',
135                            date_d => 'files.date DESC',
136                            date_a => 'files.date ASC',
137                    },
138                    est => {
139                            share_d => 'sname STRD',
140                            share_a => 'sname STRA',
141                            path_d => 'filepath STRD',
142                            path_a => 'filepath STRA',
143                            num_d => 'backupnum NUMD',
144                            num_a => 'backupnum NUMA',
145                            size_d => 'size NUMD',
146                            size_a => 'size NUMA',
147                            date_d => 'date NUMD',
148                            date_a => 'date NUMA',
149                    }
150            }, burn => {
151                    default => 'date_a',
152                    sql => {
153                            share_d => 'host DESC, share DESC',
154                            share_a => 'host ASC, share ASC',
155                            num_d => 'backupnum DESC',
156                            num_a => 'backupnum ASC',
157                            date_d => 'date DESC',
158                            date_a => 'date ASC',
159                            age_d => 'age DESC',
160                            age_a => 'age ASC',
161                            size_d => 'size DESC',
162                            size_a => 'size ASC',
163                            incsize_d => 'inc_size DESC',
164                            incsize_a => 'inc_size ASC',
165                    }
166            }
167    };
168    
169    sub getSort($$$) {
170            my ($part,$type, $sort_order) = @_;
171    
172            die "unknown part: $part" unless ($sort_def->{$part});
173            die "unknown type: $type" unless ($sort_def->{$part}->{$type});
174    
175            $sort_order ||= $sort_def->{$part}->{'default'};
176    
177            if (my $ret = $sort_def->{$part}->{$type}->{$sort_order}) {
178                    return $ret;
179            } else {
180                    # fallback to default sort order
181                    return $sort_def->{$part}->{$type}->{ $sort_def->{$part}->{'default'} };
182            }
183    }
184    
185  sub getFiles($) {  sub getFiles($) {
186          my ($param) = @_;          my ($param) = @_;
# Line 139  sub getFiles($) { Line 212  sub getFiles($) {
212          my $where = getWhere($param);          my $where = getWhere($param);
213          $sql_where = " WHERE ". $where if ($where);          $sql_where = " WHERE ". $where if ($where);
214    
215            my $order = getSort('search', 'sql', $param->{'sort'});
216    
217          my $sql_order = qq{          my $sql_order = qq{
218                  ORDER BY files.date                  ORDER BY $order
219                  LIMIT $on_page                  LIMIT $on_page
220                  OFFSET ?                  OFFSET ?
221          };          };
# Line 182  sub getHyperEstraier_url($) { Line 257  sub getHyperEstraier_url($) {
257          if ($use_hest =~ m#^http://#) {          if ($use_hest =~ m#^http://#) {
258                  $index_node_url = $use_hest;                  $index_node_url = $use_hest;
259          } else {          } else {
260                  $index_path = $TopDir . '/' . $index_path;                  $index_path = $TopDir . '/' . $use_hest;
261                  $index_path =~ s#//#/#g;                  $index_path =~ s#//#/#g;
262          }          }
263          return ($index_path, $index_node_url);          return ($index_path, $index_node_url);
# Line 239  sub getFilesHyperEstraier($) { Line 314  sub getFilesHyperEstraier($) {
314    
315  #       $cond->set_max( $offset + $on_page );  #       $cond->set_max( $offset + $on_page );
316          $cond->set_options( $HyperEstraier::Condition::SURE );          $cond->set_options( $HyperEstraier::Condition::SURE );
317          $cond->set_order( 'date NUMA' );          $cond->set_order( getSort('search', 'est', $param->{'sort'} ) );
318    
319          # get the result of search          # get the result of search
320          my @res;          my @res;
# Line 270  sub getFilesHyperEstraier($) { Line 345  sub getFilesHyperEstraier($) {
345                  }                  }
346    
347                  my $row;                  my $row;
348                  foreach my $c (qw/fid hname sname backupnum fiilename filepath date type size/) {                  foreach my $c (qw/fid hname sname backupnum filepath date type size/) {
349                          $row->{$c} = $doc->attr($c);                          $row->{$c} = $doc->attr($c);
350                  }                  }
351                  push @res, $row;                  push @res, $row;
# Line 288  sub getGzipName($$$) Line 363  sub getGzipName($$$)
363          $ret =~ s/\\h/$host/ge;          $ret =~ s/\\h/$host/ge;
364          $ret =~ s/\\s/$share/ge;          $ret =~ s/\\s/$share/ge;
365          $ret =~ s/\\n/$backupnum/ge;          $ret =~ s/\\n/$backupnum/ge;
366            
367            $ret =~ s/__+/_/g;
368    
369          return $ret;          return $ret;
370                    
371  }  }
372    
373  sub getBackupsNotBurned() {  sub get_tgz_size_by_name($) {
374            my $name = shift;
375    
376            my $tgz = $Conf{InstallDir}.'/'.$Conf{GzipTempDir}.'/'.$name;
377    
378            my $size = -1;
379    
380            if (-f "${tgz}.tar.gz") {
381                    $size = (stat("${tgz}.tar.gz"))[7];
382            } elsif (-d $tgz) {
383                    opendir(my $dir, $tgz) || die "can't opendir $tgz: $!";
384                    my @parts = grep { !/^\./ && !/md5/ && -f "$tgz/$_" } readdir($dir);
385                    $size = 0;
386                    foreach my $part (@parts) {
387                            $size += (stat("$tgz/$part"))[7] || die "can't stat $tgz/$part: $!";
388                    }
389                    closedir $dir;
390            } else {
391                    return -1;
392            }
393    
394            return $size;
395    }
396    
397    sub getGzipSize($$)
398    {
399            my ($hostID, $backupNum) = @_;
400            my $sql;
401            my $dbh = get_dbh();
402            
403            $sql = q{
404                                    SELECT hosts.name  as host,
405                                               shares.name as share,
406                                               backups.num as backupnum
407                                    FROM hosts, backups, shares
408                                    WHERE shares.id=backups.shareid AND
409                                              hosts.id =backups.hostid AND
410                                              hosts.id=? AND
411                                              backups.num=?
412                            };
413            my $sth = $dbh->prepare($sql);
414            $sth->execute($hostID, $backupNum);
415    
416            my $row = $sth->fetchrow_hashref();
417    
418            return get_tgz_size_by_name(
419                    getGzipName($row->{'host'}, $row->{share}, $row->{'backupnum'})
420            );
421    }
422    
423    sub getBackupsNotBurned($) {
424    
425            my $param = shift;
426          my $dbh = get_dbh();          my $dbh = get_dbh();
427    
428          my $sql = q{          my $order = getSort('burn', 'sql', $param->{'sort'});
429    
430    print STDERR "## sort=". ($param->{'sort'} || 'no sort param') . " burn sql order: $order\n";
431    
432            my $sql = qq{
433                  SELECT                  SELECT
434                          backups.hostID AS hostID,                          backups.hostID AS hostID,
435                          hosts.name AS host,                          hosts.name AS host,
436                          shares.name AS share,                          shares.name AS share,
437                          backups.id AS backupnum,                          backups.num AS backupnum,
438                          backups.type AS type,                          backups.type AS type,
439                          backups.date AS date,                          backups.date AS date,
440                          backups.size AS size                          date_part('epoch',now()) - backups.date as age,
441                            backups.size AS size,
442                            backups.id AS id,
443                            backups.inc_size AS inc_size,
444                            backups.parts AS parts
445                  FROM backups                  FROM backups
446                  INNER JOIN shares       ON backups.shareID=shares.ID                  INNER JOIN shares       ON backups.shareID=shares.ID
447                  INNER JOIN hosts        ON backups.hostID = hosts.ID                  INNER JOIN hosts        ON backups.hostID = hosts.ID
448                  LEFT OUTER JOIN archive_backup ON archive_backup.backup_id = backups.id AND archive_backup.backup_id IS NULL                  LEFT OUTER JOIN archive_backup ON archive_backup.backup_id = backups.id
449                  WHERE backups.size > 0                  WHERE backups.inc_size > 0 AND backups.inc_deleted is false AND archive_backup.backup_id IS NULL
450                  GROUP BY                  GROUP BY
451                          backups.hostID,                          backups.hostID,
452                          hosts.name,                          hosts.name,
# Line 320  sub getBackupsNotBurned() { Line 456  sub getBackupsNotBurned() {
456                          backups.id,                          backups.id,
457                          backups.type,                          backups.type,
458                          backups.date,                          backups.date,
459                          backups.size                          backups.size,
460                  ORDER BY backups.date                          backups.inc_size,
461                            backups.parts
462                    ORDER BY $order
463          };          };
464          my $sth = $dbh->prepare( $sql );          my $sth = $dbh->prepare( $sql );
465          my @ret;          my @ret;
466          $sth->execute();          $sth->execute();
467    
468          while ( my $row = $sth->fetchrow_hashref() ) {          while ( my $row = $sth->fetchrow_hashref() ) {
469                  $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );                  $row->{'age'} = sprintf("%0.1f", ( $row->{'age'} / 86400 ) );
470                    #$row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
471                  $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);                  $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
472                  my (undef,undef,undef,undef,undef,undef,undef,$fs_size,undef,undef,undef,undef,undef) =  
473                          stat( $Conf{InstallDir}.'/'.$Conf{GzipTempDir}.'/'.                  # do some cluster calculation (approximate) and convert to kB
474                                  getGzipName($row->{'host'}, $row->{share}, $row->{'backupnum'}));                  $row->{'inc_size'} = int(($row->{'inc_size'} + 1023 ) / ( 2 * 1024 ) * 2);
                 $row->{'fs_size'} = $fs_size;  
475                  push @ret, $row;                  push @ret, $row;
476          }          }
477                
478          return @ret;                return @ret;      
479  }  }
480    
481  sub displayBackupsGrid() {  sub displayBackupsGrid($) {
482    
483            my $param = shift;
484    
485            my $max_archive_size = $Conf{MaxArchiveSize} || die "no MaxArchiveSize";
486            my $max_archive_file_size = $Conf{MaxArchiveFileSize}  || die "no MaxFileInSize";
487    
488          my $retHTML .= q{          my $retHTML .= q{
489                  <form id="forma" method="POST" action=};                  <form id="forma" method="POST" action="}.$MyURL.q{?action=burn">
                 $retHTML .= "\"".$MyURL."\"";  
                 $retHTML .= q{?action=burn>  
490          };          };
491    
492          $retHTML .= <<'EOF3';          $retHTML .= <<'EOF3';
493  <style>  <style type="text/css">
494  <!--  <!--
495    DIV#fixedBox {
 div#fixedBox {  
496          position: absolute;          position: absolute;
497          bottom: 1em;          top: 50em;
498          left: 0.5em;          left: -24%;
499          padding: 0.5em;          padding: 0.5em;
500          width: 10em;          width: 20%;
501          background: #e0f0e0;          background-color: #E0F0E0;
502          border: 1px solid #00ff00;          border: 1px solid #00C000;
 }  
 @media screen {  
         div#fixedBox {  
                 position: fixed;  
         }  
         /* Don't do this at home */  
         * html {  
                 overflow-y: hidden;  
         }  
         * html body {  
                 overflow-y: auto;  
                 height: 100%;  
                 padding: 0 1em 0 12em;  
                 font-size: 100%;  
         }  
         * html div#fixedBox {  
                 position: absolute;      
         }  
         /* All done. */  
503  }  }
504    
505  #mContainer {  DIV#fixedBox, DIV#fixedBox INPUT, DIV#fixedBox TEXTAREA {
506          position: relative;          font-size: 10pt;
507    }
508    
509    FORM>DIV#fixedBox {
510            position: fixed !important;
511            left: 0.5em !important;
512            top: auto !important;
513            bottom: 1em !important;
514            width: 15% !important;
515    }
516    
517    DIV#fixedBox INPUT[type=text], DIV#fixedBox TEXTAREA {
518            border: 1px solid #00C000;
519    }
520    
521    DIV#fixedBox #note {
522            display: block;
523          width: 100%;          width: 100%;
         height: 1.1em;  
         padding: 0px;  
         border: 1px solid #000000;  
524  }  }
525    
526  #gradient {  DIV#fixedBox #submitBurner {
527          position: absolute;          display: block;
         top: 0px;  
         left: 0px;  
528          width: 100%;          width: 100%;
529            margin-top: 0.5em;
530            cursor: pointer;
531    }
532    
533    * HTML {
534            overflow-y: hidden;
535    }
536    
537    * HTML BODY {
538            overflow-y: auto;
539          height: 100%;          height: 100%;
540          display: block;          font-size: 100%;
         background-color: #ffff00;  
541  }  }
542    
543  #mask {  * HTML DIV#fixedBox {
544          position: absolute;          position: absolute;
545          top: 0px;  }
546          left: 0px;  
547    #mContainer, #gradient, #mask, #progressIndicator {
548            display: block;
549          width: 100%;          width: 100%;
550          height: 100%;          font-size: 10pt;
551            font-weight: bold;
552            text-align: center;
553            vertical-align: middle;
554            padding: 1px;
555    }
556    
557    #gradient, #mask, #progressIndicator {
558            left: 0;
559            border-width: 1px;
560            border-style: solid;
561            border-color: #000000;
562            color: #404040;
563            margin: 0.4em;
564            position: absolute;
565            margin-left: -1px;
566            margin-top: -1px;
567            margin-bottom: -1px;
568            overflow: hidden;
569    }
570    
571    #mContainer {
572          display: block;          display: block;
573          font-size: 1px;          position: relative;
574            padding: 0px;
575            margin-top: 0.4em;
576            margin-bottom: 0.5em;
577    }
578    
579    #gradient {
580            z-index: 1;
581            background-color: #FFFF00;
582    }
583    
584    #mask {
585            z-index: 2;
586          background-color: #FFFFFF;          background-color: #FFFFFF;
         overflow: hidden;  
587  }  }
588    
589  #progressIndicator {  #progressIndicator {
590          position: absolute;          z-index: 3;
591          top: 0px;          background-color: transparent;
592          left: 0px;  }
593    
594    #parts {
595            padding: 0.4em;
596            display: none;
597          width: 100%;          width: 100%;
598          height: 100%;          font-size: 80%;
599          display: block;          color: #ff0000;
         font-weight: bold;  
         color: #404040;  
         font-size: 10pt;  
600          text-align: center;          text-align: center;
601  }  }
   
602  -->  -->
603  </style>  </style>
604  <script language="javascript" type="text/javascript">  <script type="text/javascript">
605  <!--  <!--
606    
607  var debug_div = null;  var debug_div = null;
608  var media_size = 4400 * 1024;  EOF3
609    
610            # take maximum archive size from configuration
611            $retHTML .= qq{
612    var media_size = $max_archive_size ;
613    var max_file_size = $max_archive_file_size;
614    
615    };
616    
617            $retHTML .= <<'EOF3';
618    
619  function debug(msg) {  function debug(msg) {
620  //      return; // Disable debugging          return; // Disable debugging
621    
622          if (! debug_div) debug_div = document.getElementById('debug');          if (! debug_div) debug_div = document.getElementById('debug');
623    
# Line 460  function element_id(name,element) { Line 644  function element_id(name,element) {
644  }  }
645    
646  function checkAll(location) {  function checkAll(location) {
647          var len = element_id('forma').elements.length;          var f = element_id('forma') || null;
648            if (!f) return false;
649    
650            var len = f.elements.length;
651          var check_all = element_id('allFiles');          var check_all = element_id('allFiles');
652          var suma = 0;          var suma = check_all.checked ? (parseInt(f.elements['totalsize'].value) || 0) : 0;
653    
654          for (var i = 0; i < len; i++) {          for (var i = 0; i < len; i++) {
655                    var e = f.elements[i];
656                  var e = element_id('forma').elements[i];                  if (e.name != 'all' && e.name.substr(0, 3) == 'fcb') {
                 if (e.name != 'all' && e.name.substr(0,3) == 'fcb') {  
657                          if (check_all.checked) {                          if (check_all.checked) {
658                                    if (e.checked) continue;
659                                  var el = element_id("fss" + e.name.substr(3));                                  var el = element_id("fss" + e.name.substr(3));
660                                  var size = parseInt(el.value) || 0;                                  var size = parseInt(el.value) || 0;
661                                  debug('suma: '+suma+' size: '+size);                                  debug('suma: '+suma+' size: '+size);
# Line 486  function checkAll(location) { Line 673  function checkAll(location) {
673          update_sum(suma);          update_sum(suma);
674  }  }
675    
676  function update_sum(suma) {  function update_sum(suma, suma_disp) {
677          element_id('forma').totalsize.value = suma;          if (! suma_disp) suma_disp = suma;
678            element_id('forma').elements['totalsize'].value = suma_disp;
679          pbar_set(suma, media_size);          pbar_set(suma, media_size);
680          debug('total size: '+suma);          debug('total size: ' + suma);
681  }  }
682    
683  function sumiraj(e) {  function sumiraj(e) {
684          var suma = parseInt(element_id('forma').totalsize.value) || 0;          var suma = parseInt(element_id('forma').elements['totalsize'].value) || 0;
685          var len = element_id('forma').elements.length;          var len = element_id('forma').elements.length;
686          if (e) {          if (e) {
687                  var size = parseInt( element_id("fss" + e.name.substr(3)).value );                  var size = parseInt( element_id("fss" + e.name.substr(3)).value);
688                  if (e.checked) {                  if (e.checked) {
689                          suma += size;                          suma += size;
690                  } else {                  } else {
691                          suma -= size;                          suma -= size;
692                  }                  }
693    
694                    var parts = parseInt( element_id("prt" + e.name.substr(3)).value);
695                    if (suma > max_file_size && suma == size && parts > 1) {
696                            element_id("parts").innerHTML = "This will take "+parts+" mediums!";
697                            element_id("parts").style.display = 'block';
698                            update_sum(media_size, suma);
699                            suma = media_size;
700                            return suma;
701                    } else {
702                            element_id("parts").style.display = 'none';
703                    }
704    
705                    if (suma < 0) suma = 0;
706          } else {          } else {
707                  suma = 0;                  suma = 0;
708                  for (var i = 0; i < len; i++) {                  for (var i = 0; i < len; i++) {
# Line 518  function sumiraj(e) { Line 719  function sumiraj(e) {
719    
720  /* progress bar */  /* progress bar */
721    
722  var _pbar_width = 0;  var _pbar_width = null;
723  var _pbar_warn = 10;    // change color in last 10%  var _pbar_warn = 10;    // change color in last 10%
724    
725  function pbar_reset() {  function pbar_reset() {
726          element_id("mask").style.left = "0px";          element_id("mask").style.left = "0px";
727          _pbar_width = element_id("mContainer").offsetWidth - 2;          _pbar_width = element_id("mContainer").offsetWidth - 2;
728          element_id("mask").style.width = _pbar_width + "px";          element_id("mask").style.width = _pbar_width + "px";
         element_id("progressIndicator").style.zIndex  = 10;  
729          element_id("mask").style.display = "block";          element_id("mask").style.display = "block";
730            element_id("progressIndicator").style.zIndex  = 10;
731          element_id("progressIndicator").innerHTML = "0";          element_id("progressIndicator").innerHTML = "0";
732  }  }
733    
734  function dec2hex(d) {  function dec2hex(d) {
735          var hch="0123456789ABCDEF";          var hch = '0123456789ABCDEF';
736          var a=d%16;          var a = d % 16;
737          var q=(d-a)/16;          var q = (d - a) / 16;
738          return hch.charAt(q)+hch.charAt(a);          return hch.charAt(q) + hch.charAt(a);
739  }  }
740    
   
741  function pbar_set(amount, max) {  function pbar_set(amount, max) {
742            debug('pbar_set('+amount+', '+max+')');
743    
744          debug('pbar_set( '+amount+' , '+max+' )');          if (_pbar_width == null) {
745                    var _mc = element_id("mContainer");
746          curWidth = parseInt(element_id("mask").offsetWidth);                  if (_pbar_width == null) _pbar_width = parseInt(_mc.offsetWidth ? (_mc.offsetWidth - 2) : 0) || null;
747          curLeft = parseInt(element_id("mask").offsetLeft);                  if (_pbar_width == null) _pbar_width = parseInt(_mc.clientWidth ? (_mc.clientWidth + 2) : 0) || null;
748                    if (_pbar_width == null) _pbar_width = 0;
749            }
750    
751          var pcnt = Math.floor( amount * 100 / max );          var pcnt = Math.floor(amount * 100 / max);
752          var p90 = 100 - _pbar_warn;          var p90 = 100 - _pbar_warn;
753          var pcol = pcnt - p90;          var pcol = pcnt - p90;
754          if (pcol < _pbar_warn) {          if (Math.round(pcnt) <= 100) {
755                  if (pcol < 0) pcol = 0;                  if (pcol < 0) pcol = 0;
756                  var e = element_id("submitBurner");                  var e = element_id("submitBurner");
757                  if (e && e.disabled) {                  debug('enable_button');
758                          debug('enable_button');                  e.disabled = false;
759                          var a = e.getAttributeNode('disabled') || null;                  var a = e.getAttributeNode('disabled') || null;
760                          if (a) e.removeAttributeNode(a);                  if (a) e.removeAttributeNode(a);
761                  }          } else {
         } else if (pcol > _pbar_warn) {  
762                  debug('disable button');                  debug('disable button');
763                  pcol = _pbar_warn;                  pcol = _pbar_warn;
764                  var e = element_id("submitBurner");                  var e = element_id("submitBurner");
765                  if (! e.disabled) e.disabled = true;                  if (!e.disabled) e.disabled = true;
766          }          }
767          var col_g = Math.floor( ( _pbar_warn - pcol ) * 255 / _pbar_warn );          var col_g = Math.floor((_pbar_warn - pcol) * 255 / _pbar_warn);
768          var col = '#ff' + dec2hex( col_g ) + '00';          var col = '#FF' + dec2hex(col_g) + '00';
769    
770          //debug('pcol: '+pcol+' g:'+col_g+' _pbar_warn:'+ _pbar_warn + ' color: '+col);          //debug('pcol: '+pcol+' g:'+col_g+' _pbar_warn:'+ _pbar_warn + ' color: '+col);
771          element_id("gradient").style.backgroundColor = col;          element_id("gradient").style.backgroundColor = col;
772    
         var size = parseInt( _pbar_width * amount / max );  
   
         curWidth = _pbar_width - size;  
         curLeft = size ;  
   
         //debug('size: '+size+' curWidth '+curWidth+' curLeft: '+curLeft);  
   
773          element_id("progressIndicator").innerHTML = pcnt + '%';          element_id("progressIndicator").innerHTML = pcnt + '%';
774          //element_id("progressIndicator").innerHTML = amount;          //element_id("progressIndicator").innerHTML = amount;
775    
776          if (curLeft > _pbar_width) {          element_id("mask").style.clip = 'rect(' + Array(
777                  element_id("mask").style.display = "none";                  '0px',
778                  return;                  element_id("mask").offsetWidth + 'px',
779          } else {                  element_id("mask").offsetHeight + 'px',
780                  element_id("mask").style.display = "";                  Math.round(_pbar_width * amount / max) + 'px'
781          }          ).join(' ') + ')';
   
         //if(parseInt(element_id("mask").offsetWidth)>10)  
         element_id("mask").style.width = curWidth + "px";  
         element_id("mask").style.left = curLeft + "px";  
   
782  }  }
783    
784  if (!self.body) self.body = new Object();  if (!self.body) self.body = new Object();
785  self.onload = self.document.onload = self.body.onload = function() {  self.onload = self.document.onload = self.body.onload = function() {
786          pbar_reset();          //pbar_reset();
787          sumiraj();          sumiraj();
788  }  };
789    
790  //-->  // -->
791  </script>  </script>
792  <div id="fixedBox">  <div id="fixedBox">
793    
794  Size:  Size: <input type="text" name="totalsize" size="7" readonly="readonly" style="text-align:right;" value="0" /> kB
 <input type="text" name="totalsize" size="7" readonly>  
795    
796  <div id="mContainer">  <div id="mContainer">
797          <div id="gradient"></div>          <div id="gradient">&nbsp;</div>
798          <div id="mask"></div>          <div id="mask">&nbsp;</div>
799          <div id="progressIndicator">&nbsp;</div>          <div id="progressIndicator">0%</div>
800  </div>  </div>
   
801  <br/>  <br/>
802    
803    <div id="parts">&nbsp;</div>
804    
805  Note:  Note:
806  <br/>  <textarea name="note" cols="10" rows="5" id="note"></textarea>
807  <textarea name="note" cols="10" rows="5">  
808  </textarea>  <input type="submit" id="submitBurner" value="Burn selected" name="submitBurner" />
 <br/>  
 <input type="submit" id="submitBurner" value="Burn selected" name="submitBurner">  
809    
810  </div>  </div>
811    <!--
812  <div id="debug" style="float: right; width: 10em; border: 1px #ff0000 solid; background-color: #ffe0e0; -moz-opacity: 0.7;">  <div id="debug" style="float: right; width: 10em; border: 1px #ff0000 solid; background-color: #ffe0e0; -moz-opacity: 0.7;">
813  no debug output yet  no debug output yet
814  </div>  </div>
815    -->
816  EOF3  EOF3
817          $retHTML .= q{          $retHTML .= q{
818                          <input type="hidden" value="burn" name="action">                          <input type="hidden" value="burn" name="action">
# Line 632  EOF3 Line 822  EOF3
822                          <td class="tableheader">                          <td class="tableheader">
823                                  <input type="checkbox" name="allFiles" id="allFiles" onClick="checkAll('allFiles');">                                  <input type="checkbox" name="allFiles" id="allFiles" onClick="checkAll('allFiles');">
824                          </td>                          </td>
825                          <td align="center">Share</td>          } .
826                          <td align="center">Backup no</td>                  sort_header($param, 'Share', 'share', 'center') .
827                    sort_header($param, '#', 'num', 'center') .
828            qq{
829                          <td align="center">Type</td>                          <td align="center">Type</td>
830                          <td align="center">date</td>          } .
831                          <td align="center">age/days</td>                  sort_header($param, 'Date', 'date', 'center') .
832                          <td align="center">size/MB</td>                  sort_header($param, 'Age/days', 'age', 'center') .
833                          <td align="center">gzip size</td>                  sort_header($param, 'Size/Mb', 'size', 'center') .
834                    sort_header($param, 'gzip size/Kb', 'incsize', 'center') .
835            qq{
836                          </tr>                          </tr>
   
837          };          };
838    
839          my @color = (' bgcolor="#e0e0e0"', '');          my @color = (' bgcolor="#e0e0e0"', '');
# Line 648  EOF3 Line 841  EOF3
841          my $i = 0;          my $i = 0;
842          my $host = '';          my $host = '';
843    
844          foreach my $backup ( getBackupsNotBurned() ) {          foreach my $backup ( getBackupsNotBurned($param) ) {
845    
846                  if ($host ne $backup->{'host'}) {                  if ($host ne $backup->{'host'}) {
847                          $i++;                          $i++;
# Line 656  EOF3 Line 849  EOF3
849                  }                  }
850                  my $ftype = "";                  my $ftype = "";
851    
852                    my $checkbox_key = $backup->{'hostid'}. '_' .$backup->{'backupnum'} . '_' . $backup->{'id'};
853    
854                  $retHTML .=                  $retHTML .=
855                          '<tr' . $color[$i %2 ] . '>                          '<tr' . $color[$i %2 ] . '>
856                          <td class="fview">';                          <td class="fview">';
857                  # FIXME  
858                  $backup->{'fs_size'} = int($backup->{'size'} * 1024);                  if (($backup->{'inc_size'} || 0) > 0) {
                 if (($backup->{'fs_size'} || 0) > 0) {  
859                          $retHTML .= '                          $retHTML .= '
860                          <input type="checkbox" name="fcb' .                          <input type="checkbox" name="fcb' . $checkbox_key . '" value="' . $checkbox_key . '" onClick="sumiraj(this);">';
                         $backup->{'hostid'}.'_'.$backup->{'backupnum'} .  
                         '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupnum'} .  
                         '" onClick="sumiraj(this);">';  
861                  }                  }
862    
863                  $retHTML .=                  $retHTML .=
864                          '</td>' .                          '</td>' .
865                          '<td align="right">' . $backup->{'host'} . ':' . $backup->{'share'} . '</td>' .                          '<td align="right">' . $backup->{'host'} . ':' . $backup->{'share'} . '</td>' .
# Line 676  EOF3 Line 868  EOF3
868                          '<td align="center">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .                          '<td align="center">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
869                          '<td align="center">' . $backup->{'age'} . '</td>' .                          '<td align="center">' . $backup->{'age'} . '</td>' .
870                          '<td align="right">' . $backup->{'size'} . '</td>' .                          '<td align="right">' . $backup->{'size'} . '</td>' .
871                          '<td align="right">' . $backup->{'fs_size'} .                          '<td align="right">' . $backup->{'inc_size'} .
872                          '<input type="hidden" iD="fss'.$backup->{'hostid'}.'_'.$backup->{'backupnum'} . '" value="'. $backup->{'fs_size'} .'"></td>' .                          '<input type="hidden" id="fss'.$checkbox_key .'" value="'. $backup->{'inc_size'} .'"></td>' .
873                            '<input type="hidden" id="prt'.$checkbox_key .'" value="'. $backup->{'parts'} .'"></td>' .
874    
875                          "</tr>\n";                          "</tr>\n";
876          }          }
# Line 729  sub displayGrid($) { Line 922  sub displayGrid($) {
922          <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">          <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
923                  <tr class="fviewheader">                  <tr class="fviewheader">
924                  <td></td>                  <td></td>
925                  <td align="center">Share</td>          };
926                  <td align="center">Type and Name</td>  
927                  <td align="center">#</td>          sub sort_header($$$$) {
928                  <td align="center">Size</td>                  my ($param, $display, $name, $align) = @_;
929                  <td align="center">Date</td>  
930                    my ($sort_what, $sort_direction) = split(/_/,$param->{'sort'},2);
931    
932                    my $old_sort = $param->{'sort'};
933    
934                    my $html = qq{<td align="$align"};
935                    my $arrow = '';
936    
937                    if (lc($sort_what) eq lc($name)) {
938                            my $direction = lc($sort_direction);
939    
940                            # swap direction or fallback to default
941                            $direction =~ tr/ad/da/;
942                            $direction = 'a' unless ($direction =~ /[ad]/);
943    
944                            $param->{'sort'} = $name . '_' . $direction;
945                            $html .= ' style="border: 1px solid #808080;"';
946                    
947                            # add unicode arrow for direction
948                            $arrow .= '&nbsp;';
949                            $arrow .= $direction eq 'a'  ?  '&#9650;'
950                                    : $direction eq 'd'  ?  '&#9660;'
951                                    :                       ''
952                                    ;
953    
954                    } else {
955                            $param->{'sort'} = $name . '_a';
956                    }
957    
958                    $html .= '><a href="' . page_uri($param) . '">' . $display . '</a>' . $arrow . '</td>';
959                    $param->{'sort'} = $old_sort;
960    
961                    return $html;
962            }
963    
964            $retHTML .=
965                    sort_header($param, 'Share', 'share', 'center') .
966                    sort_header($param, 'Type and Name', 'path', 'center') .
967                    sort_header($param, '#', 'num', 'center') .
968                    sort_header($param, 'Size', 'size', 'center') .
969                    sort_header($param, 'Date', 'date', 'center');
970    
971            $retHTML .= qq{
972                  <td align="center">Media</td>                  <td align="center">Media</td>
973                  </tr>                  </tr>
974          };          };
# Line 753  sub displayGrid($) { Line 988  sub displayGrid($) {
988                  return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);                  return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
989          }          }
990    
991            my $sth_archived;
992            my %archived_cache;
993    
994            sub check_archived($$$) {
995                    my ($host, $share, $num) = @_;
996    
997                    if (my $html = $archived_cache{"$host $share $num"}) {
998                            return $html;
999                    }
1000    
1001                    $sth_archived ||= $dbh->prepare(qq{
1002                            select
1003                                    dvd_nr, note,
1004                                    count(archive_burned.copy) as copies
1005                            from archive
1006                            inner join archive_burned on archive_burned.archive_id = archive.id
1007                            inner join archive_backup on archive.id = archive_backup.archive_id
1008                            inner join backups on backups.id = archive_backup.backup_id
1009                            inner join hosts on hosts.id = backups.hostid
1010                            inner join shares on shares.id = backups.shareid
1011                            where hosts.name = ? and shares.name = ? and backups.num = ?
1012                            group by dvd_nr, note
1013                    });
1014    
1015                    my @mediums;
1016    
1017                    $sth_archived->execute($host, $share, $num);
1018                    while (my $row = $sth_archived->fetchrow_hashref()) {
1019                            push @mediums, '<abbr title="' .
1020                                    $row->{'note'} .
1021                                    ' [' . $row->{'copies'} . ']' .
1022                                    '">' .$row->{'dvd_nr'} .
1023                                    '</abbr>';
1024                    }
1025    
1026                    my $html = join(", ",@mediums);
1027                    $archived_cache{"$host $share $num"} = $html;
1028                    return $html;
1029            }
1030    
1031          my $i = $offset * $on_page;          my $i = $offset * $on_page;
1032    
1033          foreach $file (@{ $files }) {          foreach $file (@{ $files }) {
# Line 769  sub displayGrid($) { Line 1044  sub displayGrid($) {
1044                          qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupnum'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'filepath'} )}, $file->{'backupnum'} ) . qq{</td>} .                          qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupnum'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'filepath'} )}, $file->{'backupnum'} ) . qq{</td>} .
1045                          qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .                          qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
1046                          qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .                          qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
1047                          qq{<td class="fviewborder">} . '?' . qq{</td>};                          qq{<td class="fviewborder">} . check_archived( $file->{'hname'}, $file->{'sname'}, $file->{'backupnum'} ) . qq{</td>};
1048    
1049                  $retHTML .= "</tr>";                  $retHTML .= "</tr>";
1050          }          }
# Line 784  sub displayGrid($) { Line 1059  sub displayGrid($) {
1059          my $max_page = int( $results / $on_page );          my $max_page = int( $results / $on_page );
1060          my $page = 0;          my $page = 0;
1061    
1062          sub page_link($$$) {          sub page_uri($) {
1063                  my ($param,$page,$display) = @_;                  my $param = shift || die "no param?";
1064    
1065                  $param->{'offset'} = $page;                  my $uri = $MyURL;
   
                 my $html = '<a href = "' . $MyURL;  
1066                  my $del = '?';                  my $del = '?';
1067                  foreach my $k (keys %{ $param }) {                  foreach my $k (keys %{ $param }) {
1068                          if ($param->{$k}) {                          if ($param->{$k}) {
1069                                  $html .= $del . $k . '=' . ${EscURI( $param->{$k} )};                                  $uri .= $del . $k . '=' . ${EscURI( $param->{$k} )};
1070                                  $del = '&';                                  $del = '&';
1071                          }                          }
1072                  }                  }
1073                  $html .= '">' . $display . '</a>';                  return $uri;
1074            }
1075    
1076            sub page_link($$$) {
1077                    my ($param,$page,$display) = @_;
1078    
1079                    $param->{'offset'} = $page if (defined($page));
1080    
1081                    my $html = '<a href = "' . page_uri($param) . '">' . $display . '</a>';
1082          }          }
1083    
1084          $retHTML .= '<div style="text-align: center;">';          $retHTML .= '<div style="text-align: center;">';

Legend:
Removed from v.129  
changed lines
  Added in v.254

  ViewVC Help
Powered by ViewVC 1.1.26