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;