File Coverage

blib/lib/Data/ResultsHelper.pm
Criterion Covered Total %
statement 6 275 2.1
branch 0 96 0.0
condition 0 54 0.0
subroutine 2 30 6.6
pod 0 26 0.0
total 8 481 1.6


line stmt bran cond sub pod time code
1             #!/usr/bin/perl -w
2              
3             package Data::ResultsHelper;
4              
5 1     1   32517 use vars qw($AUTOLOAD $VERSION);
  1         3  
  1         74  
6 1     1   6 use strict;
  1         2  
  1         5708  
7              
8             $VERSION = '1.04';
9              
10             sub new {
11 0     0 0   my $type = shift;
12 0 0         my @PASSED_ARGS = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
  0            
13 0           my @DEFAULT_ARGS = (
14             prefs => {},
15              
16             prefix => 'rh',
17              
18             back_text => 'back',
19             next_text => 'next',
20              
21             set_cookie => 1,
22             cookie_ttl => '1 hour',
23             base_dir => "/tmp/results_helper",
24             cookie_filename => time . "." . $$,
25             cookie_brick_over => 0,
26              
27             #delimiter => '\|',
28             #filter_columns_offset => 0,
29             #sort_code => [],
30             );
31 0           my %ARGS = (@DEFAULT_ARGS, @PASSED_ARGS);
32 0 0         unless($ARGS{cookie_name}) {
33 0 0 0       if($0 && $0 =~ m@.+/(.+)$@) {
34 0           $ARGS{cookie_name} = "rh_$1";
35             } else {
36 0           $ARGS{cookie_name} = "results_helper";
37             }
38             }
39 0           my $self = bless \%ARGS, $type;
40              
41 0           my $prefs_defaults = {
42             at_a_time => 25,
43             start_number => 1,
44             sort_column => 0,
45             };
46              
47 0           foreach my $key (qw(at_a_time start_number sort_column)) {
48 0 0         if(exists $self->{prefs}{$key}) {
    0          
    0          
49 0           next;
50             } elsif(exists $self->form->{$key}) {
51 0           $self->{prefs}{$key} = $self->form->{$key};
52             } elsif(exists $prefs_defaults->{$key}) {
53 0           $self->{prefs}{$key} = $prefs_defaults->{$key};
54             }
55             }
56 0           return $self;
57             }
58              
59             sub form {
60 0     0 0   my $self = shift;
61 0 0         unless($self->{form}) {
62              
63 0           $self->{form} = {};
64              
65 0           require CGI;
66 0           my $q = CGI->new;
67              
68 0           my %form = $q->Vars;
69 0           foreach my $key (keys %form) {
70 0           my $value = $form{$key};
71 0 0         if($value =~ /\0/) {
72 0           $self->{form}{$key} = [split /\0/, $value];
73             } else {
74 0           $self->{form}{$key} = $value;
75             }
76             }
77             }
78 0           return $self->{form};
79             }
80              
81             sub generate_results_ref {
82 0     0 0   my $self = shift;
83              
84 0 0         unless($self->retrieve_results) {
85 0           return {};
86             }
87              
88 0           $self->_filter;
89              
90 0           $self->cache_results;
91              
92 0 0 0       if ($self->{headers} && (ref($self->{headers}) eq 'ARRAY')) {
93 0           unshift(@{$self->{results}},$self->{headers});
  0            
94             }
95              
96 0           $self->{results_ref} = {
97             };
98              
99 0           $self->generate_toc_ref;
100 0           $self->generate_show_cols_ref;
101 0           $self->generate_header_ref;
102 0           return $self->{results_ref};
103             }
104              
105             sub cache_results {
106 0     0 0   my $self = shift;
107 0 0         if($self->set_cookie) {
108 0           require File::CacheDir;
109 0           my $cookie_name = $self->cookie_name;
110 0           my $cache_dir = File::CacheDir->new({
111             filename => $self->cookie_filename,
112             ttl => $self->cookie_ttl,
113             base_dir => $self->base_dir,
114             cookie_name => $cookie_name,
115             cookie_brick_over => $self->cookie_brick_over,
116             set_cookie => 1,
117             });
118 0 0         $cache_dir->{content_typed} = $ENV{CONTENT_TYPED} if($ENV{CONTENT_TYPED});
119 0           my $filename = $cache_dir->cache_dir;
120              
121 0 0         $self->store($self->{results}, $filename) || $self->my_die("store to $filename failed");
122             }
123             }
124              
125             sub store {
126 0     0 0   my $self = shift;
127 0           require Storable;
128 0           return Storable::store(@_);
129             }
130              
131             sub retrieve {
132 0     0 0   my $self = shift;
133 0           require Storable;
134 0           return Storable::retrieve(@_);
135             }
136              
137             sub my_die {
138 0     0 0   my $self = shift;
139 0           die "@_";
140             }
141              
142             sub generate_show_cols_ref {
143 0     0 0   my $self = shift;
144 0           my $ref = $self->{results_ref};
145 0           for(my $i=0;$i<@{$self->{results}->[0]};$i++) {
  0            
146 0   0       $ref->{"$self->{prefix}_show_cols"} ||= [];
147 0 0         if($self->{results}[0][$i]) {
148 0           push @{$ref->{"$self->{prefix}_show_cols"}}, $i;
  0            
149             }
150             }
151             }
152              
153             sub second_page {
154 0     0 0   my $self = shift;
155 0 0         return ($self->get_pages > 1) ? 1 : 0;
156             }
157              
158             sub generate_toc_ref {
159 0     0 0   my $self = shift;
160              
161 0 0 0       return if(!$self->second_page && $self->smart_second_page_toc);
162              
163 0           my $ref = $self->{results_ref};
164 0           $ref->{$self->{prefix} . "_low"} = $self->low;
165 0           $ref->{$self->{prefix} . "_high"} = $self->high;
166 0           $ref->{$self->{prefix} . "_rows"} = $self->rows;
167              
168 0           $ref->{$self->{prefix} . "_toc_page_text"} = [];
169 0           $ref->{$self->{prefix} . "_toc_page_href"} = [];
170              
171 0           my $more_form_tack_on_string = $self->more_form_tack_on_string;
172 0           my $script_name = $self->script_name;
173 0           my $href = "$script_name?start_number=-start-$more_form_tack_on_string";
174 0           my $start;
175 0           for(my $i=1;$i<=$self->get_pages($self->rows);$i++) {
176 0 0 0       last if($self->toc_limit && $i > $self->toc_limit);
177 0           $start = 1 + $self->{prefs}{at_a_time} * ($i - 1);
178 0           my $tmp_href = $href;
179 0           $tmp_href =~ s/-start-/$start/;
180 0           push @{$ref->{$self->{prefix} . "_toc_page_text"}}, $i;
  0            
181 0           push @{$ref->{$self->{prefix} . "_toc_page_href"}}, $tmp_href;
  0            
182             }
183              
184 0           $ref->{$self->{prefix} . "_toc_back_text"} = $self->back_text;
185 0           $ref->{$self->{prefix} . "_toc_next_text"} = $self->next_text;
186              
187 0           $self->link_current_page;
188 0           $self->link_back_button($href);
189 0           $self->link_next_button($href);
190             }
191              
192             sub link_current_page {
193 0     0 0   my $self = shift;
194 0           my $ref = $self->{results_ref};
195              
196 0           my $temp_page = int($self->{prefs}{start_number}/$self->{prefs}{at_a_time}) + 1;
197 0           my $temp_start_number = ($temp_page - 1) * $self->{prefs}{at_a_time} + 1;
198 0           $ref->{$self->{prefix} . "_toc_page_href"}[$temp_page - 1] = '';
199             }
200              
201             sub link_back_button {
202 0     0 0   my $self = shift;
203 0           my $href = shift;
204              
205 0           my $ref = $self->{results_ref};
206 0           my $start = $self->{prefs}{start_number} - $self->{prefs}{at_a_time};
207              
208             ### if this is the first page, don't link the back button
209 0 0         if($start < 1) {
210 0           $ref->{$self->{prefix} . "_toc_back_href"} = '';
211             } else {
212 0           my $tmp_href = $href;
213 0           $tmp_href =~ s/-start-/$start/;
214 0           $ref->{$self->{prefix} . "_toc_back_href"} = $tmp_href;
215             }
216             }
217              
218             sub link_next_button {
219 0     0 0   my $self = shift;
220 0           my $href = shift;
221              
222 0           my $ref = $self->{results_ref};
223 0           my $start = $self->{prefs}{start_number} + $self->{prefs}{at_a_time};
224              
225             ### if this is the last page, don't link the next button
226 0 0         if($start > $self->rows) {
227 0           $ref->{$self->{prefix} . "_toc_next_href"} = '';
228             } else {
229 0           my $tmp_href = $href;
230 0           $tmp_href =~ s/-start-/$start/;
231 0           $ref->{$self->{prefix} . "_toc_next_href"} = $tmp_href;
232             }
233             }
234              
235             sub script_name {
236 0     0 0   my $self = shift;
237 0 0         unless($self->{script_name}) {
238 0   0       $ENV{HTTP_HOST} ||= "";
239 0   0       $ENV{SCRIPT_NAME} ||= "";
240 0   0       $ENV{PATH_INFO} ||= "";
241 0           $self->{script_name} = "http://$ENV{HTTP_HOST}$ENV{SCRIPT_NAME}$ENV{PATH_INFO}";
242             }
243 0           return $self->{script_name};
244             }
245              
246             sub generate_header_ref {
247 0     0 0   my $self = shift;
248 0   0       my $headers = shift || $self->{results}[0];
249              
250 0           my $ref = $self->{results_ref};
251 0           $ref->{$self->{prefix} . "_header_text"} = [];
252 0           $ref->{$self->{prefix} . "_header_href"} = [];
253              
254             ### set up the passed along query_string
255 0           my $form_tack_on_string = $self->get_form_tack_on_string;
256              
257             ### do the table header row
258 0 0         unless ($self->{no_header}){
259              
260 0 0         my $add_sort_column = ($self->{prefs}->{sort_column} =~ /^-?\d+(,[,\-\d]+)/) ? $1 : "";
261 0           foreach my $i (@{$ref->{"$self->{prefix}_show_cols"}}) {
  0            
262 0 0         next unless length($self->{results}[0][$i]);
263              
264             # doing the toggle for the links
265 0           my $link = $self->script_name . "?";
266 0 0         if(!exists $self->{prefs}{sort_column}) {
    0          
    0          
267 0           $link .= "sort_column=$i$add_sort_column$form_tack_on_string";
268             } elsif($self->{prefs}->{sort_column} =~ /^\-$i\b/) {
269 0           $link .= "sort_column=$i$add_sort_column$form_tack_on_string";
270             } elsif($self->{prefs}->{sort_column} =~ /^\b$i\b/) {
271 0           $link .= "sort_column=-$i$add_sort_column$form_tack_on_string";
272             } else {
273 0           $link .= "sort_column=$i$add_sort_column$form_tack_on_string";
274             }
275              
276 0           push @{$ref->{$self->{prefix} . "_header_text"}}, $self->{results}[0][$i];
  0            
277 0           push @{$ref->{$self->{prefix} . "_header_href"}}, $link;
  0            
278             }
279              
280             }
281              
282             }
283              
284             sub AUTOLOAD {
285 0     0     my $self = shift;
286 0           my $return;
287 0 0         if($AUTOLOAD =~ /.+::(.+)/) {
288 0           my $method = $1;
289 0 0         $return = $self->{$method} if(exists $self->{$method});
290             }
291 0           return $return;
292             }
293              
294             sub _filter {
295 0     0     my $self = shift;
296              
297             ### want to change sort_code to an array ref
298 0 0         if(ref $self->{sort_code} eq 'HASH') {
299 0           my $tmp = [];
300 0           foreach(sort keys %{$self->{sort_code}}) {
  0            
301 0           $tmp->[$_] = $self->{sort_code}->{$_};
302             }
303 0           $self->{sort_code} = $tmp;
304             }
305              
306 0           my $rows = $self->rows;
307 0 0 0       if(( exists $self->{prefs}{sort_column}) && $self->{prefs}{sort_column} =~ /^[0-9,\-]+$/) {
308             # the 1 signifies there is a header row
309 0           require Sort::ArrayOfArrays;
310 0           $self->{results} = Sort::ArrayOfArrays::sort_it($self->{results}, $self->{prefs}->{sort_column}, $self->{sort_code}, 1);
311             }
312             }
313              
314             sub retrieve_results {
315 0     0 0   my $self = shift;
316              
317 0 0 0       return $self->{results} if defined($self->{results}) && ref($self->{results}) && $#{ $self->{results} } > -1;
  0   0        
318              
319 0           require CGI;
320 0           my $cookie_name = $self->cookie_name;
321 0           my $cookie_value = CGI::cookie($cookie_name);
322 0   0       my $filename = $cookie_value || "";
323 0 0         $filename = $self->base_dir . $filename unless ($filename =~ /^$self->{base_dir}/);
324 0 0 0       if( $filename && -f $filename ) {
    0          
325 0           $self->{results} = $self->retrieve($filename);
326             }elsif( $self->can('generate_results') ) {
327 0           $self->generate_results;
328             }else{
329 0           return "";
330             }
331              
332 0           return $self->{results};
333             }
334              
335             sub rows {
336 0     0 0   my $self = shift;
337              
338             ### need to subtract 1 since the zeroth row is the header information
339 0           return @{$self->{results}} - 1;
  0            
340             }
341              
342             sub get_pages {
343 0     0 0   my $self = shift;
344 0   0       my $rows = shift || $self->rows;
345 0           my $pages = int($rows / $self->{prefs}->{at_a_time}) + 1;
346 0 0         $pages-- unless($rows % $self->{prefs}->{at_a_time});
347 0           return $pages;
348             }
349              
350             sub low {
351 0     0 0   my $self = shift;
352 0           return $self->{prefs}{start_number};
353             }
354              
355             sub high {
356 0     0 0   my $self = shift;
357 0   0       my $rows = shift || $self->rows;
358 0 0         return ($self->{prefs}->{start_number} + $self->{prefs}->{at_a_time} - 1 > $rows)
359             ? $rows : $self->{prefs}->{start_number} + $self->{prefs}->{at_a_time} - 1;
360             }
361              
362             sub get_values {
363 0     0 0   my $values=shift;
364 0 0         return () unless defined $values;
365 0 0         if (ref $values eq "ARRAY") {
366 0           return @$values;
367             }
368 0           return ($values);
369             }
370              
371             sub get_form_tack_on_string {
372 0     0 0   my $self = shift;
373 0           my $form_tack_on_string = '';
374 0           my %hash = (%{$self->form}, %{$self->{prefs}});
  0            
  0            
375 0           while(my ($key, $value) = each %hash) {
376 0 0 0       next if(!$value || $key eq 'sort_column' || $key eq 'start_number');
      0        
377 0           foreach(get_values($value)) {
378 0           $form_tack_on_string .= "&" . URLEncode($key) . "=" . URLEncode($_);
379             }
380             }
381 0           return $form_tack_on_string;
382             }
383              
384             sub more_form_tack_on_string {
385 0     0 0   my $self = shift;
386 0   0       my $more_form_tack_on_string = $self->get_form_tack_on_string || "";
387 0           foreach (qw(sort_column) ){
388 0 0         $more_form_tack_on_string .= "&$_=$self->{prefs}->{$_}" if(exists $self->{prefs}{$_});
389             }
390 0           return $more_form_tack_on_string;
391             }
392              
393             sub URLEncode {
394 0     0 0   my $arg = shift;
395 0 0         my ($ref,$return) = ref($arg) ? ($arg,0) : (\$arg,1) ;
396              
397 0 0         if (defined $$ref) {
398 0           $$ref =~ s/([^\w\.\-\ \@\/\:])/sprintf("%%%02X",ord($1))/eg;
  0            
399 0           $$ref =~ y/\ /+/;
400             }
401              
402 0 0         return $return ? $$ref : '';
403             }
404              
405             sub URLDecode {
406 0     0 0   my $arg = shift;
407 0 0         my ($ref,$return) = ref($arg) ? ($arg,0) : (\$arg,1) ;
408              
409 0 0         if (defined $$ref) {
410 0           $$ref =~ y/+/ /;
411 0           $$ref =~ s/%([a-f0-9]{2})/chr hex $1/eig;
  0            
412             }
413              
414 0 0         return $return ? $$ref : '';
415             }
416              
417             sub to_char {
418 0     0 0   my $self = shift;
419 0           my ($time, $format, $localtime) = @_;
420 0 0 0       return "" unless($time && length $time);
421 0           my @array;
422 0 0         if($localtime) {
423 0           @array = localtime($time);
424             } else {
425 0           @array = gmtime($time);
426             }
427 0           my @mm = qw(01 02 03 04 05 06 07 08 09 10 11 12);
428 0           my @mon = qw(jan feb mar apr may jun jul aug sep oct nov dec);
429 0           my @Mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
430 0           my @month = qw(January February March April May June July August September October November December);
431 0           my @wday = qw(SUN MON TUE WED THU FRI SAT);
432 0           my @weekday = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
433 0           my @short_weekday = qw(Sun Mon Tue Wed Thu Fri Sat);
434 0           $format =~ s/\bd\b|\bday\b/$array[3]/ige;
  0            
435 0           $format =~ s/dd/sprintf "%02u", $array[3]/ige;
  0            
436 0           $format =~ s/mm/$mm[$array[4]]/ige;
  0            
437 0           $format =~ s/\bmon\b/$mon[$array[4]]/ge;
  0            
438 0           $format =~ s/\bMon\b/$Mon[$array[4]]/ge;
  0            
439 0           $format =~ s/\bmonth\b/$month[$array[4]]/ige;
  0            
440 0           $format =~ s/yyyy/$array[5]+1900/ige;
  0            
441 0           $format =~ s/\byy\b/substr($array[5], 1, 2)/ige;
  0            
442 0           $format =~ s/\bhour\b|\bhr\b|\bh\b|\bhh24\b/sprintf "%02u", $array[2]/ige;
  0            
443 0           $format =~ s/\b12hour\b|\b12hr\b|\b12h\b/get_12hour($array[2])/ige;
  0            
444 0           $format =~ s/\bhour\b|\bhr\b|\bh\b/$array[2]/ige;
  0            
445 0           $format =~ s/\bminute\b|\bmin\b|\bm\b/sprintf "%02u", $array[1]/ige;
  0            
446 0           $format =~ s/\bsecond\b|\bsec\b|\bs\b|\bss\b/sprintf "%02u", $array[0]/ige;
  0            
447 0           $format =~ s/\bwdy\b/$weekday[$array[6]]/ige;
  0            
448 0           $format =~ s/\bwd\b/$short_weekday[$array[6]]/ige;
  0            
449 0           $format =~ s/\bdy\b/$wday[$array[6]]/ige;
  0            
450 0           return $format;
451             }
452              
453             1;
454              
455             __END__