use DateTime::Duration to correctly convert partial dates in to fields
[BackupPC.git] / lib / BackupPC / Search.pm
index ad27bb1..70f084b 100644 (file)
@@ -79,31 +79,28 @@ sub dates_from_form($) {
        sub mk_epoch_date($$) {
                my ($name,$suffix) = @_;
 
-               my $yyyy = $param->{ $name . '_year_' . $suffix} || return undef;
-               my $mm .= $param->{ $name . '_month_' . $suffix} ||
-                       ( $suffix eq 'from' ? 1 : 12);
-               my $dd .= $param->{ $name . '_day_' . $suffix} ||
-                       ( $suffix eq 'from' ? 1 : 31);
+               my $yyyy = $param->{ $name . '_year_'  . $suffix}  || return undef;
+               my $mm   = $param->{ $name . '_month_' . $suffix};
+               my $dd   = $param->{ $name . '_day_'   . $suffix};
 
                $yyyy =~ s/\D//g;
-               $mm =~ s/\D//g;
-               $dd =~ s/\D//g;
-
-               my $h = my $m = my $s = 0;
-               if ($suffix eq 'to') {
-                       $h = 23;
-                       $m = 59;
-                       $s = 59;
-               }
+               $mm   =~ s/\D//g;
+               $dd   =~ s/\D//g;
 
                my $dt = new DateTime(
-                       year => $yyyy,
-                       month => $mm,
-                       day => $dd,
-                       hour => $h,
-                       minute => $m,
-                       second => $s,
+                       year   => $yyyy,
+                       month  => $mm || 1,
+                       day    => $dd || 1,
+                       hour   => 0,
+                       minute => 0,
+                       second => 0,
                );
+               if ( $suffix eq 'to' && ( ! $mm || ! $dd ) ) {
+                       $dt += DateTime::Duration->new( years  => 1 ) if ! $mm;
+                       $dt += DateTime::Duration->new( months => 1 ) if ! $dd;
+                       $dt -= DateTime::Duration->new( days   => 1 );
+               }
+
                print STDERR "mk_epoch_date($name,$suffix) [$yyyy-$mm-$dd] = " . $dt->ymd . " " . $dt->hms . "\n";
                return $dt->epoch || 'NULL';
        }
@@ -229,8 +226,8 @@ sub getFiles($) {
        # do we have to add tables for burned media?
        if ( $param->{burned} ) {
                $sql_from .= qq{
-                       LEFT OUTER JOIN archive_backup on archive_backup.backup_id = backups.id
-                       LEFT OUTER JOIN archive_burned on archive_burned.archive_id = archive_backup.archive_id
+                       LEFT OUTER JOIN archive_backup_parts on backup_id = backups.id
+                       LEFT OUTER JOIN archive_burned on archive_burned.archive_id = archive_id
                };
        }
 
@@ -398,6 +395,13 @@ print STDERR "## sort=". ($param->{'sort'} || 'no sort param') . " burn sql orde
                LEFT OUTER JOIN archive_parts  ap ON ap.backup_part_id = p.id
                LEFT OUTER JOIN archive_burned ab ON ab.archive_id = ap.archive_id
                GROUP BY p.id,filename,b.date,age,p.size,p.part_nr
+       };
+
+       $sql .= qq{
+               HAVING count(ap.*) = 0
+       } unless $param->{scheduled};
+
+       $sql .= qq{
                ORDER BY b.date,p.part_nr
        };
        my $sth = $dbh->prepare( $sql );
@@ -418,14 +422,12 @@ sub displayBackupsGrid($) {
        my $param = shift;
 
        my $max_archive_size = $Conf{ArchiveMediaSize} || die "no ArchiveMediaSize";
-       my $max_archive_file_size = $Conf{ArchiveChunkSize}  || die "no MaxFileInSize";
 
        my $retHTML .= qq|
                <form id="forma" method="POST" action="$MyURL?action=burn">
 
 <script type="text/javascript">
 var media_size = $max_archive_size ;
-var max_file_size = $max_archive_file_size;
 </script>
 
        |;
@@ -475,6 +477,11 @@ var max_file_size = $max_archive_file_size;
        }
 
        $retHTML .= "</table>";
+
+       $retHTML .= q{
+<input type=submit name="scheduled" value="Show scheduled parts">
+       } unless $param->{scheduled};
+
        $retHTML .= "</form>";
       
        return $retHTML;
@@ -599,16 +606,16 @@ sub displayGrid($) {
 
                $sth_archived ||= $dbh->prepare(qq{
                        select
-                               dvd_nr, note,
+                               archive.dvd_nr, note,
                                count(archive_burned.copy) as copies
                        from archive
                        inner join archive_burned on archive_burned.archive_id = archive.id
-                       inner join archive_backup on archive.id = archive_backup.archive_id
-                       inner join backups on backups.id = archive_backup.backup_id
+                       inner join archive_backup_parts on archive.id = archive_backup_parts.archive_id
+                       inner join backups on backups.id = archive_backup_parts.backup_id
                        inner join hosts on hosts.id = backups.hostid
                        inner join shares on shares.id = backups.shareid
                        where hosts.name = ? and shares.name = ? and backups.num = ?
-                       group by dvd_nr, note
+                       group by archive.dvd_nr, note
                });
 
                my @mediums;