You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axkit-dev@xml.apache.org by jw...@apache.org on 2003/06/18 15:30:08 UTC

cvs commit: xml-axkit/lib/Apache/AxKit/Language/XSP SimpleTaglib.pm

jwalt       2003/06/18 06:30:08

  Modified:    lib      AxKit.pm
               lib/Apache/AxKit Cache.pm
               lib/Apache/AxKit/Language XSP.pm
               lib/Apache/AxKit/Language/XSP SimpleTaglib.pm
  Log:
  - fix SimpleTaglib bugs regarding childStruct
  - add XSP on-disk cache of compiled scripts (essential for debug mode)
  - turn off XSP debug mode, extremely slow
  - make Cache.pm perl5.8.0/utf8 clean
  - make AxTraceIntermediate utf8-clean
  
  Revision  Changes    Path
  1.44      +14 -3     xml-axkit/lib/AxKit.pm
  
  Index: AxKit.pm
  ===================================================================
  RCS file: /home/cvs/xml-axkit/lib/AxKit.pm,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- AxKit.pm	18 Mar 2003 15:20:46 -0000	1.43
  +++ AxKit.pm	18 Jun 2003 13:30:06 -0000	1.44
  @@ -35,6 +35,17 @@
   # AxKit Utility Functions
   ###############################################################
   
  +sub open(*$;$) {
  +	my $res = open($_[0],$_[1]);
  +	binmode($_[0],($] >= 5.008?(':'.($_[2]||'utf8')):()));
  +	return $res;
  +}
  +sub sysopen(*$$;$) {
  +	my $res = sysopen($_[0],$_[1],$_[2]);
  +	binmode($_[0],($] >= 5.008?(':'.($_[2]||'utf8')):()));
  +	return $res;
  +}
  +
   sub FromUTF8($) {
       if (!$AxKit::Cfg->{from_utf8}) {
           return $_[0] if (exists $AxKit::Cfg->{from_utf8});
  @@ -695,8 +706,8 @@
       
           if ($interm_prefix) {
               my $fh = Apache->gensym();
  -            if (sysopen($fh, $interm_prefix.$interm_count, O_WRONLY|O_CREAT|O_TRUNC)) {
  -                syswrite($fh,${$provider->get_strref});
  +            if (open($fh, ">".$interm_prefix.$interm_count)) {
  +                print $fh ${$provider->get_strref};
                   close($fh);
                   $interm_count++;
               } else {
  
  
  
  1.10      +7 -6      xml-axkit/lib/Apache/AxKit/Cache.pm
  
  Index: Cache.pm
  ===================================================================
  RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Cache.pm,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Cache.pm	25 Dec 2002 17:59:21 -0000	1.9
  +++ Cache.pm	18 Jun 2003 13:30:07 -0000	1.10
  @@ -9,6 +9,7 @@
   use Digest::MD5 ();
   use Compress::Zlib qw(gzopen);
   use Fcntl qw(:flock O_RDWR O_WRONLY O_CREAT O_RDONLY);
  +use bytes;
   
   # use vars qw/$COUNT/;
   
  @@ -110,7 +111,7 @@
       AxKit::Debug(7, "[Cache] writing cache file $self->{file}");
       my $fh = Apache->gensym();
       my $tmp_filename = $self->{file}."new$$";
  -    if (sysopen($fh, $tmp_filename, O_WRONLY|O_CREAT)) {
  +    if (AxKit::sysopen($fh, $tmp_filename, O_WRONLY|O_CREAT, 'raw')) {
           # flock($fh, LOCK_EX);
           # seek($fh, 0, 0);
           # truncate($fh, 0);
  @@ -141,7 +142,7 @@
       my $self = shift;
       return if $self->{no_cache};
       my $fh = Apache->gensym();
  -    if (sysopen($fh, $self->{file}, O_RDONLY)) {
  +    if (AxKit::sysopen($fh, $self->{file}, O_RDONLY, 'raw')) {
           flock($fh, LOCK_SH);
           local $/;
           return <$fh>;
  @@ -155,7 +156,7 @@
       my $self = shift;
       return if $self->{no_cache};
       my $fh = Apache->gensym();
  -    if (sysopen($fh, $self->{file}, O_RDONLY)) {
  +    if (AxKit::sysopen($fh, $self->{file}, O_RDONLY, 'raw')) {
           flock($fh, LOCK_SH);
           return $fh;
       }
  @@ -169,7 +170,7 @@
       return if $self->{no_cache};
       
       my $fh = Apache->gensym();
  -    if (sysopen($fh, $self->{file}.'newtype', O_RDWR|O_CREAT)) {
  +    if (AxKit::sysopen($fh, $self->{file}.'newtype', O_RDWR|O_CREAT, 'raw')) {
           flock($fh, LOCK_EX);
           seek($fh, 0, 0);
           truncate($fh, 0);
  @@ -187,7 +188,7 @@
       my $self = shift;
       return if $self->{no_cache};
       my $fh = Apache->gensym();
  -    if (sysopen($fh, $self->{file}.'.type', O_RDONLY)) {
  +    if (AxKit::sysopen($fh, $self->{file}.'.type', O_RDONLY, 'raw')) {
           flock($fh, LOCK_SH);
           local $/;
           return <$fh>;
  
  
  
  1.40      +15 -7     xml-axkit/lib/Apache/AxKit/Language/XSP.pm
  
  Index: XSP.pm
  ===================================================================
  RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Language/XSP.pm,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- XSP.pm	18 Mar 2003 15:18:20 -0000	1.39
  +++ XSP.pm	18 Jun 2003 13:30:07 -0000	1.40
  @@ -3,11 +3,13 @@
   package Apache::AxKit::Language::XSP;
   
   use strict;
  +use AxKit;
   use Apache::AxKit::Language;
   use Apache::Request;
   use Apache::AxKit::Exception;
   use Apache::AxKit::Cache;
   use Fcntl;
  +use utf8;
   
   use vars qw/@ISA/;
   
  @@ -49,7 +51,7 @@
       my $handler = AxKit::XSP::SAXHandler->new_handler(
               XSP_Package => $package,
               XSP_Line => $key,
  -            XSP_Debug => 1,
  +            XSP_Debug => 0,
               );
       my $parser = AxKit::XSP::SAXParser->new(
               provider => $xml,
  @@ -77,6 +79,7 @@
               }
           }
           else {
  +            my $xcache = Apache::AxKit::Cache->new($r, $package, 'compiled XSP');
               # check mtime.
               my $mtime = $xml->mtime();
               no strict 'refs';
  @@ -86,15 +89,18 @@
                       )
               {
                   # cached
  -                AxKit::Debug(5, 'XSP: xsp script cached');
  -            }
  -            else {
  +                AxKit::Debug(5, 'XSP: xsp script cached in memory');
  +            } elsif (!$xml->has_changed($xcache->mtime())) {
  +                AxKit::Debug(5, 'XSP: xsp script cached on disk');
  +                $to_eval = $xcache->read();
  +            } else {
                   AxKit::Debug(5, 'XSP: parsing fh');
                   $to_eval = eval {
                       $parser->parse($xml->get_fh());
                   } || $parser->parse(${ $xml->get_strref() });
   
                   $cache->{$key}{mtime} = $mtime;
  +                $xcache->write($to_eval);
               }
           }
       };
  @@ -127,11 +133,12 @@
   
           if ($AxKit::Cfg->TraceIntermediate) {
               my $interm_prefix = $r->uri;
  -            $interm_prefix =~ s{/}{|}g;
  +            $interm_prefix =~ s{%}{%25}g;
  +            $interm_prefix =~ s{/}{%2f}g;
               $interm_prefix =~ s/[^0-9a-zA-Z.,_|-]/_/g;
               $interm_prefix = $AxKit::Cfg->TraceIntermediate.'/'.$interm_prefix;
               my $fh = Apache->gensym();
  -            if (open($fh, '>'.$interm_prefix.'.XSP')) {
  +            if (AxKit::open($fh, '>'.$interm_prefix.'.XSP')) {
                   print($fh $to_eval);
               } else {
                   AxKit::Debug(1,"could not open $interm_prefix.XSP for writing: $!");
  @@ -349,6 +356,7 @@
                   "use Apache::Constants qw(:common);",
                   "use XML::LibXML;",
                   "Apache::AxKit::Language::XSP::Page->import( qw(__mk_text_node __mk_comment_node __mk_ns_element_node __mk_element_node) );",
  +		($] >= 5.008?"use utf8;":""),
                   );
   
       foreach my $ns (keys %Apache::AxKit::Language::XSP::tag_lib) {
  
  
  
  1.8       +29 -11    xml-axkit/lib/Apache/AxKit/Language/XSP/SimpleTaglib.pm
  
  Index: SimpleTaglib.pm
  ===================================================================
  RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Language/XSP/SimpleTaglib.pm,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SimpleTaglib.pm	29 Jan 2003 01:35:50 -0000	1.7
  +++ SimpleTaglib.pm	18 Jun 2003 13:30:08 -0000	1.8
  @@ -36,10 +36,11 @@
       for my $spec ($_[0]) {
           my $result = {};
           while (length($spec)) {
  -            (my ($type, $token, $next) = ($spec =~ m/^([\&\@\*\$]?)([^ {}]+)(.|$)/))
  +            $spec = substr($spec,1), return $result if (substr($spec,0,1) eq '}');
  +            (my ($type, $token, $next) = ($spec =~ m/^([!\&\@\*\$]?)([^ {}]+)(.|$)/))
                    || die("childStruct specification invalid. Parse error at: '$spec'");
               substr($spec,0,length($token)+1+($type?1:0)) = '';
  -            #warn("type: $type, token: $token, next: $next");
  +            #warn("type: $type, token: $token, next: $next, spec: $spec");
               my ($realtoken, $params);
               if ((($realtoken,$params) = ($token =~ m/^([^\(]+)((?:\([^ \)]+\))+)$/))) {
                   my $i = 0;
  @@ -58,8 +59,12 @@
                   next;
               }
               $$result{$token}{'type'} = $type || '$';
  -            die("childStruct specification invalid. '*' cannot be used with '{'.")
  -                if ($next eq '{' and $type eq '*');
  +            die("childStruct specification invalid. '${type}' cannot be used with '{'.")
  +                if ($next eq '{' and ($type eq '*' || $type eq '!'));
  +            die("childStruct specification invalid. '${type}' cannot be used with '(,,,)'.")
  +                if ($$result{$token}{'param'} and ($type eq '*' || $type eq '!'));
  +            die("childStruct specification invalid. '**' is not supported.")
  +                if ($token eq '*' and $type eq '*');
               $$result{''}{'name'} = $token if ($type eq '*');
               $$result{$token}{'name'} = $token;
               return $result if (!$next || $next eq '}');
  @@ -151,7 +156,8 @@
               my $spec = $param[0];
               #warn("parsing $spec");
               $spec =~ s/\s+/ /g;
  -            $spec =~ s/ ?([{}]) ?/$1/g;
  +            $spec =~ s/ ?{ ?/{/g;
  +            $spec =~ s/ ?} ?/}/g;
               $$handlerAttributes{'struct'} = parseChildStructSpec($spec,{});
               #warn("parsed $param[0], got ".serializeChildStructSpec($$handlerAttributes{'struct'}));
               die("childStruct parse error") unless $$handlerAttributes{'struct'};
  @@ -307,6 +313,7 @@
       return '; ';
   }
   
  +my @ignore;
   sub set_childStruct_value__open {
       my ($e, $tag, %attribs) = @_;
       my $var = '$_{'.makeSingleQuoted($tag).'}';
  @@ -316,6 +323,13 @@
           return '';
       }
       my $desc = $$structStack[0][0]{'sub'}{$tag};
  +    if (!$desc) {
  +        $desc = $$structStack[0][0]{'sub'}{'*'};
  +        #warn("$tag desc: ".Data::Dumper::Dumper($desc));
  +    }
  +    die("Tag $tag not found in childStruct specification.") if (!$desc);
  +    push(@ignore, 1), return '' if ($$desc{'type'} eq '!');
  +    push @ignore, 0;
       unshift @{$$structStack[0]},$desc;
       if ($$desc{'param'}) {
           $e->append_to_script("{ \n");
  @@ -363,6 +377,8 @@
           return '';
       }
       my $desc = $$structStack[0][0];
  +    my $ignore = pop @ignore;
  +    return '' if ($ignore);
       shift @{$$structStack[0]};
       if ($$desc{'sub'}) {
           $e->append_to_script(' \%_; }; ');
  @@ -576,14 +592,16 @@
       if ($$structStack[0][0]{'param'} && exists $$structStack[0][0]{'param'}{$tag}) {
           $sub = \&set_childStruct_value;
           $subOpen = \&set_childStruct_value__open;
  -    } elsif ($$structStack[0][0]{'sub'} && exists $$structStack[0][0]{'sub'}{$tag}) {
  -        if ($$structStack[0][0]{'sub'}{$tag}{'sub'}) {
  -            foreach my $key (keys %{$$structStack[0][0]{'sub'}{$tag}{'sub'}}) {
  +    } elsif ($$structStack[0][0]{'sub'} && (exists $$structStack[0][0]{'sub'}{$tag} || exists $$structStack[0][0]{'sub'}{'*'})) {
  +        my $tkey = $tag;
  +        $tkey = '*' if (!exists $$structStack[0][0]{'sub'}{$tag});
  +        if ($$structStack[0][0]{'sub'}{$tkey}{'sub'}) {
  +            foreach my $key (keys %{$$structStack[0][0]{'sub'}{$tkey}{'sub'}}) {
                   $$attribs{$key} = $attribs{$key} if exists $attribs{$key};
               }
           }
  -        if ($$structStack[0][0]{'sub'}{$tag}{'param'}) {
  -            foreach my $key (keys %{$$structStack[0][0]{'sub'}{$tag}{'param'}}) {
  +        if ($$structStack[0][0]{'sub'}{$tkey}{'param'}) {
  +            foreach my $key (keys %{$$structStack[0][0]{'sub'}{$tkey}{'param'}}) {
                   $$attribs{$key} = $attribs{$key} if exists $attribs{$key};
               }
           }