root/branches/release-30/lib/MT/ObjectDriverFactory.pm @ 1413

Revision 1413, 2.4 kB (checked in by bchoate, 21 months ago)

Limit cache size of in-memory caching. BugId:69023

  • 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::ObjectDriverFactory;
8
9use strict;
10use base qw( MT::ErrorHandler );
11
12use MT::ObjectDriver::Driver::DBI;
13use MT::ObjectDriver::SQL;
14
15# Mapping of aliases/identifiers to a particular implementation.
16our $drivers = [
17    [ qr/(db[id]::)?(postgres|pg(sql)?)/ => 'Pg' ],
18    [ qr/(db[id]::)?mysql/               => 'mysql' ],
19    [ qr/(db[id]::)?u(ms)?sqlserver/     => 'UMSSQLServer' ],
20    [ qr/(db[id]::)?(ms)?sqlserver/      => 'MSSQLServer' ],
21    [ qr/(db[id]::)?sqlite/              => 'SQLite' ],
22    [ qr/(db[id]::)?oracle/              => 'Oracle' ],
23];
24
25our @drivers;
26
27sub init {
28    @drivers = ();
29    __PACKAGE__->new();
30}
31
32sub new {
33    my $pkg = shift;
34    my ($type) = @_;
35    $type ||= MT->config('ObjectDriver');
36
37    my $class;
38    foreach my $driver (@$drivers) {
39        if ((lc $type) =~ m/^$driver->[0]$/) {
40            $class = $driver->[1];
41            last;
42        }
43    }
44    $class ||= $type;
45    die "Unsupported driver :" unless $class;
46    $class = 'MT::ObjectDriver::Driver::DBD::' . $class
47        unless $class =~ m/::/;
48    eval "use $class;";
49    die "Unsupported driver $type: $@" if $@;
50
51    my $cfg = MT->config;
52    my $Password ||= $cfg->DBPassword;
53    my $Username = $cfg->DBUser;
54
55    my $dbi_driver = MT::ObjectDriver::Driver::DBI->new(
56        dsn => $class->dsn_from_config($cfg),
57        ($Username ? ( username => $Username) : ()),
58        ($Password ? ( password => $Password) : ()),
59        ($class ? ( dbd => $class) : ()),
60    );
61
62    require MT::ObjectDriver::Driver::Cache::RAM;
63    require MT::Memcached;
64
65    my $driver;
66    if (MT::Memcached->is_available) {
67        require Data::ObjectDriver::Driver::Cache::Memcached;
68        $driver = MT::ObjectDriver::Driver::Cache::RAM->new(
69            fallback => Data::ObjectDriver::Driver::Cache::Memcached->new(
70                cache => MT::Memcached->instance,
71                fallback => $dbi_driver,
72            ),
73        );
74    } else {
75        $driver = MT::ObjectDriver::Driver::Cache::RAM->new(
76            fallback => $dbi_driver,
77        );
78    }
79
80    push @drivers, $driver;
81    return $driver;
82}
83
84sub configure {
85    my $pkg = shift;
86    $_->configure(@_) for @drivers;
87}
88
891;
90__END__
91
92=head1 NAME
93
94MT::ObjectDriverFactory
95
96=head1 METHODS
97
98TODO
99
100=head1 AUTHOR & COPYRIGHT
101
102Please see L<MT/AUTHOR & COPYRIGHT>.
103
104=cut
Note: See TracBrowser for help on using the browser.