From: Arthur Axel 'fREW' Schmidt Date: Tue, 1 Feb 2011 03:33:10 +0000 (-0600) Subject: add error message for unsupported part extraction and diffing X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c33937bfc324cdfa6fb4c92c12390ecf80748af4;p=dbsrgits%2FDBIx-Class.git add error message for unsupported part extraction and diffing --- diff --git a/lib/DBIx/Class/SQLMaker.pm b/lib/DBIx/Class/SQLMaker.pm index f317bac..57d9216 100644 --- a/lib/DBIx/Class/SQLMaker.pm +++ b/lib/DBIx/Class/SQLMaker.pm @@ -194,6 +194,14 @@ sub _where_op_CONVERT_DATETIME { ; } +sub _unsupported_date_extraction { + "date part extraction not supported for part $_[1] with database $_[2]" +} + +sub _unsupported_date_diff { + "date diff not supported for part $_[1] with database $_[2]" +} + sub _datetime_sql { die 'date part extraction not implemented for this database' } sub _datetime_diff_sql { die 'date diffing not implemented for this database' } diff --git a/lib/DBIx/Class/SQLMaker/MSSQL.pm b/lib/DBIx/Class/SQLMaker/MSSQL.pm index f1bb809..99a45f5 100644 --- a/lib/DBIx/Class/SQLMaker/MSSQL.pm +++ b/lib/DBIx/Class/SQLMaker/MSSQL.pm @@ -30,8 +30,16 @@ sub _rno_default_order { delete $diff_part_map{day_of_month}; delete $diff_part_map{day_of_week}; - sub _datetime_sql { "DATEPART('$part_map{$_[1]}', $_[2])" } - sub _datetime_diff_sql { "DATEDIFF('$diff_part_map{$_[1]}', $_[2], $_[3])" } + sub _datetime_sql { + die $_[0]->_unsupported_date_extraction($_[1], 'Microsoft SQL Server') + unless exists $part_map{$_[1]}; + "DATEPART('$part_map{$_[1]}', $_[2])" + } + sub _datetime_diff_sql { + die $_[0]->_unsupported_date_diff($_[1], 'Microsoft SQL Server') + unless exists $diff_part_map{$_[1]}; + "DATEDIFF('$diff_part_map{$_[1]}', $_[2], $_[3])" + } } diff --git a/lib/DBIx/Class/SQLMaker/MySQL.pm b/lib/DBIx/Class/SQLMaker/MySQL.pm index efd4771..465e6b0 100644 --- a/lib/DBIx/Class/SQLMaker/MySQL.pm +++ b/lib/DBIx/Class/SQLMaker/MySQL.pm @@ -72,8 +72,16 @@ sub _lock_select { my %diff_part_map = %part_map; $diff_part_map{day} = delete $diff_part_map{day_of_month}; - sub _datetime_sql { "EXTRACT($part_map{$_[1]} FROM $_[2])" } - sub _datetime_diff_sql { "TIMESTAMPDIFF($diff_part_map{$_[1]}, $_[2], $_[3])" } + sub _datetime_sql { + die $_[0]->_unsupported_date_extraction($_[1], 'MySQL') + unless exists $part_map{$_[1]}; + "EXTRACT($part_map{$_[1]} FROM $_[2])" + } + sub _datetime_diff_sql { + die $_[0]->_unsupported_date_diff($_[1], 'MySQL') + unless exists $diff_part_map{$_[1]}; + "TIMESTAMPDIFF($diff_part_map{$_[1]}, $_[2], $_[3])" + } } 1; diff --git a/lib/DBIx/Class/SQLMaker/Oracle.pm b/lib/DBIx/Class/SQLMaker/Oracle.pm index 015581a..10465a0 100644 --- a/lib/DBIx/Class/SQLMaker/Oracle.pm +++ b/lib/DBIx/Class/SQLMaker/Oracle.pm @@ -262,7 +262,11 @@ sub _insert_returning { week_of_year => 'WEEK_OF_YEAR', ); - sub _datetime_sql { "$part_map{$_[1]}($_[2])" } + sub _datetime_sql { + die $_[0]->_unsupported_date_extraction($_[1], 'Oracle') + unless exists $part_map{$_[1]}; + "$part_map{$_[1]}($_[2])" + } } { @@ -277,6 +281,10 @@ sub _insert_returning { year => 'SQL_TSI_YEAR', ); - sub _datetime_diff_sql { "TIMESTAMPDIFF($part_map{$_[1]}, $_[2], $_[3])" } + sub _datetime_diff_sql { + die $_[0]->_unsupported_date_diff($_[1], 'Oracle') + unless exists $part_map{$_[1]}; + "TIMESTAMPDIFF($part_map{$_[1]}, $_[2], $_[3])" + } } 1; diff --git a/lib/DBIx/Class/SQLMaker/Pg.pm b/lib/DBIx/Class/SQLMaker/Pg.pm index d62c231..baeb5bf 100644 --- a/lib/DBIx/Class/SQLMaker/Pg.pm +++ b/lib/DBIx/Class/SQLMaker/Pg.pm @@ -31,8 +31,16 @@ use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/; my %diff_part_map = %part_map; $diff_part_map{day} = delete $diff_part_map{day_of_month}; - sub _datetime_sql { "EXTRACT($part_map{$_[1]} FROM $_[2])" } - sub _datetime_diff_sql { "EXTRACT($diff_part_map{$_[1]} FROM ($_[2] - $_[3]))" } + sub _datetime_sql { + die $_[0]->_unsupported_date_extraction($_[1], 'PostgreSQL') + unless exists $part_map{$_[1]}; + "EXTRACT($part_map{$_[1]} FROM $_[2])" + } + sub _datetime_diff_sql { + die $_[0]->_unsupported_date_diff($_[1], 'PostgreSQL') + unless exists $diff_part_map{$_[1]}; + "EXTRACT($diff_part_map{$_[1]} FROM ($_[2] - $_[3]))" + } } 1; diff --git a/lib/DBIx/Class/SQLMaker/SQLite.pm b/lib/DBIx/Class/SQLMaker/SQLite.pm index 6a29f63..5c2aac3 100644 --- a/lib/DBIx/Class/SQLMaker/SQLite.pm +++ b/lib/DBIx/Class/SQLMaker/SQLite.pm @@ -27,7 +27,11 @@ sub _lock_select () { '' }; fractional_seconds => 'f', ); - sub _datetime_sql { "STRFTIME('%$part_map{$_[1]}', $_[2])" } + sub _datetime_sql { + die $_[0]->_unsupported_date_extraction($_[1], 'SQLite') + unless exists $part_map{$_[1]}; + "STRFTIME('%$part_map{$_[1]}', $_[2])" + } } sub _datetime_diff_sql { @@ -37,7 +41,7 @@ sub _datetime_diff_sql { } elsif ($part eq 'second') { return "(STRFTIME('%s',$left) - STRFTIME('%s',$right))" } else { - die "part $part is not supported by SQLite" + die $_[0]->_unsupported_date_diff($_[1], 'SQLite') } }