1docs::api::APR::Table(3U)ser Contributed Perl Documentatidooncs::api::APR::Table(3)
2
3
4
6 APR::Table - Perl API for manipulating APR opaque string-content tables
7
9 use APR::Table ();
10
11 $table = APR::Table::make($pool, $nelts);
12 $table_copy = $table->copy($pool);
13
14 $table->clear();
15
16 $table->set($key => $val);
17 $table->unset($key);
18 $table->add($key, $val);
19
20 $val = $table->get($key);
21 @val = $table->get($key);
22
23 $table->merge($key => $val);
24
25 use APR::Const -compile qw(:table);
26 $table_overlay = $table_base->overlay($table_overlay, $pool);
27 $table_overlay->compress(APR::Const::OVERLAP_TABLES_MERGE);
28
29 $table_a->overlap($table_b, APR::Const::OVERLAP_TABLES_SET);
30
31 $table->do(sub {print "key $_[0], value $_[1]\n"}, @valid_keys);
32
33 #Tied Interface
34 $value = $table->{$key};
35 $table->{$key} = $value;
36 print "got it" if exists $table->{$key};
37
38 foreach my $key (keys %{$table}) {
39 print "$key = $table->{$key}\n";
40 }
41
43 "APR::Table" allows its users to manipulate opaque string-content
44 tables.
45
46 On the C level the "opaque string-content" means: you can put in
47 '\0'-terminated strings and whatever you put in your get out.
48
49 On the Perl level that means that we convert scalars into strings and
50 store those strings. Any special information that was in the Perl
51 scalar is not stored. So for example if a scalar was marked as utf8,
52 tainted or tied, that information is not stored. When you get the data
53 back as a Perl scalar you get only the string.
54
55 The table's structure is somewhat similar to the Perl's hash structure,
56 but allows multiple values for the same key. An access to the records
57 stored in the table always requires a key.
58
59 The key-value pairs are stored in the order they are added.
60
61 The keys are case-insensitive.
62
63 However as of the current implementation if more than value for the
64 same key is requested, the whole table is lineary searched, which is
65 very inefficient unless the table is very small.
66
67 "APR::Table" provides a TIE Interface.
68
69 See apr/include/apr_tables.h in ASF's apr project for low level
70 details.
71
73 "APR::Table" provides the following functions and/or methods:
74
75 "add"
76 Add data to a table, regardless of whether there is another element
77 with the same key.
78
79 $table->add($key, $val);
80
81 obj: $table ( "APR::Table object" )
82 The table to add to.
83
84 arg1: $key ( string )
85 The key to use.
86
87 arg2: $val ( string )
88 The value to add.
89
90 ret: no return value
91 since: 2.0.00
92
93 When adding data, this function makes a copy of both the key and the
94 value.
95
96 "clear"
97 Delete all of the elements from a table.
98
99 $table->clear();
100
101 obj: $table ( "APR::Table object" )
102 The table to clear.
103
104 ret: no return value
105 since: 2.0.00
106
107 "compress"
108 Eliminate redundant entries in a table by either overwriting or merging
109 duplicates:
110
111 $table->compress($flags);
112
113 obj: $table ( "APR::Table object" )
114 The table to compress.
115
116 arg1: $flags ("APR::Const constant")
117 APR::Const::OVERLAP_TABLES_MERGE -- to merge
118 APR::Const::OVERLAP_TABLES_SET -- to overwrite
119
120 ret: no return value
121 since: 2.0.00
122
123 Converts multi-valued keys in $table into single-valued keys. This
124 function takes duplicate table entries and flattens them into a single
125 entry. The flattening behavior is controlled by the (mandatory) $flags
126 argument.
127
128 When $flags == "APR::Const::OVERLAP_TABLES_SET", each key will be set
129 to the last value seen for that key. For example, given key/value
130 pairs 'foo => bar' and 'foo => baz', 'foo' would have a final value of
131 'baz' after compression -- the 'bar' value would be lost.
132
133 When $flags == "APR::Const::OVERLAP_TABLES_MERGE", multiple values for
134 the same key are flattened into a comma-separated list. Given
135 key/value pairs 'foo => bar' and 'foo => baz', 'foo' would have a final
136 value of 'bar, baz' after compression.
137
138 Access the constants via:
139
140 use APR::Const -compile qw(:table);
141
142 or an explicit:
143
144 use APR::Const -compile qw(OVERLAP_TABLES_SET OVERLAP_TABLES_MERGE);
145
146 compress() combined with overlay() does the same thing as overlap().
147
148 Examples:
149
150 • "APR::Const::OVERLAP_TABLES_SET"
151
152 Start with table $table:
153
154 foo => "one"
155 foo => "two"
156 foo => "three"
157 bar => "beer"
158
159 which is done by:
160
161 use APR::Const -compile => ':table';
162 my $table = APR::Table::make($r->pool, TABLE_SIZE);
163
164 $table->set(bar => 'beer');
165 $table->set(foo => 'one');
166 $table->add(foo => 'two');
167 $table->add(foo => 'three');
168
169 Now compress it using "APR::Const::OVERLAP_TABLES_SET":
170
171 $table->compress(APR::Const::OVERLAP_TABLES_SET);
172
173 Now table $table contains:
174
175 foo => "three"
176 bar => "beer"
177
178 The value three for the key foo, that was added last, took over the
179 other values.
180
181 • "APR::Const::OVERLAP_TABLES_MERGE"
182
183 Start with table $table:
184
185 foo => "one"
186 foo => "two"
187 foo => "three"
188 bar => "beer"
189
190 as in the previous example, now compress it using
191 "APR::Const::OVERLAP_TABLES_MERGE":
192
193 $table->compress(APR::Const::OVERLAP_TABLES_MERGE);
194
195 Now table $table contains:
196
197 foo => "one, two, three"
198 bar => "beer"
199
200 All the values for the same key were merged into one value.
201
202 "copy"
203 Create a new table and copy another table into it.
204
205 $table_copy = $table->copy($p);
206
207 obj: $table ( "APR::Table object" )
208 The table to copy.
209
210 arg1: $p ( "APR::Pool object" )
211 The pool to allocate the new table out of.
212
213 ret: $table_copy ( "APR::Table object" )
214 A copy of the table passed in.
215
216 since: 2.0.00
217
218 "do"
219 Iterate over all the elements of the table, invoking provided
220 subroutine for each element. The subroutine gets passed as argument, a
221 key-value pair.
222
223 $table->do(sub {...}, @filter);
224
225 obj: $table ( "APR::Table object" )
226 The table to operate on.
227
228 arg1: $sub ( CODE ref/string )
229 A subroutine reference or name to be called on each item in the
230 table. The subroutine can abort the iteration by returning 0 and
231 should always return 1 otherwise.
232
233 opt arg3: @filter ( ARRAY )
234 If passed, only keys matching one of the entries in f@filter will
235 be processed.
236
237 ret: no return value
238 since: 2.0.00
239
240 Examples:
241
242 • This filter simply prints out the key/value pairs and counts how
243 many pairs did it see.
244
245 use constant TABLE_SIZE => 20;
246 our $filter_count;
247 my $table = APR::Table::make($r->pool, TABLE_SIZE);
248
249 # populate the table with ascii data
250 for (1..TABLE_SIZE) {
251 $table->set(chr($_+97), $_);
252 }
253
254 $filter_count = 0;
255 $table->do("my_filter");
256 print "Counted $filter_count elements";
257
258 sub my_filter {
259 my ($key, $value) = @_;
260 warn "$key => $value\n";
261 $filter_count++;
262 return 1;
263 }
264
265 Notice that "my_filter" always returns 1, ensuring that do() will
266 pass all the key/value pairs.
267
268 • This filter is similar to the one from the previous example, but
269 this time it decides to abort the filtering after seeing half of
270 the table, by returning 0 when this happens.
271
272 sub my_filter {
273 my ($key, $value) = @_;
274 $filter_count++;
275 return $filter_count == int(TABLE_SIZE)/2 ? 0 : 1;
276 }
277
278 "get"
279 Get the value(s) associated with a given key. After this call, the
280 data is still in the table.
281
282 $val = $table->get($key);
283 @val = $table->get($key);
284
285 obj: $table ( "APR::Table object" )
286 The table to search for the key.
287
288 arg1: $key ( string )
289 The key to search for.
290
291 ret: $val or @val
292 In the scalar context the first matching value returned (the oldest
293 in the table, if there is more than one value). If nothing matches
294 "undef" is returned.
295
296 In the list context the whole table is traversed and all matching
297 values are returned. An empty list is returned if nothing matches.
298
299 since: 2.0.00
300
301 "make"
302 Make a new table.
303
304 $table = APR::Table::make($p, $nelts);
305
306 obj: $p ( "APR::Pool object" )
307 The pool to allocate the pool out of.
308
309 arg1: $nelts ( integer )
310 The number of elements in the initial table. At least 1 or more. If
311 0 is passed APR will still allocate 1.
312
313 ret: $table ( "APR::Table object" )
314 The new table.
315
316 since: 2.0.00
317
318 This table can only store text data.
319
320 "merge"
321 Add data to a table by merging the value with data that has already
322 been stored using ", " as a separator:
323
324 $table->merge($key, $val);
325
326 obj: $table ( "APR::Table object" )
327 The table to search for the data.
328
329 arg1: $key ( string )
330 The key to merge data for.
331
332 arg2: $val ( string )
333 The data to add.
334
335 ret: no return value
336 since: 2.0.00
337
338 If the key is not found, then this function acts like add().
339
340 If there is more than one value for the same key, only the first (the
341 oldest) value gets merged.
342
343 Examples:
344
345 • Start with a pair:
346
347 merge => "1"
348
349 and merge "a" to the value:
350
351 $table->set( merge => '1');
352 $table->merge(merge => 'a');
353 $val = $table->get('merge');
354
355 Result:
356
357 $val == "1, a";
358
359 • Start with a multivalued pair:
360
361 merge => "1"
362 merge => "2"
363
364 and merge "a" to the first value;
365
366 $table->set( merge => '1');
367 $table->add( merge => '2');
368 $table->merge(merge => 'a');
369 @val = $table->get('merge');
370
371 Result:
372
373 $val[0] == "1, a";
374 $val[1] == "2";
375
376 Only the first value for the same key is affected.
377
378 • Have no entry and merge "a";
379
380 $table->merge(miss => 'a');
381 $val = $table->get('miss');
382
383 Result:
384
385 $val == "a";
386
387 "overlap"
388 For each key/value pair in $table_b, add the data to $table_a. The
389 definition of $flags explains how $flags define the overlapping method.
390
391 $table_a->overlap($table_b, $flags);
392
393 obj: $table_a ( "APR::Table object" )
394 The table to add the data to.
395
396 arg1: $table_b ( "APR::Table object" )
397 The table to iterate over, adding its data to table $table_a
398
399 arg2: $flags ( integer )
400 How to add the table to table $table_a.
401
402 When $flags == "APR::Const::OVERLAP_TABLES_SET", if another element
403 already exists with the same key, this will over-write the old
404 data.
405
406 When $flags == "APR::Const::OVERLAP_TABLES_MERGE", the key/value
407 pair from $table_b is added, regardless of whether there is another
408 element with the same key in $table_a.
409
410 ret: no return value
411 since: 2.0.00
412
413 Access the constants via:
414
415 use APR::Const -compile qw(:table);
416
417 or an explicit:
418
419 use APR::Const -compile qw(OVERLAP_TABLES_SET OVERLAP_TABLES_MERGE);
420
421 This function is highly optimized, and uses less memory and CPU cycles
422 than a function that just loops through table $table_b calling other
423 functions.
424
425 Conceptually, overlap() does this:
426
427 apr_array_header_t *barr = apr_table_elts(b);
428 apr_table_entry_t *belt = (apr_table_entry_t *)barr-E<gt>elts;
429 int i;
430
431 for (i = 0; i < barr->nelts; ++i) {
432 if (flags & APR_OVERLAP_TABLES_MERGE) {
433 apr_table_mergen(a, belt[i].key, belt[i].val);
434 }
435 else {
436 apr_table_setn(a, belt[i].key, belt[i].val);
437 }
438 }
439
440 Except that it is more efficient (less space and cpu-time) especially
441 when $table_b has many elements.
442
443 Notice the assumptions on the keys and values in $table_b -- they must
444 be in an ancestor of $table_a's pool. In practice $table_b and
445 $table_a are usually from the same pool.
446
447 Examples:
448
449 • "APR::Const::OVERLAP_TABLES_SET"
450
451 Start with table $base:
452
453 foo => "one"
454 foo => "two"
455 bar => "beer"
456
457 and table $add:
458
459 foo => "three"
460
461 which is done by:
462
463 use APR::Const -compile => ':table';
464 my $base = APR::Table::make($r->pool, TABLE_SIZE);
465 my $add = APR::Table::make($r->pool, TABLE_SIZE);
466
467 $base->set(bar => 'beer');
468 $base->set(foo => 'one');
469 $base->add(foo => 'two');
470
471 $add->set(foo => 'three');
472
473 Now overlap using "APR::Const::OVERLAP_TABLES_SET":
474
475 $base->overlap($add, APR::Const::OVERLAP_TABLES_SET);
476
477 Now table $add is unmodified and table $base contains:
478
479 foo => "three"
480 bar => "beer"
481
482 The value from table "add" has overwritten all previous values for
483 the same key both had (foo). This is the same as doing overlay()
484 followed by compress() with "APR::Const::OVERLAP_TABLES_SET".
485
486 • "APR::Const::OVERLAP_TABLES_MERGE"
487
488 Start with table $base:
489
490 foo => "one"
491 foo => "two"
492
493 and table $add:
494
495 foo => "three"
496 bar => "beer"
497
498 which is done by:
499
500 use APR::Const -compile => ':table';
501 my $base = APR::Table::make($r->pool, TABLE_SIZE);
502 my $add = APR::Table::make($r->pool, TABLE_SIZE);
503
504 $base->set(foo => 'one');
505 $base->add(foo => 'two');
506
507 $add->set(foo => 'three');
508 $add->set(bar => 'beer');
509
510 Now overlap using "APR::Const::OVERLAP_TABLES_MERGE":
511
512 $base->overlap($add, APR::Const::OVERLAP_TABLES_MERGE);
513
514 Now table $add is unmodified and table $base contains:
515
516 foo => "one, two, three"
517 bar => "beer"
518
519 Values from both tables for the same key were merged into one
520 value. This is the same as doing overlay() followed by compress()
521 with "APR::Const::OVERLAP_TABLES_MERGE".
522
523 "overlay"
524 Merge two tables into one new table. The resulting table may have more
525 than one value for the same key.
526
527 $table = $table_base->overlay($table_overlay, $p);
528
529 obj: $table_base ( "APR::Table object" )
530 The table to add at the end of the new table.
531
532 arg1: $table_overlay ( "APR::Table object" )
533 The first table to put in the new table.
534
535 arg2: $p ( "APR::Pool object" )
536 The pool to use for the new table.
537
538 ret: $table ( "APR::Table object" )
539 A new table containing all of the data from the two passed in.
540
541 since: 2.0.00
542
543 Examples:
544
545 • Start with table $base:
546
547 foo => "one"
548 foo => "two"
549 bar => "beer"
550
551 and table $add:
552
553 foo => "three"
554
555 which is done by:
556
557 use APR::Const -compile => ':table';
558 my $base = APR::Table::make($r->pool, TABLE_SIZE);
559 my $add = APR::Table::make($r->pool, TABLE_SIZE);
560
561 $base->set(bar => 'beer');
562 $base->set(foo => 'one');
563 $base->add(foo => 'two');
564
565 $add->set(foo => 'three');
566
567 Now overlay using "APR::Const::OVERLAP_TABLES_SET":
568
569 my $overlay = $base->overlay($add, APR::Const::OVERLAP_TABLES_SET);
570
571 That resulted in a new table $overlay (tables "add" and $base are
572 unmodified) which contains:
573
574 foo => "one"
575 foo => "two"
576 foo => "three"
577 bar => "beer"
578
579 "set"
580 Add a key/value pair to a table, if another element already exists with
581 the same key, this will over-write the old data.
582
583 $table->set($key, $val);
584
585 obj: $table ( "APR::Table object" )
586 The table to add the data to.
587
588 arg1: $key ( string )
589 The key to use.
590
591 arg2: $val ( string )
592 The value to add.
593
594 ret: no return value
595 since: 2.0.00
596
597 When adding data, this function makes a copy of both the key and the
598 value.
599
600 "unset"
601 Remove data from the table.
602
603 $table->unset($key);
604
605 obj: $table ( "APR::Table object" )
606 The table to remove data from.
607
608 arg1: $key ( string )
609 The key of the data being removed.
610
611 ret: no return value
612 since: 2.0.00
613
615 "APR::Table" also implements a tied interface, so you can work with the
616 $table object as a hash reference.
617
618 The following tied-hash function are supported: "FETCH", "STORE",
619 "DELETE", "CLEAR", "EXISTS", "FIRSTKEY", "NEXTKEY" and "DESTROY".
620
621 Note regarding the use of values(). "APR::Table" can hold more than one
622 key-value pair sharing the same key, so when using a table through the
623 tied interface, the first entry found with the right key will be used,
624 completely disregarding possible other entries with the same key. With
625 Perl 5.8.0 and higher values() will correctly list values the
626 corresponding to the list generated by keys(). That doesn't work with
627 Perl 5.6. Therefore to portably iterate over the key-value pairs, use
628 each() (which fully supports multivalued keys), or "APR::Table::do".
629
630 "EXISTS"
631 $ret = $table->EXISTS($key);
632
633 obj: $table ( "APR::Table object" )
634 arg1: $key ( string )
635 ret: $ret ( integer )
636 true or false
637
638 since: 2.0.00
639
640 "CLEAR"
641 $table->CLEAR();
642
643 obj: $table ( "APR::Table object" )
644 ret: no return value
645 since: 2.0.00
646
647 "STORE"
648 $table->STORE($key, $val);
649
650 obj: $table ( "APR::Table object" )
651 arg1: $key ( string )
652 arg2: $val ( string )
653 ret: no return value
654 since: 2.0.00
655
656 "DELETE"
657 $table->DELETE($key);
658
659 obj: $table ( "APR::Table object" )
660 arg1: $key ( string )
661 ret: no return value
662 since: 2.0.00
663
664 "FETCH"
665 $ret = $table->FETCH($key);
666
667 obj: $table ( "APR::Table object" )
668 arg1: $key ( string )
669 ret: $ret ( string )
670 since: 2.0.00
671
672 When iterating through the table's entries with each(), "FETCH" will
673 return the current value of a multivalued key. For example:
674
675 $table->add("a" => 1);
676 $table->add("b" => 2);
677 $table->add("a" => 3);
678
679 ($k, $v) = each %$table; # (a, 1)
680 print $table->{a}; # prints 1
681
682 ($k, $v) = each %$table; # (b, 2)
683 print $table->{a}; # prints 1
684
685 ($k, $v) = each %$table; # (a, 3)
686 print $table->{a}; # prints 3 !!!
687
688 ($k, $v) = each %$table; # (undef, undef)
689 print $table->{a}; # prints 1
690
692 mod_perl 2.0 documentation.
693
695 mod_perl 2.0 and its core modules are copyrighted under The Apache
696 Software License, Version 2.0.
697
699 The mod_perl development team and numerous contributors.
700
701
702
703perl v5.36.0 2023-01-19 docs::api::APR::Table(3)