├── CHANGES ├── MANIFEST.SKIP ├── MANIFEST ├── .shipit ├── Makefile.PL ├── MogileFS-Plugin-MetaData.spec └── lib └── MogileFS └── Plugin └── MetaData.pm /CHANGES: -------------------------------------------------------------------------------- 1 | 0.01 2 | -- Initial module creation. 3 | -------------------------------------------------------------------------------- /MANIFEST.SKIP: -------------------------------------------------------------------------------- 1 | ^\.shipit$ 2 | ^Makefile$ 3 | ^MANIFEST\.bak$ 4 | -------------------------------------------------------------------------------- /MANIFEST: -------------------------------------------------------------------------------- 1 | CHANGES 2 | lib/MogileFS/Plugin/MetaData.pm 3 | Makefile.PL 4 | MANIFEST This list of files 5 | MANIFEST.SKIP 6 | MogileFS-Plugin-MetaData.spec 7 | -------------------------------------------------------------------------------- /.shipit: -------------------------------------------------------------------------------- 1 | # auto-generated shipit config file. 2 | steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN 3 | 4 | svk.tagpattern = MogileFS-Plugin-MetaData-%v 5 | 6 | # CheckChangeLog.files = ChangeLog, MyProj.CHANGES 7 | -------------------------------------------------------------------------------- /Makefile.PL: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use ExtUtils::MakeMaker; 4 | 5 | WriteMakefile( 6 | NAME => 'MogileFS-Plugin-MetaData', 7 | VERSION_FROM => 'lib/MogileFS/Plugin/MetaData.pm', 8 | AUTHOR => 'Jonathan Steinert ', 9 | ABSTRACT => 'Plugin for mogilefs server to store arbitrary metadata with a particular fid..', 10 | PREREQ_PM => { 11 | 'MogileFS::Server' => '2.08', 12 | }, 13 | ); 14 | 15 | -------------------------------------------------------------------------------- /MogileFS-Plugin-MetaData.spec: -------------------------------------------------------------------------------- 1 | name: perl-MogileFS-Plugin-MetaData 2 | summary: perl-MogileFS-Plugin-MetaData - MogileFS Tracker plugin to store extra metadata along with a particular file. 3 | version: 0.01 4 | release: 1 5 | vendor: Jonathan Steinert 6 | packager: Jonathan Steinert 7 | license: Artistic 8 | group: Applications/CPAN 9 | buildroot: %{_tmppath}/%{name}-%{version}-%(id -u -n) 10 | buildarch: noarch 11 | source: MogileFS-Plugin-MetaData-%{version}.tar.gz 12 | requires: perl-MogileFS-Plugin-MetaData 13 | 14 | %description 15 | MogileFS Tracker plugin to store extra metadata along with a particular file. 16 | 17 | %prep 18 | rm -rf "%{buildroot}" 19 | %setup -n MogileFS-Plugin-MetaData-%{version} 20 | 21 | %build 22 | %{__perl} Makefile.PL PREFIX=%{buildroot}%{_prefix} 23 | make all 24 | make test 25 | 26 | %install 27 | make pure_install 28 | 29 | [ -x /usr/lib/rpm/brp-compress ] && /usr/lib/rpm/brp-compress 30 | 31 | 32 | # remove special files 33 | find %{buildroot} \( \ 34 | -name "perllocal.pod" \ 35 | -o -name ".packlist" \ 36 | -o -name "*.bs" \ 37 | \) -exec rm -f {} \; 38 | 39 | # no empty directories 40 | find %{buildroot}%{_prefix} \ 41 | -type d -depth -empty \ 42 | -exec rmdir {} \; 43 | 44 | %clean 45 | [ "%{buildroot}" != "/" ] && rm -rf %{buildroot} 46 | 47 | %files 48 | %defattr(-,root,root) 49 | %{_prefix}/lib/* 50 | -------------------------------------------------------------------------------- /lib/MogileFS/Plugin/MetaData.pm: -------------------------------------------------------------------------------- 1 | package MogileFS::Plugin::MetaData; 2 | 3 | use strict; 4 | use warnings; 5 | 6 | our $VERSION = '0.01'; 7 | $VERSION = eval $VERSION; 8 | 9 | my %name_to_nameid; 10 | my %nameid_to_name; 11 | 12 | sub load { 13 | return 1; 14 | } 15 | 16 | sub unload { 17 | return 1; 18 | } 19 | 20 | sub delete_metadata { 21 | my ($fid) = @_; 22 | 23 | my $dbh = Mgd::get_dbh(); 24 | 25 | $dbh->do('DELETE FROM plugin_metadata_data WHERE fid=?', undef, $fid); 26 | 27 | warn "DBI Error while deleting fid '$fid': " . $dbh->errstr if $dbh->err; 28 | } 29 | 30 | sub get_metadata { 31 | my ($fid) = @_; 32 | 33 | my $dbh = Mgd::get_dbh(); 34 | 35 | my $meta_by_name = {}; 36 | 37 | my $sth = $dbh->prepare('SELECT nameid, data FROM plugin_metadata_data WHERE fid=?'); 38 | 39 | $sth->execute($fid); 40 | 41 | die "DBH Error on SELECT: " . $dbh->errstr if $dbh->err; 42 | 43 | while (my ($nameid, $data) = $sth->fetchrow_array) { 44 | my $name = $nameid_to_name{$nameid}; 45 | unless (exists $nameid_to_name{$nameid}) { 46 | ($name) = $dbh->selectrow_array('SELECT name FROM plugin_metadata_names WHERE nameid=?', undef, $nameid); 47 | die "DBH Error while getting nameid->name mapping: " . $dbh->errstr if $dbh->err; 48 | $nameid_to_name{$nameid} = $name; 49 | $name_to_nameid{$name} = $nameid; 50 | } 51 | $meta_by_name->{$name} = $data; 52 | } 53 | 54 | return $meta_by_name; 55 | } 56 | 57 | sub set_metadata { 58 | my ($fid, $meta_by_name) = @_; 59 | 60 | my $dbh = Mgd::get_dbh(); 61 | 62 | my $meta_by_nameid = {}; 63 | 64 | # Flag indicating if we've inserted and decided to redo the loop, to prevent infinite loops. 65 | my $inserted = 0; 66 | 67 | foreach my $name (keys %$meta_by_name) { 68 | my $nameid = $name_to_nameid{$name}; 69 | 70 | unless (exists $name_to_nameid{$name}) { 71 | ($nameid) = $dbh->selectrow_array('SELECT nameid FROM plugin_metadata_names WHERE name=?', undef, $name); 72 | warn "DBH Error on SELECT: " . $dbh->errstr if $dbh->err; 73 | $nameid_to_name{$nameid} = $name; 74 | $name_to_nameid{$name} = $nameid; 75 | } 76 | 77 | if ($inserted && ! $nameid) { 78 | die "Bailing out, unable to get a metadata nameid for '$name'"; 79 | } 80 | 81 | unless ($nameid) { 82 | $dbh->do('INSERT IGNORE INTO plugin_metadata_names (name) VALUES (?)', undef, $name); 83 | warn "DBH Error on insert: " . $dbh->errstr if $dbh->err; 84 | $nameid = $dbh->{mysql_insertid}; 85 | 86 | unless ($nameid) { 87 | $inserted = 1; 88 | redo; 89 | } 90 | } 91 | 92 | $nameid += 0; 93 | 94 | $meta_by_nameid->{$nameid} = $meta_by_name->{$name}; 95 | } continue { 96 | $inserted = 0; 97 | } 98 | 99 | foreach my $nameid (keys %$meta_by_nameid) { 100 | $dbh->do('INSERT INTO plugin_metadata_data (fid, nameid, data) VALUES (?, ?, ?)', 101 | undef, $fid, $nameid, $meta_by_nameid->{$nameid}); 102 | warn "DBH Error on insert of metadata: " . $dbh->errstr if $dbh->err; 103 | } 104 | 105 | return 1; 106 | } 107 | 108 | package MogileFS::Store; 109 | 110 | use MogileFS::Store; 111 | 112 | use strict; 113 | use warnings; 114 | 115 | sub TABLE_plugin_metadata_names { " 116 | CREATE TABLE plugin_metadata_names ( 117 | nameid BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, 118 | name VARCHAR(255) NOT NULL, 119 | PRIMARY KEY (nameid) 120 | ) 121 | " } 122 | 123 | sub TABLE_plugin_metadata_data { " 124 | CREATE TABLE plugin_metadata_data ( 125 | fid BIGINT UNSIGNED NOT NULL, 126 | nameid BIGINT UNSIGNED NOT NULL, 127 | data VARCHAR(255) NOT NULL, 128 | PRIMARY KEY (fid, nameid) 129 | ) 130 | " } 131 | 132 | __PACKAGE__->add_extra_tables("plugin_metadata_names", "plugin_metadata_data"); 133 | 134 | 1; 135 | --------------------------------------------------------------------------------