=cut
-# TODO:
-# Si c'est un fichier selectionne, afficher ses attributs
-# ajouter le base_fic et base_url dans les options bweb
-#
-
use strict;
+use POSIX qw/strftime/;
use Bweb;
use CCircle ;
use Digest::MD5 qw(md5_hex);
use File::Basename qw/basename dirname/;
-my $conf = new Bweb::Config(config_file => '/etc/bweb/config');
+my $conf = new Bweb::Config(config_file => $Bweb::config_file);
$conf->load();
my $bweb = new Bweb(info => $conf);
$bweb->connect_db();
-my $arg = $bweb->get_form('where', 'jobid');
-my $where = $arg->{where};
+my $arg = $bweb->get_form('where', 'jobid', 'pathid', 'filenameid');
+my $where = $arg->{where} || '/';
my $jobid = $arg->{jobid};
+my $pathid = $arg->{pathid};
+my $fnid = $arg->{filenameid};
my $jobid_url = "jobid=$jobid";
my $opt_level = 2 ;
my $max_file = 20;
my $batch = CGI::param("mode") || '';
-my $md5_rep = md5_hex("$where:$jobid") ;
+my $md5_rep = md5_hex("$where:$jobid:$pathid:$fnid") ;
my $base_url = '/bweb/fv' ;
my $base_fich = $conf->{fv_write_path};
-die "Can't get where" unless ($where and $jobid);
-
-if ($batch eq 'batch') {
+if ($jobid and $batch eq 'batch') {
my $root = fv_get_root_pathid($where);
if ($root) {
fv_compute_size($jobid, $root);
$bweb->display_begin();
$bweb->display_job_zoom($jobid);
+unless ($jobid) {
+ $bweb->error("Can't get where or jobid");
+ $bweb->display_end();
+ exit 0;
+}
+
+unless ($base_fich and -w $base_fich) {
+ $bweb->error("fv_write_path ($base_fich) is not writable." .
+ " See Bweb configuration.");
+ $bweb->display_end();
+ exit 0;
+}
+
if (-f "$base_fich/$md5_rep.png" and -f "$base_fich/$md5_rep.tpl")
{
$bweb->display({}, "$base_fich/$md5_rep.tpl");
$bweb->display_end();
exit 0;
}
-
-my $attribs = fv_get_file_attribute($jobid, $where);
-if ($attribs->{found}) {
- $bweb->display($attribs, 'fv_file_attribs.tpl');
+
+my $r = $bweb->dbh_selectrow_hashref("SELECT PurgedFiles AS ok FROM Job WHERE JobId = $jobid");
+if (!$r || $r->{ok}) {
+ $bweb->error("File information for job $jobid has been pruned from catalog");
$bweb->display_end();
- exit 0;
+ exit 0;
+}
+
+$r = $bweb->dbh_selectrow_hashref("SELECT JobId AS ok FROM brestore_knownjobid WHERE JobId = $jobid");
+if (!$r || !$r->{ok}) { # TODO: compute information
+ $bweb->error("Path information for job $jobid has not been updated in the catalog");
+ $bweb->display_end();
+ exit 0;
+}
+
+# if it's a file, display it
+if ($fnid and $pathid)
+{
+ my $attribs = fv_get_file_attribute_from_id($jobid, $pathid, $fnid);
+ if ($attribs->{found}) {
+ $bweb->display($attribs, 'fv_file_attribs.tpl');
+ $bweb->display_end();
+ exit 0;
+ }
+
+} else {
+
+ my $attribs = fv_get_file_attribute($jobid, $where);
+ if ($attribs->{found}) {
+ $bweb->display($attribs, 'fv_file_attribs.tpl');
+ $bweb->display_end();
+ exit 0;
+ }
}
-if ($where !~ m!/$!) {
- $where = $where . "/" ;
+my $root;
+
+if ($pathid) {
+ $root = $pathid;
+ $where = fv_get_root_path($pathid);
+
+} else {
+ if ($where !~ m!/$!) {
+ $where = $where . "/" ;
+ }
+
+ $root = fv_get_root_pathid($where);
}
-my $root = fv_get_root_pathid($where);
if (!$root) {
$bweb->error("Can't find $where in catalog");
$bweb->display_end();
my $url_action = "bfileview.pl?opt_level=$opt_level" ;
my $top = new CCircle(
display_other => 1,
- base_url => "$url_action;$jobid_url;where=$where",
+ base_url => "$url_action;pathid=$root;$jobid_url;here=$where",
) ;
fv_display_rep($top, $total, $root, $opt_level) ;
my $size = fv_compute_size($jobid, $dir->[0]);
$sum += $size;
- my $chld = $ccircle->add_part($size * 100 / $max,
+ my $per = $size * 100 / $max;
+ # can't use pathname when using utf or accent
+ # a bit ugly
+ $ccircle->{base_url} =~ s/pathid=\d+;/pathid=$dir->[0];/;
+
+ my $chld = $ccircle->add_part($per,
basename($dir->[1]) . '/',
basename($dir->[1])
- . "\n"
+ . sprintf(' %.0f%% ', $per)
. Bweb::human_size($size)
) ;
-
- if ($chld and $level > 0) {
+
+ if ($chld && $level > 0) {
fv_display_rep($chld, $size, $dir->[0], $level - 1) ;
}
}
- # 0: name, 1: size
+ # 0: filenameid, 1: filename, 2: size
my $files = fv_get_big_files($jobid, $rep, 3*100/$max, $max_file/($level+1));
foreach my $f (@{$files}) {
- $ccircle->add_part($f->[1] * 100 / $max,
- $f->[0],
- $f->[0] . "\n" . Bweb::human_size($f->[1]));
- $sum += $f->[1];
+ $ccircle->{base_url} =~ s/pathid=\d+;(filenameid=\d+)?/pathid=$rep;filenameid=$f->[0];/;
+
+ $ccircle->add_part($f->[2] * 100 / $max,
+ $f->[1],
+ $f->[1] . "\n" . Bweb::human_size($f->[2]));
+ $sum += $f->[2];
}
if ($sum < $max) {
$ccircle->add_part(($max - $sum) * 100 / $max,
- "other files < 3",
+ "other files < 3%",
"other\n" . Bweb::human_size($max - $sum));
}
my $ret = $bweb->dbh_selectall_arrayref("
SELECT P.PathId,
- (
- SELECT Path FROM Path WHERE PathId = P.PathId
- UNION
- SELECT Path FROM brestore_missing_path WHERE PathId = P.PathId
- ) AS Path
+ ( SELECT Path FROM Path WHERE PathId = P.PathId) AS Path
FROM (
SELECT PathId
FROM brestore_pathvisibility
{
my ($jobid, $full_name) = @_;
- my $filename = $bweb->dbh_quote(basename($full_name));
- my $path = $bweb->dbh_quote(dirname($full_name) . "/");
+ # default to /
+ my $path = "'/'";
+ my $filename = "''";
+
+ if ($full_name ne '/') {
+ $filename = $bweb->dbh_quote(basename($full_name));
+ $path = $bweb->dbh_quote(dirname($full_name) . "/");
+ }
my $attr = $bweb->dbh_selectrow_hashref("
- SELECT 1 AS found,
- base64_decode_lstat(8, lstat) AS size
- FROM File INNER JOIN Filename USING (FilenameId)
- INNER JOIN Path USING (PathId)
+ SELECT 1 AS found,
+ MD5 AS md5,
+ base64_decode_lstat(8, LStat) AS size,
+ base64_decode_lstat(11, LStat) AS atime,
+ base64_decode_lstat(12, LStat) AS mtime,
+ base64_decode_lstat(13, LStat) AS ctime
+
+ FROM File JOIN Filename USING (FilenameId)
+ JOIN Path USING (PathId)
WHERE Name = $filename
AND Path = $path
AND JobId = $jobid
$attr->{filename} = $full_name;
$attr->{size} = Bweb::human_size($attr->{size});
+ foreach my $d (qw/atime ctime mtime/) {
+ $attr->{$d} = strftime('%F %H:%M', localtime($attr->{$d}));
+ }
+ return $attr;
+}
+
+
+sub fv_get_file_attribute_from_id
+{
+ my ($jobid, $pathid, $filenameid) = @_;
+
+ my $attr = $bweb->dbh_selectrow_hashref("
+ SELECT 1 AS found,
+ MD5 AS md5,
+ base64_decode_lstat(8, LStat) AS size,
+ base64_decode_lstat(11, LStat) AS atime,
+ base64_decode_lstat(12, LStat) AS mtime,
+ base64_decode_lstat(13, LStat) AS ctime,
+ Path.Path || Filename.Name AS filename
+
+ FROM File INNER JOIN Filename USING (FilenameId)
+ INNER JOIN Path USING (PathId)
+ WHERE FilenameId = $filenameid
+ AND PathId = $pathid
+ AND JobId = $jobid
+");
+
+ $attr->{size} = Bweb::human_size($attr->{size});
+ foreach my $d (qw/atime ctime mtime/) {
+ $attr->{$d} = strftime('%F %H:%M', localtime($attr->{$d}));
+ }
return $attr;
}
my ($jobid, $rep) = @_;
my $ret = $bweb->dbh_selectrow_hashref("
- SELECT sum(base64_decode_lstat(8,lstat)) AS size
+ SELECT sum(base64_decode_lstat(8,LStat)) AS size
FROM File
WHERE PathId = $rep
AND JobId = $jobid
my ($jobid, $rep, $min, $limit) = @_;
my $ret = $bweb->dbh_selectall_arrayref("
- SELECT Name, size
+ SELECT FilenameId AS filenameid, Name AS name, size
FROM (
- SELECT FilenameId,base64_decode_lstat(8,lstat) AS size
+ SELECT FilenameId, base64_decode_lstat(8,LStat) AS size
FROM File
WHERE PathId = $rep
AND JobId = $jobid
{
my ($path) = @_;
$path = $bweb->dbh_quote($path);
- my $ret = $bweb->dbh_selectrow_hashref("
-SELECT PathId FROM Path WHERE Path = $path
- UNION
-SELECT PathId FROM brestore_missing_path WHERE PATH = $path
-");
+ my $ret = $bweb->dbh_selectrow_hashref("SELECT PathId FROM Path WHERE Path = $path");
return $ret->{pathid};
}
+sub fv_get_root_path
+{
+ my ($pathid) = @_;
+ my $ret = $bweb->dbh_selectrow_hashref("SELECT Path FROM Path WHERE PathId = $pathid");
+ return $ret->{path};
+}
+
+
__END__
CREATE OR REPLACE FUNCTION base64_decode_lstat(int4, varchar) RETURNS int8 AS $$
END;
$$ language 'plpgsql';
-ALTER TABLE brestore_pathvisibility ADD Size int8;
+ALTER TABLE brestore_pathvisibility ADD Size int8;
+
+
+
+ALTER TABLE brestore_pathvisibility ADD Files int4;