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=0a75f8e9b6ae71be9f50117c542733c9ce71e787;hp=b2c101390589b01daf00d858c60f9d205d05ce83;hb=5f3c445b5b9eda482c8098c115a9b5282e55f001;hpb=98610392fde2add293bee6199f2de1d6f88559d8 diff --git a/yarrg/web/qtextstringcheck b/yarrg/web/qtextstringcheck index b2c1013..0a75f8e 100755 --- a/yarrg/web/qtextstringcheck +++ b/yarrg/web/qtextstringcheck @@ -44,6 +44,7 @@ $ctype => undef $string $what $dbh => undef +$debug => 0 <%flags> @@ -55,6 +56,7 @@ 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}"); @@ -62,52 +64,76 @@ my $chk= $m->fetch_comp("check_${what}"); 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 : @@ -125,6 +151,6 @@ $mydbh->rollback() if $mydbh; return $emsg, $canontext, - [ @results ]; + @results;