database-independence: it has begun.

Brad Fitzpatrick brad at
Fri Dec 29 00:42:07 UTC 2006


After I removed all the old APIs and made the mogilefsd file small and
beautiful, I moved onto the oft-requested database independence

Currently code is like:

    my $dbh = Mgd::get_dbh();
    $dbh->selectrow_array("SELECT MYSQL_SPECIFIC_CRAP() FROM foo WHERE blah blah",
                          undef, $param, $another_param, $etc);

I want to kill all that.  There are 50 places like that (down from 54

   $ grep -r get_dbh mogilefsd lib/ | grep -v text-base  | wc -l

The new way is:

    my $sto = Mgd::get_store();
    my $data = $sto->some_method_on_the_store_class(@params) # %params, etc

Where the $sto is a per-process singleton.  This is Mgd::get_store():

  my ($store, $store_pid);
  sub get_store {
      return $store if $store && $store_pid == $$;
      $store_pid = $$;
      return $store = MogileFS::Store->new;

Where the MogileFS::Store constructor does:

  sub new {
      my ($class) = @_;
      my $dsn = MogileFS->config('db_dsn');
      my $subclass;
      if ($dsn =~ /^DBI:mysql:/i) {
          $subclass = "MogileFS::Store::MySQL";
      }  else {
          die "Unknown database type: $dsn";
      return bless {
          dsn    => MogileFS->config('db_dsn'),
          user   => MogileFS->config('db_user'),
          pass   => MogileFS->config('db_pass'),
      }, $subclass;

Yes, currently just MySQL.  Volunteers for Oracle, Postgres, SQLite?
(well, SQLite would kinda suck as you couldn't have multiple trackers

But then the MySQL class is currently:

  package MogileFS::Store::MySQL;
  use strict;
  use warnings;
  use base 'MogileFS::Store';


Yes, that's it.

Because all the shared methods not requiring trickery are in the base
class.  So maintaining a new database store should be simple.

Anybody want to help with those 50 remaining get_dbh() callers?

- Brad

More information about the mogilefs mailing list