MogileFS-Plugin-FileRefs
view release on metacpan or search on metacpan
lib/MogileFS/Plugin/FileRefs.pm view on Meta::CPAN
my ($query, $args) = @_;
my $dbh = Mgd::validate_dbh();
my $dmid = $query->check_domain($args) or return;
local $@;
my $deleted = eval { $dbh->do("DELETE FROM file_ref WHERE dmid = ? AND dkey = ? AND ref = ?", {}, $dmid, $args->{arg1}, $args->{arg2}) };
if ($@ || $dbh->err) {
return $query->err_line("del_file_ref_fail");
}
return $query->ok_line({deleted_ref => $deleted>0 ? 1:0 });
}
# TODO - use a stored procedure.
sub rename_if_no_refs {
my ($query, $args) = @_;
my $dbh = Mgd::validate_dbh();
my $dmid = $query->check_domain($args) or return;
_claim_lock($query, $args) or return $query->err_line("get_key_lock_fail");
my ($count) = eval { $dbh->selectrow_array("SELECT COUNT(*) FROM file_ref WHERE dmid = ? AND dkey = ?", {}, $dmid, $args->{arg1}) };
if ($@ || $dbh->err) {
_free_lock($query, $args);
return $query->err_line("rename_if_no_refs_failed");
}
if ($count != 0) {
_free_lock($query, $args);
return $query->ok_line({files_outstanding => $count});
}
my $updated = eval { $dbh->do("UPDATE file SET dkey = ? WHERE dmid = ? AND dkey = ?", {}, $args->{arg2}, $dmid, $args->{arg1}); };
if ($@ || $dbh->err) {
_free_lock($query, $args);
return $query->err_line("rename_if_no_refs_failed");
}
_free_lock($query, $args);
return $query->ok_line({files_outstanding => 0, updated => $updated+0});
}
sub list_refs_for_dkey {
my ($query, $args) = @_;
my $dmid = $query->check_domain($args) or return;
my $dbh = Mgd::validate_dbh();
my $result = eval {
$dbh->selectcol_arrayref("SELECT ref FROM file_ref WHERE dmid = ? AND dkey = ?", {}, $dmid, $args->{arg1});
};
if ($@ || $dbh->err) {
return $query->err_line("list_refs_for_dkey_failed");
}
my $i;
return $query->ok_line({
total => scalar(@$result),
map { "ref_".$i++ => $_ } @{ $result }
});
}
sub update_schema {
my $store = Mgd::get_store();
my $dbh = $store->dbh();
$dbh->do($store->filter_create_sql(TABLE_fileref()))
or die "Failed to create table file_ref: ". $dbh->errstr;
return;
}
BEGIN {
*MogileFS::Store::TABLE_file_ref = sub {
q{CREATE TABLE `file_ref` (
`dmid` SMALLINT UNSIGNED NOT NULL,
`dkey` varchar(255) DEFAULT NULL,
`ref` varchar(255) DEFAULT NULL,
UNIQUE KEY `i_unique` (`dmid`,`dkey`,`ref`)
);
};
};
}
1;
__END__
=head1 NAME
MogileFS::Plugin::FileRefs - MogileFS extension
=head1 DESCRIPTION
This module provides MogileFS with additional functionality to keep track of
multiple uses of an individual dkey. This may be useful for implementing
de-duplication in your application.
=head2 Mogile commands
=over
=item add_file_ref
Takes domain id, dkey, and your reference as arguments.
Creates an association from a key to your reference.
=item del_file_ref
Takes domain id, dkey, and your reference as arguments.
Deletes an association from a key to your reference.
=item rename_if_no_refs
Takes domain id, old dkey and new dkey.
Atomically renames a dkey provided there are no references to it.
=item list_refs_for_dkey
Takes domain id, dkey.
( run in 2.265 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )