add error message for unsupported part extraction and diffing
Arthur Axel 'fREW' Schmidt [Tue, 1 Feb 2011 03:33:10 +0000 (21:33 -0600)]
lib/DBIx/Class/SQLMaker.pm
lib/DBIx/Class/SQLMaker/MSSQL.pm
lib/DBIx/Class/SQLMaker/MySQL.pm
lib/DBIx/Class/SQLMaker/Oracle.pm
lib/DBIx/Class/SQLMaker/Pg.pm
lib/DBIx/Class/SQLMaker/SQLite.pm

index f317bac..57d9216 100644 (file)
@@ -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' }
index f1bb809..99a45f5 100644 (file)
@@ -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])"
+  }
 }
 
 
index efd4771..465e6b0 100644 (file)
@@ -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;
index 015581a..10465a0 100644 (file)
@@ -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;
index d62c231..baeb5bf 100644 (file)
@@ -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;
index 6a29f63..5c2aac3 100644 (file)
@@ -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')
    }
 }