--- ConfSourceSQL.pm.orig 2003-07-04 15:07:22.000000000 +0100 +++ ConfSourceSQL.pm 2003-07-04 15:07:39.000000000 +0100 @@ -100,8 +100,44 @@ my $f_username = $main->{conf}->{user_scores_sql_field_username}; my $f_table = $main->{conf}->{user_scores_sql_table}; - my $dbh = DBI->connect($dsn, $dbuser, $dbpass, {'PrintError' => 0}); - + ## + ## Hack to allow for failover between sql hosts + ## I assume that the hostname resolves to multiple + ## addresses + ## + my $dbh; + if( $dsn =~ /;/ ) { + ## ok there's a semi-colon in there which means we're dealing + ## with multiple hosts + my ( %DB_HOSTS, $sql, @local_dsn, @sql_servers ); + @local_dsn = split( /:/, $dsn ); + print @local_dsn[3] . "\n"; + @sql_servers = split( /;/, @local_dsn[3] ); + while( $sql = shift @sql_servers ) { $DB_HOSTS{ $sql } = 1; } + # + # Loop through Hosts. Try to connect to each one in turn. + # + my ( $k, $v ); + while ( ($k,$v) = each(%DB_HOSTS) ) { + if( @local_dsn[4] eq "" ) { + $dsn = @local_dsn[0] . ":" . @local_dsn[1] . ":database=" . @local_dsn[2] . ";host=" . $k; + } else { + $dsn = @local_dsn[0] . ":" . @local_dsn[1] . ":database=" . @local_dsn[2] . ";host=" . $k . ";port=" . @local_dsn[4]; + } + $dbh = DBI->connect($dsn, $dbuser, $dbpass, {'PrintError' => 0}) ; + # + # This ensures that once we have a successful connection it stops trying the rest. + # + if ( $DBI::err eq "") { + print "Using Database host: $k\n"; + last; + } + } + } else { + ## Original code + $dbh = DBI->connect($dsn, $dbuser, $dbpass, {'PrintError' => 0}); + } + if($dbh) { my $sql = "select $f_preference, $f_value from $f_table where ". "$f_username = ".$dbh->quote($username).