summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--README9
-rw-r--r--perl/lib/Wallet/ACL.pm13
-rw-r--r--perl/lib/Wallet/Object/Base.pm28
4 files changed, 32 insertions, 24 deletions
diff --git a/NEWS b/NEWS
index 1594797..beddf7f 100644
--- a/NEWS
+++ b/NEWS
@@ -40,6 +40,12 @@ wallet 1.1 (unreleased)
and an incorrect linkage in the schema for the ACL history, and add
indices for the object type, name, and ACL instead.
+ Pass in DateTime objects for the date fields in the database instead
+ of formatted time strings. This provides better compatibility with
+ different database engines. Document in README the need to install
+ the DateTime::Format::* module corresponding to the DBD::* module used
+ for the server database.
+
The wallet server now requires Perl 5.8 or later (instead of 5.006 in
previous versions) and is now built with Module::Build instead of
ExtUtils::MakeMaker. This should be transparent to anyone not working
diff --git a/README b/README
index ef910bd..4c9f1d7 100644
--- a/README
+++ b/README
@@ -68,10 +68,11 @@ REQUIREMENTS
plus Module::Build to build. It uses DBIx::Class and DBI to talk to a
database, and therefore the DBIx::Class and DBI modules (and their
dependencies) and a DBD module for the database it will use must be
- installed. The SQL::Translator Perl module is also required for schema
- deployment and database upgrades. If the wallet server is used with a
- SQLite 3 database, the Perl module DateTime::Format::SQLite should also
- be installed.
+ installed. The DateTime module is required for date handling, and the
+ SQL::Translator Perl module is also required for schema deployment and
+ database upgrades. You will also need the DateTime::Format::* module
+ corresponding to your DBD module (such as DateTime::Format::SQLite or
+ DateTime::Format::PG).
Currently, the server has only been tested against SQLite 3, MySQL 5,
and PostgreSQL, and prebuilt SQL files (for database upgrades) are only
diff --git a/perl/lib/Wallet/ACL.pm b/perl/lib/Wallet/ACL.pm
index 9507c64..57097c0 100644
--- a/perl/lib/Wallet/ACL.pm
+++ b/perl/lib/Wallet/ACL.pm
@@ -17,13 +17,13 @@ use strict;
use warnings;
use vars qw($VERSION);
+use DateTime;
use DBI;
-use POSIX qw(strftime);
# This version should be increased on any code change to this module. Always
# use two digits for the minor version with a leading zero if necessary so
# that it will sort properly.
-$VERSION = '0.07';
+$VERSION = '0.08';
##############################################################################
# Constructors
@@ -78,7 +78,7 @@ sub create {
die "unable to retrieve new ACL ID" unless defined $id;
# Add to the history table.
- my $date = strftime ('%Y-%m-%d %T', localtime $time);
+ my $date = DateTime->from_epoch (epoch => $time);
%record = (ah_acl => $id,
ah_action => 'create',
ah_by => $user,
@@ -86,7 +86,6 @@ sub create {
ah_on => $date);
my $history = $schema->resultset('AclHistory')->create (\%record);
die "unable to create new history entry" unless defined $history;
-
$guard->commit;
};
if ($@) {
@@ -164,13 +163,14 @@ sub log_acl {
unless ($action =~ /^(add|remove)\z/) {
die "invalid history action $action";
}
+ my $date = DateTime->from_epoch (epoch => $time);
my %record = (ah_acl => $self->{id},
ah_action => $action,
ah_scheme => $scheme,
ah_identifier => $identifier,
ah_by => $user,
ah_from => $host,
- ah_on => strftime ('%Y-%m-%d %T', localtime $time));
+ ah_on => $date);
$self->{schema}->resultset('AclHistory')->create (\%record);
}
@@ -242,11 +242,12 @@ sub destroy {
$entry->delete if defined $entry;
# Create new history line for the deletion.
+ my $date = DateTime->from_epoch (epoch => $time);
my %record = (ah_acl => $self->{id},
ah_action => 'destroy',
ah_by => $user,
ah_from => $host,
- ah_on => strftime ('%Y-%m-%d %T', localtime $time));
+ ah_on => $date);
$self->{schema}->resultset('AclHistory')->create (\%record);
$guard->commit;
};
diff --git a/perl/lib/Wallet/Object/Base.pm b/perl/lib/Wallet/Object/Base.pm
index a009d76..f1b8b72 100644
--- a/perl/lib/Wallet/Object/Base.pm
+++ b/perl/lib/Wallet/Object/Base.pm
@@ -17,15 +17,15 @@ use strict;
use warnings;
use vars qw($VERSION);
+use DateTime;
use DBI;
-use POSIX qw(strftime);
use Text::Wrap qw(wrap);
use Wallet::ACL;
# This version should be increased on any code change to this module. Always
# use two digits for the minor version with a leading zero if necessary so
# that it will sort properly.
-$VERSION = '0.06';
+$VERSION = '0.07';
##############################################################################
# Constructors
@@ -63,22 +63,20 @@ sub create {
die "invalid object name\n" unless $name;
my $guard = $schema->txn_scope_guard;
eval {
+ my $date = DateTime->from_epoch (epoch => $time);
my %record = (ob_type => $type,
ob_name => $name,
ob_created_by => $user,
ob_created_from => $host,
- ob_created_on => strftime ('%Y-%m-%d %T',
- localtime $time));
+ ob_created_on => $date);
$schema->resultset('Object')->create (\%record);
-
%record = (oh_type => $type,
oh_name => $name,
oh_action => 'create',
oh_by => $user,
oh_from => $host,
- oh_on => strftime ('%Y-%m-%d %T', localtime $time));
+ oh_on => $date);
$schema->resultset('ObjectHistory')->create (\%record);
-
$guard->commit;
};
if ($@) {
@@ -139,27 +137,27 @@ sub log_action {
# assume that AutoCommit is turned off.
my $guard = $self->{schema}->txn_scope_guard;
eval {
+ my $date = DateTime->from_epoch (epoch => $time);
my %record = (oh_type => $self->{type},
oh_name => $self->{name},
oh_action => $action,
oh_by => $user,
oh_from => $host,
- oh_on => strftime ('%Y-%m-%d %T', localtime $time));
+ oh_on => $date);
$self->{schema}->resultset('ObjectHistory')->create (\%record);
+ # Add in more timestamps based on the action type.
my %search = (ob_type => $self->{type},
ob_name => $self->{name});
my $object = $self->{schema}->resultset('Object')->find (\%search);
if ($action eq 'get') {
$object->ob_downloaded_by ($user);
$object->ob_downloaded_from ($host);
- $object->ob_downloaded_on (strftime ('%Y-%m-%d %T',
- localtime $time));
+ $object->ob_downloaded_on ($date);
} elsif ($action eq 'store') {
$object->ob_stored_by ($user);
$object->ob_stored_from ($host);
- $object->ob_stored_on (strftime ('%Y-%m-%d %T',
- localtime $time));
+ $object->ob_stored_on ($date);
}
$object->update;
$guard->commit;
@@ -193,6 +191,7 @@ sub log_set {
die "invalid history field $field";
}
+ my $date = DateTime->from_epoch (epoch => $time);
my %record = (oh_type => $self->{type},
oh_name => $self->{name},
oh_action => 'set',
@@ -202,7 +201,7 @@ sub log_set {
oh_new => $new,
oh_by => $user,
oh_from => $host,
- oh_on => strftime ('%Y-%m-%d %T', localtime $time));
+ oh_on => $date);
$self->{schema}->resultset('ObjectHistory')->create (\%record);
}
@@ -703,12 +702,13 @@ sub destroy {
$self->{schema}->resultset('Object')->search (\%search)->delete;
# And create a new history object for the destroy action.
+ my $date = DateTime->from_epoch (epoch => $time);
my %record = (oh_type => $type,
oh_name => $name,
oh_action => 'destroy',
oh_by => $user,
oh_from => $host,
- oh_on => strftime ('%Y-%m-%d %T', localtime $time));
+ oh_on => $date);
$self->{schema}->resultset('ObjectHistory')->create (\%record);
$guard->commit;
};