|
Luc Didry |
d909b8 |
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
|
Luc Didry |
d909b8 |
package Lufi::DB::File;
|
|
Luc Didry |
d909b8 |
use Mojo::Base -base;
|
|
Luc Didry |
d909b8 |
use Mojo::Collection;
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
has 'short';
|
|
Luc Didry |
d909b8 |
has 'deleted' => 0;
|
|
Luc Didry |
d909b8 |
has 'mediatype';
|
|
Luc Didry |
d909b8 |
has 'filename';
|
|
Luc Didry |
d909b8 |
has 'filesize';
|
|
Luc Didry |
d909b8 |
has 'counter' => 0;
|
|
Luc Didry |
d909b8 |
has 'delete_at_first_view' => 0;
|
|
Luc Didry |
d909b8 |
has 'delete_at_day';
|
|
Luc Didry |
d909b8 |
has 'created_at' => sub {
|
|
Luc Didry |
d909b8 |
return time;
|
|
Luc Didry |
d909b8 |
};
|
|
Luc Didry |
d909b8 |
has 'created_by';
|
|
Luc Didry |
d909b8 |
has 'last_access_at';
|
|
Luc Didry |
d909b8 |
has 'mod_token';
|
|
Luc Didry |
d909b8 |
has 'nbslices';
|
|
Luc Didry |
d909b8 |
has 'complete' => 0;
|
|
Luc Didry |
d909b8 |
has 'slices' => sub {
|
|
Luc Didry |
d909b8 |
return Mojo::Collection->new();
|
|
Luc Didry |
d909b8 |
};
|
|
Luc Didry |
d909b8 |
has 'passwd';
|
|
Luc Didry |
d909b8 |
has 'app';
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head1 NAME
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
Lufi::DB::File - DB abstraction layer for Lufi file
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head1 Contributing
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
When creating a new database accessor, make sure that it provides the following subroutines.
|
|
Luc Didry |
d909b8 |
After that, modify this file and modify the C<new> subroutine to allow to use your accessor.
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
Have a look at Lufi::DB::File::SQLite's code: it's simple and may be more understandable that this doc.
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head1 Attributes
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<short> : string
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<deleted> : boolean
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<mediatype> : string
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<filename> : string
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<filesize> : integer
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<counter> : integer
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<delete_at_first_view> : boolean
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<delete_at_day> : integer
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<created_at> : unix timestamp
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<created_by> : string
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<last_access_at> : unix timestamp
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<mod_token> : string
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<nbslices> : integer
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<complete> : boolean
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<slices> : Mojo::Collection of Lufi::DB::Slice
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<passwd> : string
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<app> : a Mojolicious object
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head1 Sub routines
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 new
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c = Lufi::DB::File-E<gt>new(app =E<gt> $self);>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : any of the attribute above
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : construct a new db accessor object. If the C<short> attribute is provided, it have to load the informations from the database.
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : the db accessor object
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Info> : the app argument is used by Lufi::DB::File to choose which db accessor will be used, you don't need to use it in new(), but you can use it to access helpers or configuration settings in the other subroutines
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=cut
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
sub new {
|
|
Luc Didry |
d909b8 |
my $c = shift;
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
$c = $c->SUPER::new(@_);
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
if (ref($c) eq 'Lufi::DB::File') {
|
|
Luc Didry |
d909b8 |
my $dbtype = $c->app->config('dbtype');
|
|
Luc Didry |
d909b8 |
if ($dbtype eq 'sqlite') {
|
|
Luc Didry |
d909b8 |
use Lufi::DB::File::SQLite;
|
|
Luc Didry |
d909b8 |
$c = Lufi::DB::File::SQLite->new(@_);
|
|
Luc Didry |
18499a |
} elsif ($dbtype eq 'postgresql') {
|
|
Luc Didry |
18499a |
use Lufi::DB::File::Pg;
|
|
Luc Didry |
18499a |
$c = Lufi::DB::File::Pg->new(@_);
|
|
Luc Didry |
d909b8 |
}
|
|
Luc Didry |
d909b8 |
}
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
return $c;
|
|
Luc Didry |
d909b8 |
}
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 delete
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>delet>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : none
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : delete the files of the slices and the directory containing those files, then update the object by setting the deleted attribute to 1 (true)
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : the db accessor object
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=cut
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
sub delete {
|
|
Luc Didry |
d909b8 |
my $c = shift;
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
$c->slices->each(sub {
|
|
Luc Didry |
d909b8 |
my ($e, $num) = @_;
|
|
Luc Didry |
d909b8 |
unlink $e->path;
|
|
Luc Didry |
d909b8 |
});
|
|
Luc Didry |
d909b8 |
rmdir Mojo::File->new($c->app->config('upload_dir'), $c->short);
|
|
Luc Didry |
d909b8 |
$c->deleted(1);
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
$c->write;
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
return $c;
|
|
Luc Didry |
d909b8 |
}
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 write
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>write>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : none
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : create or update a record in the database, with the values of the object's attributes
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : the db accessor object
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 count_empty
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>count_empty>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : none
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : count how many records have a null created_at column
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : integer
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 already_exists
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>already_exists($short)>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : a string
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : check if the given string is already used as short attribute for a file
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : 1 or 0
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 get_empty
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>get_empty>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : none
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : select an empty ready-to-use record from the database
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : a db accessor object
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 get_stats
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>get_stats>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : none
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : get stats about how many empty files, deleted files and non-deleted files there is in the database
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : a hash table reference containing three keys: files, deleted and empty
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 from_short
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>from_short($short)>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : string
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : find a file in the database from its short attribute
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : a db accessor object
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 get_oldest_undeleted_files
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>get_oldest_undeleted_files($num)>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : integer
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : get the X oldest non-deleted files
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : a Mojo::Collection of Lufi::DB::File objects
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 get_expired
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>get_expired($time)>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : unix timestamp
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : get the non-deleted files that are expired at the given timestamp minus 2 days
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : a Mojo::Collection of Lufi::DB::File objects
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 get_no_longer_viewed
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>get_no_longer_viewed($time)>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : unix timestamp
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : get the files that have not been viewed after the given timestamp
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : a Mojo::Collection of Lufi::DB::File objects
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=head2 delete_creator_before
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=over 1
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Usage> : C<$c-E<gt>delete_creator_before($time)>
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Arguments> : unix timestamp
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Purpose> : empty the created_by column for files created before the given timestamp
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=item B<Returns> : nothing
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=back
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
=cut
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
1;
|