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");
 

Reply via email to