support sub-second precision for TIMESTAMPs for Firebird over ODBC
Rafael Kitover [Sat, 9 Apr 2011 21:48:38 +0000 (17:48 -0400)]
Changes
lib/DBIx/Class/Storage/DBI/InterBase.pm
lib/DBIx/Class/Storage/DBI/ODBC/Firebird.pm
t/750firebird.t
t/inflate/datetime_firebird.t

diff --git a/Changes b/Changes
index 0648bec..63e49ef 100644 (file)
--- a/Changes
+++ b/Changes
@@ -19,6 +19,7 @@ Revision history for DBIx::Class
           changes the output of as_query (should not cause compat issues)
         - Support ancient DB2 versions (5.4 and older), with proper limit
           dialect
+        - Support sub-second precision for TIMESTAMPs for Firebird over ODBC
 
     * Fixes
         - Fix ::Storage::DBI::* MRO problems on 5.8.x perls
index 97c556b..6779e47 100644 (file)
@@ -214,8 +214,7 @@ Timestamp columns can be declared with either C<datetime> or C<timestamp>.
 
 You will need the L<DateTime::Format::Strptime> module for inflation to work.
 
-For L<DBIx::Class::Storage::DBI::ODBC::Firebird>, this is a noop and sub-second
-precision is not currently available.
+For L<DBIx::Class::Storage::DBI::ODBC::Firebird>, this is a noop.
 
 =cut
 
@@ -296,11 +295,6 @@ C<last_insert_id> support by default only works for Firebird versions 2 or
 greater, L<auto_nextval|DBIx::Class::ResultSource/auto_nextval> however should
 work with earlier versions.
 
-=item *
-
-Sub-second precision for TIMESTAMPs is not currently available when using the
-L<ODBC|DBIx::Class::Storage::DBI::ODBC::Firebird> driver.
-
 =back
 
 =head1 AUTHOR
index d4a5f50..b1a2a47 100644 (file)
@@ -22,9 +22,9 @@ To build the ODBC driver for Firebird on Linux for unixODBC, see:
 L<http://www.firebirdnews.org/?p=1324>
 
 This driver does not suffer from the nested statement handles across commits
-issue that the L<DBD::InterBase|DBIx::Class::Storage::DBI::InterBase> based
-driver does. This makes it more suitable for long running processes such as
-under L<Catalyst>.
+issue that the L<DBD::InterBase|DBIx::Class::Storage::DBI::InterBase> or the
+L<DBD::Firebird|DBIx::Class::Storage::DBI::Firebird> based driver does. This
+makes it more suitable for long running processes such as under L<Catalyst>.
 
 =cut
 
@@ -62,7 +62,7 @@ package # hide from PAUSE
 # inherit parse/format date
 our @ISA = 'DBIx::Class::Storage::DBI::InterBase::DateTime::Format';
 
-my $timestamp_format = '%Y-%m-%d %H:%M:%S'; # %F %T, no fractional part
+my $timestamp_format = '%Y-%m-%d %H:%M:%S.%4N'; # %F %T
 my $timestamp_parser;
 
 sub parse_datetime {
@@ -87,17 +87,6 @@ sub format_datetime {
 
 1;
 
-=head1 CAVEATS
-
-=over 4
-
-=item *
-
-This driver (unlike L<DBD::InterBase>) does not currently support reading or
-writing C<TIMESTAMP> values with sub-second precision.
-
-=back
-
 =head1 AUTHOR
 
 See L<DBIx::Class/AUTHOR> and L<DBIx::Class/CONTRIBUTORS>.
index 84c0929..b2964ec 100644 (file)
@@ -185,7 +185,6 @@ EOF
   my ($updated) = $schema->resultset('Artist')->search({name => 'foo'});
   is eval { $updated->rank }, 4, 'and the update made it to the database';
 
-
 # test LIMIT support
   my $lim = $ars->search( {},
     {
index 572fc4e..0f62161 100644 (file)
@@ -49,10 +49,10 @@ foreach my $conn_idx (0..$#info) {
     "created_on" TIMESTAMP
   )
 SQL
-  my $rs   = $schema->resultset('Event');
+  my $rs = $schema->resultset('Event');
 
   my $dt = DateTime->now;
-  $dt->set_nanosecond($dsn =~ /odbc/i ? 0 : 555600000);
+  $dt->set_nanosecond(555600000);
 
   my $date_only = DateTime->new(
     year => $dt->year, month => $dt->month, day => $dt->day
@@ -70,7 +70,7 @@ SQL
   is $row->created_on, $dt, 'TIMESTAMP as DateTime roundtrip';
 
   cmp_ok $row->created_on->nanosecond, '==', $dt->nanosecond,
-    'fractional part of a second survived' if 0+$dt->nanosecond;
+    'fractional part of a second survived';
 
   is $row->starts_at, $date_only, 'DATE as DateTime roundtrip';
 }