MogileFS-Server
view release on metacpan or search on metacpan
lib/MogileFS/Store/SQLite.pm view on Meta::CPAN
package MogileFS::Store::SQLite;
use strict;
use warnings;
use DBI qw(:sql_types);
use Digest::MD5 qw(md5); # Used for lockid
use DBD::SQLite 1.13;
use MogileFS::Util qw(throw);
use base 'MogileFS::Store';
use File::Temp ();
# --------------------------------------------------------------------------
# Package methods we override
# --------------------------------------------------------------------------
sub post_dbi_connect {
my $self = shift;
$self->{dbh}->func(5000, 'busy_timeout');
$self->{lock_depth} = 0;
}
sub want_raise_errors { 1 }
sub dsn_of_dbhost {
my ($class, $dbname, $host) = @_;
return "DBI:SQLite:$dbname";
}
sub dsn_of_root {
my ($class, $dbname, $host) = @_;
return "DBI:SQLite:$dbname";
}
sub can_replace { 1 }
sub can_insertignore { 0 }
sub can_for_update { 0 }
sub unix_timestamp { "strftime('%s','now')" }
sub init {
my $self = shift;
$self->SUPER::init;
$self->{lock_depth} = 0;
}
# DBD::SQLite doesn't really have any table meta info methods
# And PRAGMA table_info() does not return "real" rows
sub column_type {
my ($self, $table, $col) = @_;
my $sth = $self->dbh->prepare("PRAGMA table_info($table)");
$sth->execute;
while (my $rec = $sth->fetchrow_arrayref) {
if ($rec->[1] eq $col) {
$sth->finish;
return $rec->[2];
}
}
return undef;
}
sub lockid {
my ($lockname) = @_;
croak("Called with empty lockname! $lockname") unless (defined $lockname && length($lockname) > 0);
my $num = unpack 'N',md5($lockname);
return ($num & 0x7fffffff);
}
# returns 1 if the lock holder is still alive, 0 if lock holder died
sub lock_holder_alive {
my ($self, $lockid, $lockname) = @_;
my $max_age = 3600;
my $force_unlock;
my $dbh = $self->dbh;
my ($hostname, $pid, $acquiredat) = $dbh->selectrow_array('SELECT hostname,pid,acquiredat FROM lock WHERE lockid = ?', undef, $lockid);
# maybe the lock was _just_ released
return 0 unless defined $pid;
( run in 0.823 second using v1.01-cache-2.11-cpan-39bf76dae61 )