#!/usr/bin/perl use warnings; use strict; use Time::HiRes qw ( time ); my %T = ( startup => time, ); use CGI::Fast qw/ :standard *table /; use TMA::Web; use TMA::Loot; use TMA::NBID; use TMA::LootDb; my $dbh = TMA::LootDb::get_dbh(); $T{startup} = time - $T{startup}; while (my $q = new CGI::Fast) { $T{job} = time; &do_work($q); $T{job} = time - $T{job}; printf "%sPERF: %s\n", hr, join " ", map { sprintf "%s => %.3fs", $_, $T{$_} } sort keys %T; printf STDERR "NBIDPERF: %s\n", join " ", map { sprintf "%s => %.3fs", $_, $T{$_} } sort keys %T; %T=(); } exit 0; ### sub do_work($) { my ($q,) = @_; my $tweb = new TMA::Web(q=>$q,); my $p = $q->param("form"); my $form = (defined $p && $p =~ /^([01])$/i) ? $1 : -1; $p = $q->param("mode"); my $mode = (defined $p && $p =~ /^(html|text)$/i) ? lc $1 : "html"; $p = $q->param("count"); my $count = (defined $p && $p =~ /^(\d+)$/) ? $1 : 10; $p = $q->param("maxdev"); my $maxdev = (defined $p && $p =~ /^(\d+)$/) ? $1 : 1000; $p = $q->param("urn"); my $urn = $p; unless ($urn) { my $kw = $q->param("keywords"); if (defined $kw && $kw =~ /urn:|http:/) { $urn = $kw; } } #my $count = (defined $p && $p =~ /^(\d+)$/) ? $1 : 10; if ($mode eq 'text') { print "Content-Type: text/plain\r\n\r\n"; } elsif ($mode eq 'html') { print $q->header,"\n"; my $title = "TMA NBID"; print start_html(-title=>$title,),"\n"; } else { die "bad mode $mode"; } if ($form) { print start_form(-method=>'get'),"\n", start_table,"\n"; print Tr(td([ "Form: ", popup_menu(-name => 'form', -values => [0..1], -default => 1, -labels => { 0 => 'hide', 1 => 'show'}, ),],),),"\n"; print Tr(td([ "Mode: ", popup_menu(-name => 'mode', -values => ["html", "text",], -default => $mode, -labels => { "html" => "HTML", "text" => 'TEXT',}, ), ],),), "\n"; print Tr(td([ "Count: ", textfield(-name => 'count', -default => $count, -size => 5, ), ],),), "\n"; if (0) { print Tr(td([ "MaxDev: ", textfield(-name => 'maxdev', -default => $maxdev, -size => 5, ), ],),), "\n"; } print Tr(td([ "URN: ", textfield(-name => 'urn', -default => $urn, -size => 40, ), ],),), "\n"; print end_table,"\n", submit,"\n", end_form,"\n"; exit 0 if $form == -1 && !$urn; print hr,"\n"; } my ($lid, $vec,); if ($urn =~ /urn:(rgb4x4):([0-9a-h]{96})/i) { $vec = pack "H*", lc $2; } elsif ($urn =~ /(urn:([-\w]+):(\w+))/i || $urn =~ /(http:\S+)/i) { my @lids = eval { &key_to_lids($1); }; unless (@lids) { printf "unmatched urn\n"; if ($@) { print "\n",br,"WARN: $@\n"; } exit 0; } $lid = $lids[0]; die "no lid" unless defined $lid; die "bad lid $lid" unless $lid =~ /^\d+$/; if (scalar @lids > 1) { printf "\n%sWARN: %i matches for '%s', using lid %i%s\n", br, scalar @lids, $urn, $lid, br; } my $sth = $dbh->prepare_cached(qq{ select lid, vec from v_rgb4x4 where lid = ? }) or die $dbh->errstr; $sth->execute($lid) or die $sth->errstr; my $ar = $sth->fetchall_arrayref(); $sth->finish; die "vec not found for lid:$lid" unless defined $ar && @$ar; die "multivec lid:$lid" unless scalar @$ar == 1; die "lid mismatch" unless $lid == $ar->[0]->[0]; $vec = $ar->[0]->[1]; } else { printf "bad urn\n"; exit 0; } $T{nbid} = time; my @res = TMA::NBID::do_nbid($count, $vec); $T{nbid} = time - $T{nbid}; $T{render} = time; for my $r (@res) { if ($mode eq 'html') { if (defined $lid) { my $loot = new TMA::Loot(lid=>$lid); my $urn = $tweb->urn($loot); #my $urn = sprintf "urn:lid:%s", $lid; print span( "REF:", $tweb->link_n2r($loot,$tweb->img_thumb($loot)),"\n", # a({href=>"/uri-res/N2R?$urn",}, # img({src=>"/uri-res/N2T?$urn",}),),"\n", a({href=>"/report?obj=$urn",},"R",),"\n", ), br,"\n"; } else { print "REF: ",$urn,br,"\n"; } } my $c = 0; for my $h (@$r) { my ($d, $i,) = @$h; $c++; # printf "%010u: %u\n", $i, $d; #use MIME::Base32 qw( RFC ); #my $urn = sprintf "urn:sha1:%s", lc MIME::Base32::encode($sha1); #my $urn = sprintf "urn:lid:%s", $i; my $loot = new TMA::Loot(lid=>$i); my $urn = $tweb->urn($loot); my $sth = $dbh->prepare_cached("SELECT count(*) FROM l2n WHERE lid = ?") or die $dbh->errstr; $sth->execute($i) or die $dbh->errstr; my $uref = $sth->fetchrow_arrayref(); $sth->finish(); my $ucount; if (defined $uref && @$uref) { $ucount = $uref->[0]; } my $be_getdescr = $dbh->prepare_cached("SELECT * FROM image WHERE lid = ?") or die $dbh->errstr; $be_getdescr->execute($i) or die $dbh->errstr; my $dref = $be_getdescr->fetchrow_hashref(); $be_getdescr->finish(); my $ssize = $loot->get_n2n("size"); my $sdescr = sprintf "%i bytes", $ssize; if (defined $dref) { $sdescr = sprintf "%s, %i bytes, %ix%i pixel, %i colors", $dref->{magick}, $ssize, $dref->{width}, $dref->{height}, $dref->{colors}; $sdescr .= sprintf ", %i layers", $dref->{frames} if $dref->{frames} > 1; } if (defined $ucount && $ucount) { $sdescr .= sprintf ", %i urls", $ucount; } if ($mode eq 'text') { printf "#%i %s dev=%s descr=%s\n", $c, $urn, $d, $sdescr; # printf "%s %s %s %s\n", $lid, $urn, $size, $mime; } elsif ($mode eq 'html') { print span( #div({class=>'float',}, $tweb->link_n2r($loot,$tweb->img_thumb($loot)),"\n", #a({href=>"/uri-res/N2R?$urn",}, #img({src=>"/uri-res/N2T?$urn",}),),"\n", # span({align=>'left',}, a({href=>"/nbid?$urn",},"N",),"\n", a({href=>"/report?obj=$urn",},"R",),"\n", # a({href=>"/report?obj=$urn", style=>"clear:both",},"N",),"\n", # a({href=>"/report?obj=$urn",align=>'left',},"I",),"\n", # a({href=>"/report?obj=$urn",},"T",),"\n", # ), "#$c\n", "DEV:$d\n", "DESCR: $sdescr\n", ); # printf "lid:%s urn:%s size:%s mime:%s url:%s

", $lid, $urn, $size, $mime, $url; print br,"\n"; } else { die "bad mode $mode"; } } if ($mode eq 'text') { print "\n"; } elsif ($mode eq 'html') { print "\n",hr,"\n"; } else { die "bad mode $mode" }; } print "\n"; if ($mode eq 'text') { # } elsif ($mode eq 'html') { print "\n",hr,end_html,"\n"; } else { die "bad mode $mode"; } $T{render} = time - $T{render}; }