dougm       01/09/15 11:17:31

  Modified:    lib/ModPerl TypeMap.pm
               t/response/TestAPR table.pm
               todo     api.txt
               xs/maps  apr_functions.map
               xs/tables/current/ModPerl FunctionTable.pm
  Added:       xs/APR/Table APR__Table.h
  Log:
  implement APR::Table->do
  Submitted by: Philippe M . Chiasson <[EMAIL PROTECTED]>
  Reviewed by:  dougm
  
  Revision  Changes    Path
  1.10      +1 -0      modperl-2.0/lib/ModPerl/TypeMap.pm
  
  Index: TypeMap.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/ModPerl/TypeMap.pm,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- TypeMap.pm        2001/09/10 05:35:10     1.9
  +++ TypeMap.pm        2001/09/15 18:17:31     1.10
  @@ -396,6 +396,7 @@
       Apache__RequestRec => 'r',
       Apache__Server => 'server',
       Apache__Connection => 'connection',
  +    APR__Table => 'table',
       APR__UUID => 'uuid',
       apr_status_t => 'status',
   );
  
  
  
  1.2       +54 -1     modperl-2.0/t/response/TestAPR/table.pm
  
  Index: table.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/t/response/TestAPR/table.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- table.pm  2001/09/12 16:40:27     1.1
  +++ table.pm  2001/09/15 18:17:31     1.2
  @@ -8,10 +8,13 @@
   use Apache::Const -compile => 'OK';
   use APR::Table ();
   
  +my $filter_count;
  +my $TABLE_SIZE = 20;
  +
   sub handler {
       my $r = shift;
   
  -    plan $r, tests => 5;
  +    plan $r, tests => 9;
   
       my $table = APR::Table::make($r->pool, 16);
   
  @@ -25,7 +28,57 @@
   
       ok not defined $table->get('foo');
   
  +    for (1..$TABLE_SIZE) {
  +        $table->set(chr($_+97), $_);
  +    }
  +
  +    #Simple filtering
  +    $filter_count = 0;
  +    $table->do("my_filter");
  +    ok $filter_count == $TABLE_SIZE;
  +
  +    #Filtering aborting in the middle
  +    $filter_count = 0;
  +    $table->do("my_filter_stop");
  +    ok $filter_count == int($TABLE_SIZE)/2;
  +
  +    #Filtering with anon sub
  +    $filter_count=0;
  +    $table->do(sub {
  +        my ($key,$value) = @_;
  +        $filter_count++;
  +        unless ($key eq chr($value+97)) {
  +            die "arguments I recieved are bogus($key,$value)";
  +        }
  +        return 1;
  +    });
  +
  +    ok $filter_count == $TABLE_SIZE;
  +
  +    $filter_count = 0;
  +    $table->do("my_filter", "c", "b", "e");
  +    ok $filter_count == 3;
  +
       Apache::OK;
  +}
  +
  +sub my_filter {
  +    my ($key,$value) = @_;
  +    $filter_count++;
  +    unless ($key eq chr($value+97)) {
  +        die "arguments I recieved are bogus($key,$value)";
  +    }
  +    return 1;
  +}
  +
  +sub my_filter_stop {
  +    my ($key,$value) = @_;
  +    $filter_count++;
  +    unless ($key eq chr($value+97)) {
  +        die "arguments I recieved are bogus($key,$value)";
  +    }
  +    return 0 if ($filter_count == int($TABLE_SIZE)/2);
  +    return 1;
   }
   
   1;
  
  
  
  1.4       +0 -2      modperl-2.0/todo/api.txt
  
  Index: api.txt
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/todo/api.txt,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- api.txt   2001/09/15 17:57:25     1.3
  +++ api.txt   2001/09/15 18:17:31     1.4
  @@ -9,8 +9,6 @@
   $r->headers_out->{KEY} is not currently supported
   might want to make this optional, disabled by default
   
  -missing: APR::Table->do
  -
   $r->finfo:
   need apr_finfo_t <-> struct stat conversion (might already be there,
   haven't looked close enough yet)
  
  
  
  1.1                  modperl-2.0/xs/APR/Table/APR__Table.h
  
  Index: APR__Table.h
  ===================================================================
  typedef struct {
      SV *cv;
      apr_table_t *filter; /*XXX: or maybe a mgv ? */
  } mpxs_table_do_cb_data_t;
  
  typedef int (*mpxs_apr_table_do_cb_t)(void *, const char *, const char *);
  
  static int mpxs_apr_table_do_cb(void *data,
                                  const char *key, const char *val)
  {
      dTHX; /*XXX*/
      dSP;
      int rv = 0;
      mpxs_table_do_cb_data_t *tdata = (mpxs_table_do_cb_data_t *)data;
  
      /* Skip completely if something is wrong */
      if (!(tdata && tdata->cv && key && val)) {
          return 0;
      }
  
      /* Skip entries if not in our filter list */
      if (tdata->filter) {
          if (!apr_table_get(tdata->filter, key)) {
              return 1;
          }
      }
      
      ENTER;
      SAVETMPS;
  
      PUSHMARK(sp);
      XPUSHs(sv_2mortal(newSVpv(key,0)));
      XPUSHs(sv_2mortal(newSVpv(val,0)));
      PUTBACK;
  
      rv = call_sv(tdata->cv, 0);
      SPAGAIN;
      rv = (1 == rv) ? POPi : 1;
      PUTBACK;
  
      FREETMPS;
      LEAVE;
      
      /* rv of 0 aborts the traversal */
      return rv;
  }
  
  static MP_INLINE 
  void mpxs_apr_table_do(pTHX_ I32 items, SV **MARK, SV **SP) 
  {
      apr_table_t *table;
      SV *sub;
      mpxs_table_do_cb_data_t tdata;
      
      mpxs_usage_va_2(table, sub, "$table->do(sub, [@filter])");
           
      tdata.cv = sub;
      tdata.filter = NULL;
      
      if (items > 2) {
          STRLEN len;
          tdata.filter = apr_table_make(table->a.pool, items-2);
  
          while (MARK <= SP) {
              /* XXX: can we use apr_table_setn here? */
              apr_table_set(tdata.filter, SvPV(*MARK,len), "1");
              MARK++;
          }
      }
    
      /* XXX: would be nice to be able to call apr_table_vdo directly, 
       * but I don't think it's possible to create/populate something 
       * that smells like a va_list with our list of filters specs
       */
      
      apr_table_do(mpxs_apr_table_do_cb, (void *)&tdata, table, NULL);
      
      /* Free tdata.filter or wait for the pool to go away? */
      
      return; 
  }
  
  
  
  1.19      +1 -1      modperl-2.0/xs/maps/apr_functions.map
  
  Index: apr_functions.map
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/maps/apr_functions.map,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- apr_functions.map 2001/09/10 06:42:51     1.18
  +++ apr_functions.map 2001/09/15 18:17:31     1.19
  @@ -183,7 +183,7 @@
    apr_table_overlay | | base, overlay, p
    apr_table_add
   -apr_table_addn
  - apr_table_do
  + apr_table_do | mpxs_ | ...
    apr_table_get
    apr_table_merge
   -apr_table_mergen
  
  
  
  1.26      +23 -1     modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm
  
  Index: FunctionTable.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- FunctionTable.pm  2001/09/15 17:57:25     1.25
  +++ FunctionTable.pm  2001/09/15 18:17:31     1.26
  @@ -2,7 +2,7 @@
   
   # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   # ! WARNING: generated by ModPerl::ParseSource/0.01
  -# !          Sat Sep 15 10:58:15 2001
  +# !          Sat Sep 15 11:10:02 2001
   # !          do NOT edit, any changes will be lost !
   # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   
  @@ -3984,6 +3984,28 @@
         {
           'type' => 'SV *',
           'name' => 'arg'
  +      }
  +    ]
  +  },
  +  {
  +    'return_type' => 'void',
  +    'name' => 'mpxs_apr_table_do',
  +    'args' => [
  +      {
  +        'type' => 'PerlInterpreter *',
  +        'name' => 'my_perl'
  +      },
  +      {
  +        'type' => 'I32',
  +        'name' => 'items'
  +      },
  +      {
  +        'type' => 'SV **',
  +        'name' => 'mark'
  +      },
  +      {
  +        'type' => 'SV **',
  +        'name' => 'sp'
         }
       ]
     },
  
  
  

Reply via email to