refactor displaySearchGrid and related function to remove multiple calls
[BackupPC.git] / lib / BackupPC / SearchLib.pm
index 373a41b..9c07b06 100644 (file)
@@ -19,7 +19,7 @@ sub getUnits() {
        my @ret;
 
        my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
-       my $sth = $dbh->prepare(qq{ SELECT id, share FROM shares} );
+       my $sth = $dbh->prepare(qq{ SELECT id, share FROM shares ORDER BY share} );
        $sth->execute();
        push @ret, { 'id' => '', 'share' => '-'};       # dummy any
 
@@ -32,14 +32,13 @@ sub getUnits() {
 
 sub epoch_to_iso {
        my $t = shift || return;
-       my $dt = DateTime->from_epoch( epoch => $t ) || return;
-       print STDERR "BUG: $t != " . $dt->epoch . "\n" unless ($t == $dt->epoch);
-       return $dt->ymd . ' ' . $dt->hms;
+       my $iso = BackupPC::Lib::timeStamp($t);
+       $iso =~ s/\s/ /g;
+       return $iso;
 }
 
-sub getWhere($) {
-       my ($param)    = @_;
-       my @conditions;
+sub dates_from_form($) {
+       my $param = shift || return;
 
        sub mk_epoch_date($$) {
                my ($name,$suffix) = @_;
@@ -57,32 +56,37 @@ sub getWhere($) {
                return $dt->epoch || 'NULL';
        }
 
-       my $backup_from = mk_epoch_date('search_backup', 'from');
+       return (
+               mk_epoch_date('search_backup', 'from'),
+               mk_epoch_date('search_backup', 'to'),
+               mk_epoch_date('search', 'from'),
+               mk_epoch_date('search', 'to'),
+       );
+}
+
+
+sub getWhere($) {
+       my $param = shift || return;
+
+       my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
+
+       my @conditions;
        push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
-       my $backup_to = mk_epoch_date('search_backup', 'to');
        push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
-
-       my $files_from = mk_epoch_date('search', 'from');
        push @conditions, qq{ files.date >= $files_from } if ($files_from);
-       my $files_to = mk_epoch_date('search', 'to');
        push @conditions, qq{ files.date <= $files_to } if ($files_to);
 
        print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" | ",@conditions);
-    
-       push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
 
-       push (@conditions, " upper(files.name) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
+       push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
+       push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
 
-       return (
-               join(" and ", @conditions),
-               $files_from, $files_to,
-               $backup_from, $backup_to
-       );
+       return join(" and ", @conditions);
 }
 
 
 sub getFiles($$) {
-       my ($where, $offset) = @_;
+       my ($param, $offset) = @_;
 
        my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
 
@@ -94,29 +98,30 @@ sub getFiles($$) {
                files.backupNum                 AS backupNum,
                files.name                      AS filename,
                files.path                      AS filepath,
-               shares.share||files.fullpath    AS networkPath,
                files.date                      AS date,
                files.type                      AS filetype,
                files.size                      AS size,
-               dvds.name                       AS dvd
+               -- dvds.name                    AS dvd
+               null                            AS dvd
        };
 
        my $sql_from = qq{
                FROM files 
                        INNER JOIN shares       ON files.shareID=shares.ID
                        INNER JOIN hosts        ON hosts.ID = shares.hostID
-                       INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID
+                       INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
        };
 
        my $sql_dvd_from = qq{
-                       LEFT  JOIN dvds         ON dvds.ID = files.dvdid
+                       -- LEFT  JOIN dvds              ON dvds.ID = files.dvdid
        };
 
        my $sql_where;
+       my $where = getWhere($param);
        $sql_where = " WHERE ". $where if ($where);
 
        my $sql_order = qq{
-               ORDER BY files.id
+               ORDER BY files.date
                LIMIT $on_page
                OFFSET ?
        };
@@ -169,36 +174,30 @@ sub getBackupsNotBurned() {
        my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
        my $sql = q{ 
        SELECT
-               hosts.ID                AS hostid,
+               backups.hostID          AS hostid,
                min(hosts.name)         AS host,
                backups.num             AS backupno,
                min(backups.type)       AS type,
-               min(backups.date)       AS date
-       FROM backups, shares, files, hosts
+               min(backups.date)       AS date,
+               min(backups.size)       AS size
+       FROM files 
+               INNER JOIN shares       ON files.shareID=shares.ID
+               INNER JOIN hosts        ON hosts.ID = shares.hostID
+               INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
        WHERE 
-               backups.num     = files.backupNum       AND
-               shares.ID       = files.shareID         AND         
-               backups.hostID  = shares.hostID         AND
-               hosts.ID        = backups.hostID        AND
                files.dvdid     IS NULL
        GROUP BY 
-               backups.hostID, backups.num, hosts.id
+               backups.hostID, backups.num
        ORDER BY min(backups.date)
        };
        my $sth = $dbh->prepare( $sql );
        my @ret;
        $sth->execute();
 
-       while ( my $row = $sth->fetchrow_hashref() ) {      
-               push(@ret, { 
-                        'host'         => $row->{'host'},
-                        'hostid'       => $row->{'hostid'},
-                        'backupno'     => $row->{'backupno'},
-                        'type'         => $row->{'type'},
-                        'date'         => $row->{'date'},
-                        'age'          => sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) ),
-                      }
-               );
+       while ( my $row = $sth->fetchrow_hashref() ) {
+               $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
+               $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
+               push @ret, $row;
        }
       
        return @ret;      
@@ -236,17 +235,21 @@ EOF3
               $retHTML.= q{<input type="hidden" value="burn" name="action">};
               $retHTML .= q{<input type="hidden" value="results" name="search_results">};
        }
-       $retHTML .= qq{<table style="fview"><tr>};
+       $retHTML .= qq{
+               <table style="fview" border="1" cellspacing="0" cellpadding="3">
+               <tr class="tableheader">
+       };
 
        if ($addForm) {
            $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";
        }
        $retHTML .=  qq{
-               <td class="tableheader">Host</td>
-               <td class="tableheader">Backup no</td>
-               <td class="tableheader">Type</td>
-               <td class="tableheader">date</td>
-               <td class="tableheader">age/days</td>
+               <td align="center">Host</td>
+               <td align="center">Backup no</td>
+               <td align="center">Type</td>
+               <td align="center">date</td>
+               <td align="center">age/days</td>
+               <td align="center">size/MB</td>
                </tr>
        };
 
@@ -278,6 +281,7 @@ EOF3
                        '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
                        '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
                        '<td class="fviewborder">' . $backup->{'age'} . '</td>' .
+                       '<td class="fviewborder">' . $backup->{'size'} . '</td>' .
                        '</tr>';
        }
 
@@ -290,13 +294,17 @@ EOF3
        return $retHTML;
 }      
 
-sub displayGrid($$$$) {
-       my ($where, $addForm, $offset, $hilite) = @_;
+sub displayGrid($$) {
+       my ($param, $addForm) = @_;
+
+       my $offset = $param->{'offset'};
+       my $hilite = $param->{'search_filename'};
+
        my $retHTML = "";
  
        my $start_t = time();
 
-       my ($results, $files) = getFiles($where, $offset);
+       my ($results, $files) = getFiles($param, $offset);
 
        my $dur_t = time() - $start_t;
        my $dur = sprintf("%0.4fs", $dur_t);
@@ -323,16 +331,17 @@ sub displayGrid($$$$) {
 
 
        $retHTML .= qq{
-       <br/>Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
-       <table style="fview" width="100%">
-               <tr> 
-               <td class="tableheader">Share</td>
-               <td class="tableheader">Name</td>
-               <td class="tableheader">Type</td>
-               <td class="tableheader">#</td>
-               <td class="tableheader">Size</td>
-               <td class="tableheader">Date</td>
-               <td class="tableheader">Media</td>
+       <div>
+       Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
+       </div>
+       <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
+               <tr class="fviewheader"> 
+               <td align="center">Share</td>
+               <td align="center">Type and Name</td>
+               <td align="center">#</td>
+               <td align="center">Size</td>
+               <td align="center">Date</td>
+               <td align="center">Media</td>
                </tr>
        };
 
@@ -353,19 +362,15 @@ sub displayGrid($$$$) {
 
        foreach $file (@{ $files }) {
                my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
-               $retHTML .= "<tr>";
-
-               foreach my $v ((
-                       $file->{'sharename'},
-                       qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),
-                       $typeStr,
-                       restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),
-                       $file->{'size'},
-                       epoch_to_iso( $file->{'date'} ),
-                       $file->{'dvd'}
-               )) {
-                       $retHTML .= qq{<td class="fviewborder">$v</td>};
-               }
+               $retHTML .= qq{<tr class="fviewborder">};
+
+               $retHTML .=
+                       qq{<td class="fviewborder" align="right">} . $file->{'sharename'} . qq{</td>} .
+                       qq{<td class="fviewborder"><img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" alt="$typeStr" align="middle">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ) . qq{</td>} .
+                       qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupno'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'fpath'} )}, $file->{'backupno'} ) . qq{</td>} .
+                       qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
+                       qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
+                       qq{<td class="fviewborder">} . $file->{'dvd'} . qq{</td>};
 
                $retHTML .= "</tr>";
        }