[svn:dbi] r15541 - dbi/branches/sqlengine/lib/DBI/DBD

[email protected] Fri, 21 Dec 2012 08:44:36 -0800 (PST)
Newsgroups perl.dbi.changes
Message-ID <[email protected]>
Author: REHSACK
Date: Fri Dec 21 08:44:36 2012
New Revision: 15541

Modified:
   dbi/branches/sqlengine/lib/DBI/DBD/SqlEngine.pm

Log:
put initialization funcs at the very end of initialization procedure

Modified: dbi/branches/sqlengine/lib/DBI/DBD/SqlEngine.pm
==============================================================================
--- dbi/branches/sqlengine/lib/DBI/DBD/SqlEngine.pm	(original)
+++ dbi/branches/sqlengine/lib/DBI/DBD/SqlEngine.pm	Fri Dec 21 08:44:36 2012
@@ -118,6 +118,8 @@
 
 use vars qw(@ISA $imp_data_size);
 
+use Carp qw/carp/;
+
 $imp_data_size = 0;
 
 sub connect ($$;$$$)
@@ -141,6 +143,7 @@
         my $two_phased_init;
         defined $dbh->{sql_init_phase} and $two_phased_init = ++$dbh->{sql_init_phase};
         my %second_phase_attrs;
+	my @func_inits;
 
         my ( $var, $val );
         while ( length $dbname )
@@ -154,69 +157,69 @@
                 $var    = $dbname;
                 $dbname = "";
             }
+
             if ( $var =~ m/^(.+?)=(.*)/s )
             {
                 $var = $1;
                 ( $val = $2 ) =~ s/\\(.)/$1/g;
-                if ($two_phased_init)
-                {
-                    eval { $dbh->STORE( $var, $val ); };
-                    $@ and $second_phase_attrs{$var} = $val;
-                }
-                else
-                {
-                    $dbh->STORE( $var, $val );
-                }
+		exists $attr->{$var} and carp("$var is given in DSN *and* \$attr during DBI->connect()") if($^W);
+		exists $attr->{$var} or $attr->{$var} = $val;
             }
             elsif ( $var =~ m/^(.+?)=>(.*)/s )
             {
                 $var = $1;
                 ( $val = $2 ) =~ s/\\(.)/$1/g;
                 my $ref = eval $val;
-                $dbh->$var($ref);
+                # $dbh->$var($ref);
+		push(@func_inits, $var, $ref);
             }
         }
 
-        if ($two_phased_init)
-        {
-            # The attributes need to be sorted in a specific way as the
-            # assignment is through tied hashes and calls STORE on each
-            # attribute.  Some attributes require to be called prior to
-            # others
-            # e.g. f_dir *must* be done before xx_tables in DBD::File
-            # The dbh attribute sql_init_order is a hash with the order
-            # as key (low is first, 0 .. 100) and the attributes that
-            # are set to that oreder as anon-list as value:
-            # {  0 => [qw( AutoCommit PrintError RaiseError Profile ... )],
-            #   10 => [ list of attr to be dealt with immediately after first ],
-            #   50 => [ all fields that are unspecified or default sort order ],
-            #   90 => [ all fields that are needed after other initialisation ],
-            #   }
-
-            my %order = map {
-                my $order = $_;
-                map { ( $_ => $order ) } @{ $dbh->{sql_init_order}{$order} };
-            } sort { $a <=> $b } keys %{ $dbh->{sql_init_order} || {} };
-            my @ordered_attr =
-              map  { $_->[0] }
-              sort { $a->[1] <=> $b->[1] }
-              map  { [ $_, defined $order{$_} ? $order{$_} : 50 ] }
-              keys %$attr;
+	# The attributes need to be sorted in a specific way as the
+	# assignment is through tied hashes and calls STORE on each
+	# attribute.  Some attributes require to be called prior to
+	# others
+	# e.g. f_dir *must* be done before xx_tables in DBD::File
+	# The dbh attribute sql_init_order is a hash with the order
+	# as key (low is first, 0 .. 100) and the attributes that
+	# are set to that oreder as anon-list as value:
+	# {  0 => [qw( AutoCommit PrintError RaiseError Profile ... )],
+	#   10 => [ list of attr to be dealt with immediately after first ],
+	#   50 => [ all fields that are unspecified or default sort order ],
+	#   90 => [ all fields that are needed after other initialisation ],
+	#   }
+
+	my %order = map {
+	    my $order = $_;
+	    map { ( $_ => $order ) } @{ $dbh->{sql_init_order}{$order} };
+	} sort { $a <=> $b } keys %{ $dbh->{sql_init_order} || {} };
+	my @ordered_attr =
+	  map  { $_->[0] }
+	  sort { $a->[1] <=> $b->[1] }
+	  map  { [ $_, defined $order{$_} ? $order{$_} : 50 ] }
+	  keys %$attr;
+
+	# initialize given attributes ... lower weighted before higher weighted
+	foreach my $a (@ordered_attr)
+	{
+	    exists $attr->{$a} or next;
+	    $two_phased_init and eval {
+		$dbh->{$a} = $attr->{$a};
+		delete $attr->{$a};
+	    };
+	    $@ and $second_phase_attrs{$a} = delete $attr->{$a};
+	    $two_phased_init or $dbh->STORE($a, delete $attr->{$a});
+	}
 
-            # initialize given attributes ... lower weighted before higher weighted
-            foreach my $a (@ordered_attr)
-            {
-                exists $attr->{$a} or next;
-                eval {
-                    $dbh->{$a} = $attr->{$a};
-                    delete $attr->{$a};
-                };
-                $@ and $second_phase_attrs{$a} = delete $attr->{$a};
-            }
+	$two_phased_init and $dbh->func( 1, "init_default_attributes" );
+	%$attr = %second_phase_attrs;
 
-            $dbh->func( 1, "init_default_attributes" );
-            %$attr = %second_phase_attrs;
-        }
+	for( my $i = 0; $i < scalar(@func_inits); $i += 2 )
+	{
+	    my $func = $func_inits[$i];
+	    my $arg = $func_inits[$i+1];
+	    $dbh->$func($arg);
+	}
 
         $dbh->func("init_done");