removed compile-time dep on a valid $dbh from C4::Dates

This replaces using the package variable $prefformat directly, and
specifically, doing a call to C4::Context->preference() during
module initialization.  That way, C4::Dates no longer has a
compile-time dependency on having a valid $dbh.

The inspiration for this is making it easier for
zebraqueue_daemon to have code that detects when
the database connection goes down and then try to
reconnect to the DB.

Signed-off-by: Joshua Ferraro <jmf@liblime.com>
This commit is contained in:
Galen Charlton 2008-03-04 18:26:01 -06:00 committed by Joshua Ferraro
parent 2a1da8da1a
commit 34ce43c8ba
1 changed files with 28 additions and 10 deletions

View File

@ -31,7 +31,14 @@ BEGIN {
@EXPORT_OK = qw(DHTMLcalendar format_date_in_iso format_date);
}
my $prefformat = C4::Context->preference('dateformat');
my $prefformat;
sub _prefformat {
unless (defined $prefformat) {
$prefformat = C4::Context->preference('dateformat');
}
return $prefformat;
}
# print STDERR " Dates : \$debug is '$debug'\n";
# print STDERR " Dates : \$cgi_debug is '$cgi_debug'\n";
@ -116,7 +123,7 @@ sub new {
sub init ($;$$) {
my $self = shift;
my $dformat;
$self->{'dateformat'} = $dformat = (scalar(@_) >= 2) ? $_[1] : $prefformat;
$self->{'dateformat'} = $dformat = (scalar(@_) >= 2) ? $_[1] : _prefformat();
($format_map{$dformat}) or croak
"Invalid date format '$dformat' from " . ((scalar(@_) >= 2) ? 'argument' : 'system preferences');
$self->{'dmy_arrayref'} = [((@_) ? $self->dmy_map(shift) : localtime )] ;
@ -125,24 +132,24 @@ sub init ($;$$) {
}
sub output ($;$) {
my $self = shift;
my $newformat = (@_) ? _recognize_format(shift) : $prefformat;
my $newformat = (@_) ? _recognize_format(shift) : _prefformat();
return (eval {POSIX::strftime($posix_map{$newformat}, @{$self->{'dmy_arrayref'}})} || undef);
}
sub today ($;$) { # NOTE: sets date value to today (and returns it in the requested or current format)
my $class = shift;
$class = ref($class) || $class;
my $format = (@_) ? _recognize_format(shift) : $prefformat;
my $format = (@_) ? _recognize_format(shift) : _prefformat();
return $class->new()->output($format);
}
sub _recognize_format($) {
my $incoming = shift;
($incoming eq 'syspref') and return $prefformat;
($incoming eq 'syspref') and return _prefformat();
(scalar grep (/^$incoming$/, keys %format_map) == 1) or croak "The format you asked for ('$incoming') is unrecognized.";
return $incoming;
}
sub DHTMLcalendar ($;$) { # interface to posix_map
my $class = shift;
my $format = (@_) ? shift : $prefformat;
my $format = (@_) ? shift : _prefformat();
return $posix_map{$format};
}
sub format { # get or set dateformat: iso, metric, us, etc.
@ -155,16 +162,16 @@ sub visual {
if (@_) {
return $format_map{ _recognize_format(shift) };
}
$self eq __PACKAGE__ and return $format_map{$prefformat};
return $format_map{ eval { $self->{'dateformat'} } || $prefformat} ;
$self eq __PACKAGE__ and return $format_map{_prefformat()};
return $format_map{ eval { $self->{'dateformat'} } || _prefformat()} ;
}
# like the functions from the old C4::Date.pm
sub format_date {
return __PACKAGE__ -> new(shift,'iso')->output((@_) ? shift : $prefformat);
return __PACKAGE__ -> new(shift,'iso')->output((@_) ? shift : _prefformat());
}
sub format_date_in_iso {
return __PACKAGE__ -> new(shift,$prefformat)->output('iso');
return __PACKAGE__ -> new(shift,_prefformat())->output('iso');
}
1;
@ -291,5 +298,16 @@ This kind of check should be centralized somewhere. Probably not here, though.
Notes: if the date in the db is null or empty, interpret null expiration to mean "never expires".
=head3 _prefformat()
This internal function is used to read the preferred date format
from the system preference table. It reads the preference once,
then caches it.
This replaces using the package variable $prefformat directly, and
specifically, doing a call to C4::Context->preference() during
module initialization. That way, C4::Dates no longer has a
compile-time dependency on having a valid $dbh.
=cut