X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yarrg%2Fweb%2Fqtextstringcheck;h=539abce6a550d8387c0171b845ef20b50b0d651c;hp=5ef8971f644b63991af5d6eb5379be7fec1da596;hb=ea3cffe854b1c540bc68cd2218fdb2be732197fa;hpb=9d01242d0991d15f7ea84454264c868e1c4ed8ad diff --git a/yarrg/web/qtextstringcheck b/yarrg/web/qtextstringcheck index 5ef8971..539abce 100755 --- a/yarrg/web/qtextstringcheck +++ b/yarrg/web/qtextstringcheck @@ -43,6 +43,8 @@ $format $ctype => undef $string $what +$dbh => undef +$debug => 0 <%flags> @@ -54,58 +56,85 @@ use JSON; use Data::Dumper; use HTML::Entities; use CommodsWeb; +use Scalar::Util qw(blessed); die if $what =~ m/[^a-z]/; my $chk= $m->fetch_comp("check_${what}"); +die "check_$what" unless $chk; -my $dbh= dbw_connect($ocean); +my $mydbh; +$dbh ||= ($mydbh= dbw_connect($ocean)); -my $sqlstmt= $chk->scall_method("sqlstmt"); -my $sth= $dbh->prepare($sqlstmt); -my @sqlstmt_qs= $sqlstmt =~ m/\?/g; +my $debugf= !$debug ? sub { } : sub { + print escapeHTML("@_")."\n"; +}; -#die "$sqlstmt @sqlstmt_qs"; +$debugf->("QTSC STRING '$string'"); my $emsg= ''; my @results; +my $canontext; + +$string =~ s/^\s*//; +$string =~ s/\s$//; +$string =~ s/\s+/ /g; -my @specs= $chk->attr('multiple') ? (split m#[/|,]#, $string) : ($string); - -no warnings qw(exiting); - -foreach my $each (@specs) { - $each =~ s/^\s*//; $each =~ s/\s*$//; $each =~ s/\s+/ /g; - next if !length $each; - my $err= sub { $emsg= $_[0]; last; }; - my %m; - my $results; - foreach my $pat ("$each", "$each\%", "\%$each\%") { - $sth->execute(($pat) x @sqlstmt_qs); - $results= $sth->fetchall_arrayref(); - last if @$results==1; - map { $m{ $_->[0] }=1 } @$results; - $results= undef; +if ($chk->method_exists('execute')) { + ($canontext, @results)= eval { + $chk->call_method('execute', + dbh => $dbh, string => $string, + debugf => $debugf); + }; + if ($@) { + die unless blessed $@ && $@->isa('CommodsWeb::ExpectedError'); + $emsg= $@->emsg(); } - if (!$results) { - if (!%m) { - $err->($chk->scall_method("nomatch", - spec => $each)); - } elsif (keys(%m) > $chk->attr('maxambig')) { - $err->($chk->scall_method("manyambig")); - } else { - $err->($chk->scall_method("ambiguous", - spec => $each, - couldbe => join(', ', sort keys %m))); +} else { + my $sqlstmt= $chk->scall_method("sqlstmt"); + my $sth= $dbh->prepare($sqlstmt); + my @sqlstmt_nqs= $sqlstmt =~ m/\?/g; + my $sqlstmt_nqs= @sqlstmt_nqs; + + my @specs= $chk->attr('multiple') + ? (split m#\s*[/|,]\s*#, $string) + : ($string); + + foreach my $each (@specs) { + next unless $each =~ m/\S/; + my ($temsg, @tresults) = + dbw_lookup_string($each, + $sth, $sqlstmt_nqs, + $chk->attr_exists('abbrev_initials'), + $chk->attr('maxambig'), + $chk->scall_method("nomatch", specq => escerrq($each)), + $chk->scall_method("manyambig"), + sub { + $chk->scall_method("ambiguous", + specq => escerrq($each), + couldbe => $_[1]) + }); + if (defined $temsg) { + $emsg= $temsg; + last; } - } - push @results, $results->[0]; -}; + push @results, [ @tresults ]; + }; +} + +if (!defined $canontext) { + $canontext= join ' | ', map { $_->[0] } @results; +} $emsg='' if !defined $emsg; -my $canontext= join ' | ', map { $_->[0] } @results; +@results=() if length $emsg; + +$debugf->("QTSC EMSG='$emsg' RESULTS='@results'"); if ($format =~ /json/) { - $r->content_type($ctype or $format); + $ctype ||= $format; + die unless grep { $_ eq $ctype } + qw(application/json text/plain text/xml); + $r->content_type($ctype); my $jobj= { success => 1*!length $emsg, show => (length $emsg ? $emsg : @@ -119,10 +148,10 @@ if ($format =~ /dump/) { print Dumper($emsg, $canontext, \@results); } -$dbh->rollback(); +$mydbh->rollback() if $mydbh; return $emsg, $canontext, - [ @results ]; + @results;