From: Arthur Axel 'fREW' Schmidt Date: Mon, 31 Jan 2011 19:39:46 +0000 (-0600) Subject: move SQLite datemath code to the correct SQLMaker class X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c9700c1c9b6b04b6b7e390b054617fa0e0c564df;p=dbsrgits%2FDBIx-Class.git move SQLite datemath code to the correct SQLMaker class --- diff --git a/lib/DBIx/Class/SQLMaker.pm b/lib/DBIx/Class/SQLMaker.pm index dfd5087..f317bac 100644 --- a/lib/DBIx/Class/SQLMaker.pm +++ b/lib/DBIx/Class/SQLMaker.pm @@ -194,24 +194,9 @@ sub _where_op_CONVERT_DATETIME { ; } -{ - my %part_map = ( - month => 'm', - day_of_month => 'd', - year => 'Y', - ); - - sub _datetime_sql { "STRFTIME('$part_map{$_[1]}', $_[2])" } -} +sub _datetime_sql { die 'date part extraction not implemented for this database' } -sub _datetime_diff_sql { - my ($self, $part, $left, $right) = @_; - '(' . - $self->_datetime_sql($part, $left) - . ' - ' . - $self->_datetime_sql($part, $right) - . ')' -} +sub _datetime_diff_sql { die 'date diffing not implemented for this database' } sub _where_op_GET_DATETIME { my ($self) = @_; diff --git a/lib/DBIx/Class/SQLMaker/SQLite.pm b/lib/DBIx/Class/SQLMaker/SQLite.pm index acf0337..61d9f7e 100644 --- a/lib/DBIx/Class/SQLMaker/SQLite.pm +++ b/lib/DBIx/Class/SQLMaker/SQLite.pm @@ -8,4 +8,26 @@ use base qw( DBIx::Class::SQLMaker ); # Disable it here sub _lock_select () { '' }; + +{ + my %part_map = ( + month => 'm', + day_of_month => 'd', + year => 'Y', + ); + + sub _datetime_sql { "STRFTIME('%$part_map{$_[1]}', $_[2])" } +} + +sub _datetime_diff_sql { + my ($self, $part, $left, $right) = @_; + if ($part eq 'day') { + return "(JULIANDAY($left) - JULIANDAY($right))" + } elsif ($part eq 'second') { + return "(STRFTIME('%s',$left) - STRFTIME('%s',$right))" + } else { + die "part $part is not supported by SQLite" + } +} + 1; diff --git a/t/sqlmaker/op_dt.t b/t/sqlmaker/op_dt.t index 693b5fb..22b0bec 100644 --- a/t/sqlmaker/op_dt.t +++ b/t/sqlmaker/op_dt.t @@ -54,16 +54,16 @@ is_same_sql_bind ( { -op => [ '=', 12, { -dt_month => { -ident => 'artist.when_began' } } ] }, { -op => [ '=', 2010, { -dt_get => [year => \'artist.when_began'] } ] }, { -op => [ '=', 14, { -dt_get => [day_of_month => \'artist.when_began'] } ] }, - { -op => [ '=', 10, { -dt_diff => [year => { -ident => 'artist.when_began' }, \'artist.when_ended'] } ] }, + { -op => [ '=', 10, { -dt_diff => [second => { -ident => 'artist.when_began' }, \'artist.when_ended'] } ] }, ] } ) ], "SELECT * FROM artist WHERE ( ( - ( ? = STRFTIME('m', artist.when_began) ) AND - ( ? = STRFTIME('Y', artist.when_began) ) AND - ( ? = STRFTIME('d', artist.when_began) ) AND - ( ? = ( STRFTIME('Y', artist.when_began) - STRFTIME('Y', artist.when_ended))) + ( ? = STRFTIME('%m', artist.when_began) ) AND + ( ? = STRFTIME('%Y', artist.when_began) ) AND + ( ? = STRFTIME('%d', artist.when_began) ) AND + ( ? = ( STRFTIME('%s', artist.when_began) - STRFTIME('%s', artist.when_ended))) ) ) ", [