root/branches/release-38/lib/MT/ObjectDriver/Driver/DBD/mysql.pm @ 2379

Revision 2379, 2.8 kB (checked in by bchoate, 19 months ago)

Removed debug message.

  • 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 init_dbh {
40    my $dbd = shift;
41    my ($dbh) = @_;
42    $dbd->SUPER::init_dbh(@_);
43    $dbd->_set_names($dbh);
44}
45
46sub _set_names {
47    my $dbd = shift;
48    my ($dbh) = @_;
49    return 1 if exists $dbh->{private_set_names};
50
51    my $cfg = MT->config;
52    my $set_names = $cfg->SQLSetNames;
53    $dbh->{private_set_names} = 1;
54    return 1 if (defined $set_names) && !$set_names;
55
56    eval {
57        local $@;
58        my $sth = $dbh->prepare('show variables like "character_set_database"')
59            or die "error collecting variables from mysql: " . $dbh->errstr;
60        $sth->execute or die "error collecting variables from mysql: " . $sth->errstr;
61        my $result = $sth->fetchall_hashref('Variable_name');
62        my $charset_db = $result->{character_set_database}{Value};
63        if (defined($charset_db) && ($charset_db ne 'latin1')) {
64            # MySQL 4.1+ and non-latin1(database) == needs SET NAMES call.
65            my $c = lc $cfg->PublishCharset;
66            my %Charset = (
67                'utf-8' => 'utf8',
68                'shift_jis' => 'sjis',
69                'shift-jis' => 'sjis',
70                'euc-jp' => 'ujis',
71                #'iso-8859-1' => 'latin1'
72            );
73            $c = $Charset{$c} ? $Charset{$c}  : $c;
74            $dbh->do("SET NAMES " . $c) or
75                return ($dbh->errstr);
76            if (!defined $set_names) {
77                # SQLSetNames has never been assigned; we had a successful
78                # 'SET NAMES' command, so it's safe to SET NAMES in the future.
79                $cfg->SQLSetNames(1, 1);
80            }
81        } else {
82            # 'set names' command isn't working for this verison of mysql,
83            # assign SQLSetNames to 0 to prevent further errors.
84            $cfg->SQLSetNames(0, 1);
85            return 0;
86        }
87    };
88    1;
89}
90
911;
92__END__
93
94=head1 NAME
95
96MT::ObjectDriver::Driver::DBD::mysql
97
98=head1 METHODS
99
100TODO
101
102=head1 AUTHOR & COPYRIGHT
103
104Please see L<MT/AUTHOR & COPYRIGHT>.
105
106=cut
Note: See TracBrowser for help on using the browser.