Files
racalmas/lib/calcms/cache.pm
Milan a6b656779b refactoring
update package definition
fix dependencies
remove global variables
2018-09-02 09:39:24 +02:00

184 lines
4.1 KiB
Perl

package cache;
use warnings "all";
use strict;
use config();
use time();
use log();
use markup();
use base 'Exporter';
our @EXPORT_OK = qw(init add_map get_map get_map_keys load save get_filename escape_regexp escape_regexp_line);
my $cache_map = {};
my $cache_map_keys = [];
my $header_printed = 0;
my $date_pattern = '(\d{4})\-(\d{2})\-(\d{2})';
my $datetime_pattern = '(\d{4})\-(\d{2})\-(\d{2})[T\+](\d{2})\:(\d{2})(\:\d{2})?';
sub init {
$cache_map = {};
$cache_map_keys = [];
$header_printed = 0;
}
sub get_date_pattern(){
return $date_pattern;
}
sub get_datetime_pattern(){
return $datetime_pattern;
}
sub add_map {
my $key = $_[0];
my $value = $_[1];
$key = '^' . $key . '$';
push @$cache_map_keys, $key;
$cache_map->{$key} = $value;
}
sub get_map {
return $cache_map;
}
sub get_map_keys {
return $cache_map_keys;
}
#get cache from params
sub load {
my $params = shift;
my $filename = get_filename($params);
my $result = { filename => $filename };
if ( defined $filename ) {
my @file_info = stat($filename);
my $modified = $file_info[9] || '';
if ( $modified ne '' ) {
#file exists
my @now = localtime( time() );
my @modified = localtime($modified);
if ( $now[2] == $modified[2] ) {
#file is elder than a hour
my $content = log::load_file($filename);
if ( defined $content ) {
$result->{content} = $content;
$result->{action} = 'read';
return $result;
}
}
}
}
$result->{action} = 'save';
return $result;
}
#get filename from params
sub get_filename {
my $config = shift;
my $params = shift;
# my $url=$ENV{REQUEST_URI};
my $url = $ENV{QUERY_STRING} || '';
if ( $url ne '' ) {
$url =~ s/(^|\&)update\=\d//gi;
$url =~ s/(^|\&)debug\=.*//gi;
$url =~ s/\?\&/\?/g;
$url =~ s/\&{2,99}/\&/g;
$url =~ s/\&$//g;
$url =~ s/^\/\//\//g;
}
foreach my $pattern (@$cache_map_keys) {
my $filename = $url;
if ( $filename =~ /$pattern/ ) {
my $m1 = $1;
my $m2 = $2;
my $m3 = $3;
my $m4 = $4;
my $m5 = $5;
my $m6 = $6;
my $m7 = $7;
my $m8 = $8;
# my $m9=$9;
my $result = $cache_map->{$pattern};
$filename =~ s/$pattern/$result/;
$filename =~ s/\$1/$m1/ if ( defined $m1 );
$filename =~ s/\$2/$m2/ if ( defined $m2 );
$filename =~ s/\$3/$m3/ if ( defined $m3 );
$filename =~ s/\$4/$m4/ if ( defined $m4 );
$filename =~ s/\$5/$m5/ if ( defined $m5 );
$filename =~ s/\$6/$m6/ if ( defined $m6 );
$filename =~ s/\$7/$m7/ if ( defined $m7 );
$filename =~ s/\$8/$m8/ if ( defined $m8 );
# $filename=~s/\$9/$m9/ if (defined $m9);
$filename = $config->{cache}->{cache_dir} . $filename;
return $filename;
}
}
return undef;
}
#deprecated: set file from params
sub set {
my $params = shift;
my $content = shift;
my $filename = get_filename($params);
my $cache = {
filename => $filename,
content => $content
};
# print $filename.":file\n";
if ( defined $filename ) {
cache::save($cache);
}
}
sub save {
my $cache = shift;
return if $cache->{action} ne 'save';
return if ( !defined $cache->{filename} ) || ( $cache->{filename} eq '' );
log::save_file( $cache->{filename}, $cache->{content} );
chmod 0664, $cache->{filename};
}
sub escape_regexp {
my $reg_exp = shift;
$reg_exp =~ s/([\^\$\\(\)\[\]\{\}\|\/\*\+\.\-\&\:])/\\$1/gi;
return $reg_exp;
}
sub escape_regexp_line {
my $reg_exp = shift;
$reg_exp =~ s/([\^\$\\(\)\[\]\{\}\|\/\*\+\.\-\&\:])/\\$1/gi;
return '^' . $reg_exp . '$';
}
sub configure {
my $file_name = shift;
cache::init();
cache::add_map( '', $file_name );
}
#do not delete last line!
1;