DBICでMySQLのロック

http://d.hatena.ne.jp/tokuhirom/20070126/1169812586

なんとなくDBICのにしてみた。

package DBIx::Class::Lock::MySQL;
use strict;
use warnings;
use base 'DBIx::Class';
use Carp::Clan qw/^DBIx::Class/;

sub get_lock {
    my ($self, $lock_id, $timeout) = @_;

    $self->{__MYSQL__LOCK__ID} = $lock_id;

    my $dbh = $self->storage->dbh;
    my $sth = $dbh->prepare('SELECT GET_LOCK(?,?)');
    $sth->execute($self->{__MYSQL__LOCK__ID}, $timeout);

    my ($result) = $sth->fetchrow_array();
    $sth->finish;

    unless(defined($result)) {
        croak("Error trying to acquire named lock.\n");
    }
    unless($result) {
        return undef;
    }
    return $self;
}

sub DESTROY {
    my $self = shift;

    my $dbh = $self->storage->dbh;
    if ($dbh->ping) {
        my $sth = $dbh->prepare('SELECT RELEASE_LOCK(?)');
        $sth->execute($self->{__MYSQL__LOCK__ID});
        $sth->finish();
    }
}

1;

ってか時間がなかったので適当。
久々にコード書いた。
もっとまともなの書かないとなぁ。

(追記)

これ、もっと透過的に使えるようにしたらおもろいかも。