chiark / gitweb /
Show commod class in voyage plan too
[ypp-sc-tools.db-test.git] / yarrg / CommodsWeb.pm
index 387b0f2..5e12003 100644 (file)
@@ -48,48 +48,58 @@ BEGIN {
     our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
     $VERSION     = 1.00;
     @ISA         = qw(Exporter);
-    @EXPORT      = qw(&dbw_connect &ocean_list &sourcebasedir
+    @EXPORT      = qw(&dbw_connect &dbw_filename &ocean_list &sourcebasedir
                      &to_json_shim &to_json_protecttags
-                     &set_ctype_utf8
+                     &set_ctype_utf8 &webdatadir
+                     &expected_error &dbw_lookup_string
+                     &printable &tr_datarow &escerrq
                      &prettyprint_age &meta_prettyprint_age);
     %EXPORT_TAGS = ( );
 
     @EXPORT_OK   = qw();
 }
 
-sub sourcebasedir () {
+sub dotperllibdir () {
     my $dir;
     
     for my $dir (@INC) {
        if ($dir =~ m/\.perl-lib$/) {
-           $dir= "$dir/..";
-           last;
+           return $dir;
        }
     }
-    defined $dir or
-       die "no source base dir in @INC";
-    return $dir;
+    die "no appropriate dotperllib dir in @INC";
+}
+
+sub sourcebasedir () {
+    return dotperllibdir().'/..';
 }
 
-sub datadir () {
-    my $dir= sourcebasedir();
-    if (stat "$dir/DATA") {
-       return "$dir/DATA";
+sub some_datadir ($) {
+    my ($what) = @_;
+    my $edir= $ENV{"YARRG_${what}_DIR"};
+    return $edir if defined $edir;
+    my $dir= dotperllibdir();
+    my $dirwhat= "$dir/$what";
+    if (stat $dirwhat) {
+       return $dirwhat;
     } elsif ($!==&ENOENT) {
        return "$dir";
     } else {
-       die "stat $dir/DATA $!";
+       die "stat $dirwhat $!";
     }
     return '.';
 }
 
+sub webdatadir () { return some_datadir('WEBDATA'); }
+sub datadir () { return some_datadir('DATA'); }
+
 my @ocean_list;
 
 sub ocean_list () {
     my $datadir= datadir();
     if (!@ocean_list) {
-       my $fn= "$datadir/master-info.txt";
-       my $f= new IO::File $fn or die $!;
+       my $fn= "$datadir/source-info.txt";
+       my $f= new IO::File $fn or die "$fn $!";
        my @r;
        while (<$f>) {
            next unless m/^ocean\s+(\S.*\S)\s*$/;
@@ -102,11 +112,17 @@ sub ocean_list () {
     return @ocean_list;
 }
 
-sub dbw_connect ($) {
+sub dbw_filename ($) {
     my ($ocean) = @_;
     die "unknown ocean $ocean ?"
        unless grep { $_ eq $ocean } ocean_list();
-    return dbr_connect(datadir(), $ocean);
+    return dbr_filename(datadir(), $ocean);
+}
+
+sub dbw_connect ($) {
+    my ($ocean) = @_;
+    my $fn= dbw_filename($ocean);
+    return db_connect_core($fn);
 }
 
 sub to_json_shim ($) {
@@ -148,4 +164,76 @@ BEGIN { eval '
 }
 
 
+sub dbw_lookup_string ($$$$$$$$) { # => ( $emsg, @dbresults )
+    my ($each,
+       $sth, $stmt_nqs, $abbrev_initials, $maxambig,
+       $em_nomatch, $em_manyambig, $emf_ambiguous) = @_;
+    
+    $each =~ s/^\s*//;  $each =~ s/\s*$//;  $each =~ s/\s+/ /g;
+    my %m;
+    my $results;
+    my @pats= ("$each", "$each \%", "$each\%", "\%$each\%");
+    if ($abbrev_initials) {
+       push @pats, join ' ', map { "$_%" } split //, $each;
+    }
+    foreach my $pat (@pats) {
+       $sth->execute(($pat) x $stmt_nqs);
+       $results= $sth->fetchall_arrayref();
+       last if @$results==1;
+       $m{ $_->[0] }=1 for @$results;
+       $results= undef;
+    }
+    if (!$results) {
+       if (!%m) {
+           return $em_nomatch;
+       } elsif (keys(%m) > $maxambig) {
+           return $em_manyambig;
+       } else {
+           return $emf_ambiguous->($each, join(', ', sort keys %m));
+       }
+    }
+    return (undef, @{ $results->[0] });
+}
+
+sub expected_error ($) {
+    my $r= { Emsg => $_[0] };
+    bless $r, 'CommodsWeb::ExpectedError';
+    die $r;
+}
+
+sub printable ($) { # printable($m)  where $m is the Mason request object
+    my ($m) = @_;
+    my $a= scalar $m->caller_args(-1);
+    foreach my $t (qw(pdf ps html pdf2 ps2)) {
+       return $t if $a->{"printable_$t"};
+    }
+    return 0;
+}
+
+sub tr_datarow ($$) {
+    my ($m, $lineno) = @_;
+    $lineno &= 1;
+    if (!printable($m)) {
+       $m->print("<tr class=\"datarow$lineno\">");
+    } else {
+       $m->print("<tr bgcolor=\"".
+                 ($lineno ? "#ffffff" : "#e3e3e3" ).
+                 "\">");
+    }
+}
+
+sub escerrq ($) {
+    return '"'.CGI::escapeHTML($_[0]).'"';
+    # Prettier qotes as below are not in HTML 3.2:
+#    return '&#8220;'.CGI::escapeHTML($_[0]).'&#8221;';
+#    return '&#8216;'.CGI::escapeHTML($_[0]).'&#8217;';
+}
+
+package CommodsWeb::ExpectedError;
+
+sub emsg ($) {
+    my ($self) = @_;
+    return $self->{Emsg};
+}
+
 1;