Luc Didry d909b8
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
Luc Didry d909b8
package Lufi::DB::File::SQLite;
Luc Didry d909b8
use Mojo::Base 'Lufi::DB::File';
Luc Didry d909b8
use Mojo::File;
Luc Didry d909b8
use Mojo::Collection 'c';
Luc Didry d909b8
use Lufi::DB::SQLite;
Luc Didry d909b8
use Lufi::DB::Slice;
Luc Didry d909b8
Luc Didry d909b8
has 'record';
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
    $c = $c->_slurp if defined $c->record;
Luc Didry d909b8
Luc Didry d909b8
    return $c;
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub write {
Luc Didry d909b8
    my $c = shift;
Luc Didry d909b8
Luc Didry d909b8
    if (defined $c->record) {
Luc Didry d909b8
        $c->record->update(
Luc Didry d909b8
            short                => $c->short,
Luc Didry d909b8
            deleted              => $c->deleted,
Luc Didry d909b8
            mediatype            => $c->mediatype,
Luc Didry d909b8
            filename             => $c->filename,
Luc Didry d909b8
            filesize             => $c->filesize,
Luc Didry d909b8
            counter              => $c->counter,
Luc Didry d909b8
            delete_at_first_view => $c->delete_at_first_view,
Luc Didry d909b8
            delete_at_day        => $c->delete_at_day,
Luc Didry d909b8
            created_at           => $c->created_at,
Luc Didry d909b8
            created_by           => $c->created_by,
Luc Didry d909b8
            last_access_at       => $c->last_access_at,
Luc Didry d909b8
            mod_token            => $c->mod_token,
Luc Didry d909b8
            nbslices             => $c->nbslices,
Luc Didry d909b8
            complete             => $c->complete,
Luc Didry d909b8
            passwd               => $c->passwd,
Luc Didry d909b8
        );
Luc Didry d909b8
    } else {
Luc Didry d909b8
        my $record = Lufi::DB::SQLite::Files->create(
Luc Didry d909b8
            short                => $c->short,
Luc Didry d909b8
            deleted              => $c->deleted,
Luc Didry d909b8
            mediatype            => $c->mediatype,
Luc Didry d909b8
            filename             => $c->filename,
Luc Didry d909b8
            filesize             => $c->filesize,
Luc Didry d909b8
            counter              => $c->counter,
Luc Didry d909b8
            delete_at_first_view => $c->delete_at_first_view,
Luc Didry d909b8
            delete_at_day        => $c->delete_at_day,
Luc Didry d909b8
            created_at           => $c->created_at,
Luc Didry d909b8
            created_by           => $c->created_by,
Luc Didry d909b8
            last_access_at       => $c->last_access_at,
Luc Didry d909b8
            mod_token            => $c->mod_token,
Luc Didry d909b8
            nbslices             => $c->nbslices,
Luc Didry d909b8
            complete             => $c->complete,
Luc Didry d909b8
            passwd               => $c->passwd,
Luc Didry d909b8
        );
Luc Didry d909b8
        $c->record($record);
Luc Didry d909b8
    }
Luc Didry d909b8
Luc Didry d909b8
    return $c;
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub count_empty {
Luc Didry d909b8
    my $c = shift;
Luc Didry d909b8
Luc Didry d909b8
    return Lufi::DB::SQLite::Files->count('WHERE created_at IS NULL');
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub already_exists {
Luc Didry d909b8
    my $c     = shift;
Luc Didry d909b8
    my $short = shift;
Luc Didry d909b8
Luc Didry d909b8
    return Lufi::DB::SQLite::Files->count('WHERE short = ?', $short);
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub get_empty {
Luc Didry d909b8
    my $c     = shift;
Luc Didry d909b8
Luc Didry d909b8
    my @records = Lufi::DB::SQLite::Files->select('WHERE created_at IS NULL LIMIT 1');
Luc Didry d909b8
Luc Didry d5395f
    return $c->record($records[0])->_slurp->created_at(time)->write;
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub get_stats {
Luc Didry d909b8
    my $c = shift;
Luc Didry d909b8
Luc Didry d909b8
    my $files   = Lufi::DB::SQLite::Files->count('WHERE created_at IS NOT null AND deleted = 0');
Luc Didry d909b8
    my $deleted = Lufi::DB::SQLite::Files->count('WHERE created_at IS NOT null AND deleted = 1');
Luc Didry d909b8
    my $empty   = Lufi::DB::SQLite::Files->count('WHERE created_at IS null');
Luc Didry d909b8
Luc Didry 18499a
    return { files => $files, deleted => $deleted, empty => $empty };
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub from_short {
Luc Didry d909b8
    my $c     = shift;
Luc Didry d909b8
    my $short = shift;
Luc Didry d909b8
Luc Didry d909b8
    my @records = Lufi::DB::SQLite::Files->select('WHERE short = ?', $short);
Luc Didry d909b8
Luc Didry d909b8
    if (scalar @records) {
Luc Didry d909b8
        $c->record($records[0]);
Luc Didry d909b8
        $c->_slurp;
Luc Didry d909b8
Luc Didry d909b8
        return $c;
Luc Didry d909b8
    } else {
Luc Didry d909b8
        return undef;
Luc Didry d909b8
    }
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub get_oldest_undeleted_files {
Luc Didry d909b8
    my $c   = shift;
Luc Didry d909b8
    my $num = shift;
Luc Didry d909b8
Luc Didry d909b8
    my @files = Lufi::DB::SQLite::Files->select('WHERE deleted = 0 ORDER BY created_at ASC LIMIT ?', $num);
Luc Didry d909b8
Luc Didry d909b8
    return c(map { Lufi::DB::File->new(app => $c->app, record => $_) } @files);
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub get_expired {
Luc Didry d909b8
    my $c    = shift;
Luc Didry d909b8
    my $time = shift;
Luc Didry d909b8
Luc Didry d909b8
    ## Select only files expired since two days, to be sure that nobody is still downloading it
Luc Didry d909b8
    my @files = LufiDB::Files->select('WHERE deleted = 0 AND ((delete_at_day + 2) * 86400) < (? - created_at) AND delete_at_day != 0', $time);
Luc Didry d909b8
Luc Didry d909b8
    return c(map { Lufi::DB::File->new(app => $c->app, record => $_) } @files);
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub get_no_longer_viewed {
Luc Didry d909b8
    my $c    = shift;
Luc Didry d909b8
    my $time = shift;
Luc Didry d909b8
Luc Didry d909b8
    my @files = LufiDB::Files->select('WHERE deleted = 0 AND last_access_at < ?', $time);
Luc Didry d909b8
Luc Didry d909b8
    return c(map { Lufi::DB::File->new(app => $c->app, record => $_) } @files);
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub delete_creator_before {
Luc Didry d909b8
    my $c          = shift;
Luc Didry d909b8
    my $separation = shift;
Luc Didry d909b8
Luc Didry d909b8
    Lufi::DB::SQLite->do(
Luc Didry d909b8
        'UPDATE files SET created_by = NULL WHERE created_by IS NOT NULL AND created_at < ?',
Luc Didry d909b8
        {},
Luc Didry d909b8
        $separation
Luc Didry d909b8
    );
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
sub _slurp {
Luc Didry d909b8
    my $c = shift;
Luc Didry d909b8
Luc Didry d909b8
    my @files;
Luc Didry d909b8
    if ($c->record) {
Luc Didry d909b8
        @files = ($c->record);
Luc Didry d909b8
    } elsif ($c->short) {
Luc Didry d909b8
        @files = Lufi::DB::SQLite::Files->select('WHERE short = ?', $c->short);
Luc Didry d909b8
    }
Luc Didry d909b8
Luc Didry d909b8
    if (scalar @files) {
Luc Didry d909b8
        my $file = $files[0];
Luc Didry d909b8
Luc Didry d909b8
        $c->short($file->short);
Luc Didry d909b8
        $c->deleted($file->deleted)                           if defined $file->deleted;
Luc Didry d909b8
        $c->mediatype($file->mediatype)                       if defined $file->mediatype;
Luc Didry d909b8
        $c->filename($file->filename)                         if defined $file->filename;
Luc Didry d909b8
        $c->filesize($file->filesize)                         if defined $file->filesize;
Luc Didry d909b8
        $c->counter($file->counter)                           if defined $file->counter;
Luc Didry d909b8
        $c->delete_at_first_view($file->delete_at_first_view) if defined $file->delete_at_first_view;
Luc Didry d909b8
        $c->delete_at_day($file->delete_at_day)               if defined $file->delete_at_day;
Luc Didry d909b8
        $c->created_at($file->created_at)                     if defined $file->created_at;
Luc Didry d909b8
        $c->created_by($file->created_by)                     if defined $file->created_by;
Luc Didry d909b8
        $c->last_access_at($file->last_access_at)             if defined $file->last_access_at;
Luc Didry d909b8
        $c->mod_token($file->mod_token)                       if defined $file->mod_token;
Luc Didry d909b8
        $c->nbslices($file->nbslices)                         if defined $file->nbslices;
Luc Didry d909b8
        $c->complete($file->complete)                         if defined $file->complete;
Luc Didry d909b8
        $c->passwd($file->passwd)                             if defined $file->passwd;
Luc Didry d909b8
Luc Didry d909b8
        $c->record($file) unless $c->record;
Luc Didry d909b8
    }
Luc Didry d909b8
Luc Didry d909b8
    $c->slices(Lufi::DB::Slice->new(app => $c->app)->get_slices_of_file($c->short));
Luc Didry d909b8
Luc Didry d909b8
    return $c;
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry d909b8
1;