aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Allbery <eagle@eyrie.org>2014-07-15 16:50:13 -0700
committerRuss Allbery <rra@stanford.edu>2014-07-15 21:10:16 -0700
commit6d7b65a912e6ea7e36d3ea5121bea2f427de453f (patch)
tree8365b87e9ad1539f8f3b89d3e251df1eebc17fdd
parent284b4a8201ef5cfcf44e9571ab155425b4e6a44f (diff)
Use DateTime objects in the database layer, not strings
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. Change-Id: Id25796da718d734ac96ca27ccea9045b0c80c03f Reviewed-on: https://gerrit.stanford.edu/1551 Reviewed-by: Russ Allbery <rra@stanford.edu> Tested-by: Russ Allbery <rra@stanford.edu>
-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;
};