root/branches/release-33/lib/MT/ObjectDriver/Driver/DBD/mysql.pm @ 1769

Revision 1769, 2.7 kB (checked in by fumiakiy, 20 months ago)

Stopped saving something in the database while database driver is being initialized. Let us see if this fixes the occasional "Time to Upgrade!" bug. BugId:58199

  • Property svn:keywords set to Id Revision
Line 
1# Movable Type (r) Open Source (C) 2001-2008 Six Apart, Ltd.
2# This program is distributed under the terms of the
3# GNU General Public License, version 2.
4#
5# $Id$
6
7package MT::ObjectDriver::Driver::DBD::mysql;
8
9use strict;
10use warnings;
11
12use base qw(
13    MT::ObjectDriver::Driver::DBD::Legacy
14    Data::ObjectDriver::Driver::DBD::mysql
15    MT::ErrorHandler
16);
17
18sub dsn_from_config {
19    my $dbd = shift;
20    my $dsn = $dbd->SUPER::dsn_from_config(@_);
21    my ($cfg) = @_;
22    $dsn .= ':database=' . $cfg->Database;
23    $dsn .= ';hostname=' . $cfg->DBHost if $cfg->DBHost;
24    $dsn .= ';mysql_socket=' . $cfg->DBSocket if $cfg->DBSocket;
25    $dsn .= ';port=' . $cfg->DBPort if $cfg->DBPort;
26    return $dsn;
27}
28
29sub sql_class {
30    require MT::ObjectDriver::SQL::mysql;
31    return 'MT::ObjectDriver::SQL::mysql';
32}
33
34sub ddl_class {
35    require MT::ObjectDriver::DDL::mysql;
36    return 'MT::ObjectDriver::DDL::mysql';
37}
38
39sub configure {
40    my $dbd = shift;
41    my ($driver) = @_;
42    $dbd->_set_names($driver);
43    $dbd;
44}
45
46sub _set_names {
47    my $dbd = shift;
48    my ($driver) = @_;
49    my $dbh = $driver->rw_handle;
50
51    my $cfg = MT->config;
52    my $set_names = $cfg->SQLSetNames;
53    return 1 if (defined $set_names) && !$set_names;
54
55    eval {
56        local $@;
57        my $sth = $dbh->prepare('show variables like "character_set_database"')
58            or return $driver->error($dbh->errstr);
59        $sth->execute or return $driver->error($sth->errstr);
60        my $result = $sth->fetchall_hashref('Variable_name');
61        my $charset_db = $result->{character_set_database}{Value};
62        if (defined($charset_db) && ($charset_db ne 'latin1')) {
63            # MySQL 4.1+ and non-latin1(database) == needs SET NAMES call.
64            my $c = lc $cfg->PublishCharset;
65            my %Charset = (
66                'utf-8' => 'utf8',
67                'shift_jis' => 'sjis',
68                'shift-jis' => 'sjis',
69                'euc-jp' => 'ujis',
70                #'iso-8859-1' => 'latin1'
71            );
72            $c = $Charset{$c} ? $Charset{$c}  : $c;
73            $dbh->do("SET NAMES " . $c) or
74                return ($dbh->errstr);
75            if (!defined $set_names) {
76                # SQLSetNames has never been assigned; we had a successful
77                # 'SET NAMES' command, so it's safe to SET NAMES in the future.
78                $cfg->SQLSetNames(1, 1);
79            }
80        } else {
81            # 'set names' command isn't working for this verison of mysql,
82            # assign SQLSetNames to 0 to prevent further errors.
83            $cfg->SQLSetNames(0, 1);
84            return 0;
85        }
86    };
87    1;
88}
89
901;
91__END__
92
93=head1 NAME
94
95MT::ObjectDriver::Driver::DBD::mysql
96
97=head1 METHODS
98
99TODO
100
101=head1 AUTHOR & COPYRIGHT
102
103Please see L<MT/AUTHOR & COPYRIGHT>.
104
105=cut
Note: See TracBrowser for help on using the browser.