Switch sql_maker_class and datetime_parser_type to component_class accessors
Peter Rabbitson [Tue, 1 Mar 2011 08:14:55 +0000 (09:14 +0100)]
12 files changed:
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/ADO/Microsoft_SQL_Server.pm
lib/DBIx/Class/Storage/DBI/DB2.pm
lib/DBIx/Class/Storage/DBI/Informix.pm
lib/DBIx/Class/Storage/DBI/InterBase.pm
lib/DBIx/Class/Storage/DBI/MSSQL.pm
lib/DBIx/Class/Storage/DBI/ODBC/Firebird.pm
lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
lib/DBIx/Class/Storage/DBI/Pg.pm
lib/DBIx/Class/Storage/DBI/SQLite.pm
lib/DBIx/Class/Storage/DBI/Sybase/ASE.pm
lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm

index 153b287..2dc005c 100644 (file)
@@ -22,12 +22,15 @@ use namespace::clean;
 __PACKAGE__->cursor_class('DBIx::Class::Storage::DBI::Cursor');
 
 __PACKAGE__->mk_group_accessors('inherited' => qw/
-  sql_maker_class sql_limit_dialect sql_quote_char sql_name_sep
+  sql_limit_dialect sql_quote_char sql_name_sep
 /);
 
-__PACKAGE__->sql_name_sep('.');
+__PACKAGE__->mk_group_accessors('component_class' => qw/sql_maker_class datetime_parser_type/);
 
 __PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker');
+__PACKAGE__->datetime_parser_type('DateTime::Format::MySQL'); # historic default
+
+__PACKAGE__->sql_name_sep('.');
 
 __PACKAGE__->mk_group_accessors('simple' => qw/
   _connect_info _dbi_connect_info _dbic_connect_attributes _driver_determined
@@ -107,7 +110,15 @@ for my $meth (@rdbms_specific_methods) {
   no strict qw/refs/;
   no warnings qw/redefine/;
   *{__PACKAGE__ ."::$meth"} = subname $meth => sub {
-    if (not $_[0]->_driver_determined and not $_[0]->{_in_determine_driver}) {
+    if (
+      # only fire when invoked on an instance, a valid class-based invocation
+      # would e.g. be setting a default for an inherited accessor
+      ref $_[0]
+        and
+      ! $_[0]->_driver_determined
+        and
+      ! $_[0]->{_in_determine_driver}
+    ) {
       $_[0]->_determine_driver;
 
       # This for some reason crashes and burns on perl 5.8.1
@@ -117,6 +128,7 @@ for my $meth (@rdbms_specific_methods) {
       my $cref = $_[0]->can ($meth);
       goto $cref;
     }
+
     goto $orig;
   };
 }
@@ -993,7 +1005,6 @@ sub sql_maker {
   my ($self) = @_;
   unless ($self->_sql_maker) {
     my $sql_maker_class = $self->sql_maker_class;
-    $self->ensure_class_loaded ($sql_maker_class);
 
     my %opts = %{$self->_sql_maker_opts||{}};
     my $dialect =
@@ -2822,12 +2833,7 @@ sub datetime_parser {
 
 =head2 datetime_parser_type
 
-Defines (returns) the datetime parser class - currently hardwired to
-L<DateTime::Format::MySQL>
-
-=cut
-
-sub datetime_parser_type { "DateTime::Format::MySQL"; }
+Defines the datetime parser class - currently defaults to L<DateTime::Format::MySQL>
 
 =head2 build_datetime_parser
 
@@ -2838,7 +2844,6 @@ See L</datetime_parser>
 sub build_datetime_parser {
   my $self = shift;
   my $type = $self->datetime_parser_type(@_);
-  $self->ensure_class_loaded ($type);
   return $type;
 }
 
index 7c053af..efe32b6 100644 (file)
@@ -57,6 +57,10 @@ currently supported, datetimes are truncated at the second.
 
 =cut
 
+__PACKAGE__->datetime_parser_type (
+  'DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server::DateTime::Format'
+);
+
 sub _rebless {
   my $self = shift;
   $self->_identity_method('@@identity');
@@ -142,10 +146,6 @@ sub _mssql_max_data_type_representation_size_in_bytes {
   }
 }
 
-sub datetime_parser_type {
-  'DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server::DateTime::Format'
-}
-
 package # hide from PAUSE
   DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server::DateTime::Format;
 
index 66851d8..31b9230 100644 (file)
@@ -8,6 +8,7 @@ use mro 'c3';
 
 __PACKAGE__->sql_limit_dialect ('RowNumberOver');
 __PACKAGE__->sql_quote_char ('"');
+__PACKAGE__->datetime_parser_type('DateTime::Format::DB2');
 
 sub _dbh_last_insert_id {
     my ($self, $dbh, $source, $col) = @_;
@@ -20,7 +21,6 @@ sub _dbh_last_insert_id {
     return @res ? $res[0] : undef;
 }
 
-sub datetime_parser_type { "DateTime::Format::DB2"; }
 
 1;
 
index 90587d0..21401f4 100644 (file)
@@ -11,6 +11,10 @@ use namespace::clean;
 
 __PACKAGE__->sql_limit_dialect ('SkipFirst');
 __PACKAGE__->sql_quote_char ('"');
+__PACKAGE__->datetime_parser_type (
+  'DBIx::Class::Storage::DBI::Informix::DateTime::Format'
+);
+
 
 __PACKAGE__->mk_group_accessors('simple' => '__last_insert_id');
 
@@ -117,10 +121,6 @@ sub connect_call_datetime_setup {
   $ENV{GL_DATETIME} = "%Y-%m-%d %H:%M:%S%F5";
 }
 
-sub datetime_parser_type {
-  'DBIx::Class::Storage::DBI::Informix::DateTime::Format'
-}
-
 package # hide from PAUSE
   DBIx::Class::Storage::DBI::Informix::DateTime::Format;
 
index ab8bc70..9651277 100644 (file)
@@ -35,6 +35,9 @@ L</connect_call_datetime_setup>.
 __PACKAGE__->_use_insert_returning (1);
 __PACKAGE__->sql_limit_dialect ('FirstSkip');
 __PACKAGE__->sql_quote_char ('"');
+__PACKAGE__->datetime_parser_type(
+  'DBIx::Class::Storage::DBI::InterBase::DateTime::Format'
+);
 
 sub _sequence_fetch {
   my ($self, $nextval, $sequence) = @_;
@@ -222,9 +225,6 @@ sub connect_call_datetime_setup {
   $self->_get_dbh->{ib_time_all} = 'ISO';
 }
 
-sub datetime_parser_type {
-  'DBIx::Class::Storage::DBI::InterBase::DateTime::Format'
-}
 
 package # hide from PAUSE
   DBIx::Class::Storage::DBI::InterBase::DateTime::Format;
index d4f87cc..07d3a4f 100644 (file)
@@ -17,6 +17,11 @@ __PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker::MSSQL');
 
 __PACKAGE__->sql_quote_char([qw/[ ]/]);
 
+__PACKAGE__->datetime_parser_type (
+  'DBIx::Class::Storage::DBI::MSSQL::DateTime::Format'
+);
+
+
 __PACKAGE__->new_guid('NEWID()');
 
 sub _set_identity_insert {
@@ -180,10 +185,6 @@ sub _svp_rollback {
   $self->_get_dbh->do("ROLLBACK TRANSACTION $name");
 }
 
-sub datetime_parser_type {
-  'DBIx::Class::Storage::DBI::MSSQL::DateTime::Format'
-}
-
 sub sqlt_type { 'SQLServer' }
 
 sub sql_limit_dialect {
index 6f6acdf..0784e24 100644 (file)
@@ -26,6 +26,8 @@ under L<Catalyst>.
 
 =cut
 
+__PACKAGE__->datetime_parser_type ('DBIx::Class::Storage::DBI::ODBC::Firebird::DateTime::Format');
+
 # XXX seemingly no equivalent to ib_time_all from DBD::InterBase via ODBC
 sub connect_call_datetime_setup { 1 }
 
@@ -38,10 +40,6 @@ sub _set_sql_dialect { 1 }
 # releasing savepoints doesn't work, but that shouldn't matter
 sub _svp_release { 1 }
 
-sub datetime_parser_type {
-  'DBIx::Class::Storage::DBI::ODBC::Firebird::DateTime::Format'
-}
-
 package # hide from PAUSE
   DBIx::Class::Storage::DBI::ODBC::Firebird::DateTime::Format;
 
index 79896d8..d049d6c 100644 (file)
@@ -80,6 +80,7 @@ use base qw/DBIx::Class::Storage::DBI/;
 use mro 'c3';
 
 __PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker::Oracle');
+__PACKAGE__->datetime_parser_type('DateTime::Format::Oracle');
 
 sub _determine_supports_insert_returning {
   my $self = shift;
@@ -335,10 +336,6 @@ sub get_autoinc_seq {
 This sets the proper DateTime::Format module for use with
 L<DBIx::Class::InflateColumn::DateTime>.
 
-=cut
-
-sub datetime_parser_type { return "DateTime::Format::Oracle"; }
-
 =head2 connect_call_datetime_setup
 
 Used as:
index 0673fe8..785a67b 100644 (file)
@@ -15,6 +15,7 @@ use namespace::clean;
 
 __PACKAGE__->sql_limit_dialect ('LimitOffset');
 __PACKAGE__->sql_quote_char ('"');
+__PACKAGE__->datetime_parser_type ('DateTime::Format::Pg');
 
 # Ask for a DBD::Pg with array support
 warn __PACKAGE__.": DBD::Pg 2.9.2 or greater is strongly recommended\n"
@@ -166,8 +167,6 @@ sub sqlt_type {
   return 'PostgreSQL';
 }
 
-sub datetime_parser_type { return "DateTime::Format::Pg"; }
-
 sub bind_attribute_by_data_type {
   my ($self,$data_type) = @_;
 
index b87c63a..0fa8e75 100644 (file)
@@ -9,6 +9,7 @@ use mro 'c3';
 __PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker::SQLite');
 __PACKAGE__->sql_limit_dialect ('LimitOffset');
 __PACKAGE__->sql_quote_char ('"');
+__PACKAGE__->datetime_parser_type ('DateTime::Format::SQLite');
 
 sub backup {
 
@@ -63,8 +64,6 @@ sub deployment_statements {
   $self->next::method($schema, $type, $version, $dir, $sqltargs, @rest);
 }
 
-sub datetime_parser_type { return "DateTime::Format::SQLite"; }
-
 =head2 connect_call_use_foreign_keys
 
 Used as:
index 52e90bf..906d3ae 100644 (file)
@@ -18,6 +18,7 @@ use namespace::clean;
 
 __PACKAGE__->sql_limit_dialect ('RowCountOrGenericSubQ');
 __PACKAGE__->sql_quote_char ([qw/[ ]/]);
+__PACKAGE__->datetime_parser_type('DateTime::Format::Sybase');
 
 __PACKAGE__->mk_group_accessors('simple' =>
     qw/_identity _blob_log_on_update _writer_storage _is_extra_storage
@@ -888,7 +889,6 @@ C<SMALLDATETIME> columns only have minute precision.
   }
 }
 
-sub datetime_parser_type { "DateTime::Format::Sybase" }
 
 # ->begin_work and such have no effect with FreeTDS but we run them anyway to
 # let the DBD keep any state it needs to.
index 4b55929..71d6e34 100644 (file)
@@ -10,6 +10,10 @@ use base qw/
 use mro 'c3';
 use Carp::Clan qw/^DBIx::Class/;
 
+__PACKAGE__->datetime_parser_type(
+  'DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::DateTime::Format'
+);
+
 sub _rebless {
   my $self = shift;
   my $dbh  = $self->_get_dbh;
@@ -105,9 +109,6 @@ C<SMALLDATETIME> columns only have minute precision.
   }
 }
 
-sub datetime_parser_type {
-  'DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::DateTime::Format'
-} 
 
 package # hide from PAUSE
   DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::DateTime::Format;