database-independence: it has begun.

Travis Boucher tbone at nexopia.com
Fri Dec 29 01:52:45 UTC 2006


Brad Fitzpatrick wrote:
> Mogilers,
>
> After I removed all the old APIs and made the mogilefsd file small and
> beautiful, I moved onto the oft-requested database independence
> project.
>
> 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
> earlier!):
>
>    $ grep -r get_dbh mogilefsd lib/ | grep -v text-base  | wc -l
>    50
>
> 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
> then....)
>
> But then the MySQL class is currently:
>
>   package MogileFS::Store::MySQL;
>   use strict;
>   use warnings;
>   use base 'MogileFS::Store';
>
>   1;
>
> 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
>   
Any future plans of abstracting all of the SQL away into a separate 
'Database'  package, allowing implementations of custom database 
backends (eg. non-sql)?  This could allow integration into existing 
database infrastructures and other methods of database scaling.


(I really gotta start remembering to post to the list rather then just 
replying...)



More information about the mogilefs mailing list