Luc Didry 18499a
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
Luc Didry 18499a
package Lufi::DB::File::Pg;
Luc Didry 18499a
use Mojo::Base 'Lufi::DB::File';
Luc Didry 18499a
use Mojo::File;
Luc Didry 18499a
use Mojo::Collection 'c';
Luc Didry 18499a
use Lufi::DB::Slice;
Luc Didry 18499a
Luc Didry 18499a
has 'record' => 0;
Luc Didry 18499a
Luc Didry 18499a
sub new {
Luc Didry 18499a
    my $c = shift;
Luc Didry 18499a
Luc Didry 18499a
    $c = $c->SUPER::new(@_);
Luc Didry 18499a
Luc Didry 18499a
    return $c;
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub write {
Luc Didry 18499a
    my $c = shift;
Luc Didry 18499a
Luc Didry 18499a
    if ($c->record) {
Luc Didry 18499a
        $c->app->pg->db->query('UPDATE files SET short = ?, deleted = ?, mediatype = ?, filename = ?, filesize = ?, counter = ?, delete_at_first_view = ?, delete_at_day = ?, created_at = ?, created_by = ?, last_access_at = ?, mod_token = ?, nbslices = ?, complete = ?, passwd = ? WHERE short = ?', $c->short, $c->deleted, $c->mediatype, $c->filename, $c->filesize, $c->counter, $c->delete_at_first_view, $c->delete_at_day, $c->created_at, $c->created_by, $c->last_access_at, $c->mod_token, $c->nbslices, $c->complete, $c->passwd, $c->short);
Luc Didry 18499a
    } else {
Luc Didry 18499a
        $c->app->pg->db->query('INSERT INTO files (short, deleted, mediatype, filename, filesize, counter, delete_at_first_view, delete_at_day, created_at, created_by, last_access_at, mod_token, nbslices, complete, passwd) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $c->short, $c->deleted, $c->mediatype, $c->filename, $c->filesize, $c->counter, $c->delete_at_first_view, $c->delete_at_day, $c->created_at, $c->created_by, $c->last_access_at, $c->mod_token, $c->nbslices, $c->complete, $c->passwd);
Luc Didry 18499a
        $c->record(1);
Luc Didry 18499a
    }
Luc Didry 18499a
Luc Didry 18499a
    return $c;
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub count_empty {
Luc Didry 18499a
    my $c = shift;
Luc Didry 18499a
Luc Didry 18499a
    return $c->app->pg->db->query('SELECT count(short) FROM files WHERE created_at IS NULL')->hashes->first->{count};
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub already_exists {
Luc Didry 18499a
    my $c     = shift;
Luc Didry 18499a
    my $short = shift;
Luc Didry 18499a
Luc Didry 18499a
    return $c->app->pg->db->query('SELECT count(short) FROM files WHERE short = ?', $short)->hashes->first->{count};
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub get_empty {
Luc Didry 18499a
    my $c     = shift;
Luc Didry 18499a
Luc Didry 18499a
    my $r = $c->app->pg->db->query('SELECT * FROM files WHERE created_at IS NULL')->hashes->shuffle->first;
Luc Didry 18499a
Luc Didry 18499a
    return $c->_slurp($r)->created_at(time)->write;
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub get_stats {
Luc Didry 18499a
    my $c = shift;
Luc Didry 18499a
Luc Didry 9c62d4
    my $files   = $c->app->pg->db->query('SELECT count(short) FROM files WHERE created_at IS NOT null AND deleted = false')->hashes->first->{count};
Luc Didry 9c62d4
    my $deleted = $c->app->pg->db->query('SELECT count(short) FROM files WHERE created_at IS NOT null AND deleted = true')->hashes->first->{count};
Luc Didry 18499a
    my $empty   = $c->app->pg->db->query('SELECT count(short) FROM files WHERE created_at IS null')->hashes->first->{count};
Luc Didry 18499a
Luc Didry 18499a
    return { files => $files, deleted => $deleted, empty => $empty };
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub from_short {
Luc Didry 18499a
    my $c     = shift;
Luc Didry 18499a
    my $short = shift;
Luc Didry 18499a
Luc Didry 18499a
    my $r = $c->app->pg->db->query('SELECT * FROM files WHERE short = ?', $short)->hashes;
Luc Didry 18499a
Luc Didry 18499a
    if ($r->size) {
Luc Didry 18499a
        return $c->_slurp($r->first)->record(1);
Luc Didry 18499a
    } else {
Luc Didry 18499a
        return undef;
Luc Didry 18499a
    }
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub get_oldest_undeleted_files {
Luc Didry 18499a
    my $c   = shift;
Luc Didry 18499a
    my $num = shift;
Luc Didry 18499a
Luc Didry 18499a
    my @files;
Luc Didry 9c62d4
    my $records = $c->app->pg->db->query('SELECT * FROM files WHERE deleted = false ORDER BY created_at ASC LIMIT ?', $num)->hashes;
Luc Didry 18499a
    $records->each(
Luc Didry 18499a
        sub {
Luc Didry 18499a
            my ($e, $num) = @_;
Luc Didry 18499a
            my $i = Lufi::DB::File->new(app => $c->app);
Luc Didry 18499a
Luc Didry 18499a
            push @files, $i->_slurp($e);
Luc Didry 18499a
        }
Luc Didry 18499a
    );
Luc Didry 18499a
Luc Didry 18499a
    return c(@files);
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub get_expired {
Luc Didry 18499a
    my $c    = shift;
Luc Didry 18499a
    my $time = shift;
Luc Didry 18499a
Luc Didry 18499a
    my @files;
Luc Didry 18499a
    ## Select only files expired since two days, to be sure that nobody is still downloading it
Luc Didry 9c62d4
    my $records = $c->app->pg->db->query('SELECT * FROM files WHERE deleted = false AND ((delete_at_day + 2) * 86400) < (? - created_at) AND delete_at_day != 0', $time)->hashes;
Luc Didry 18499a
    $records->each(
Luc Didry 18499a
        sub {
Luc Didry 18499a
            my ($e, $num) = @_;
Luc Didry 18499a
            my $i = Lufi::DB::File->new(app => $c->app);
Luc Didry 18499a
Luc Didry 18499a
            push @files, $i->_slurp($e);
Luc Didry 18499a
        }
Luc Didry 18499a
    );
Luc Didry 18499a
Luc Didry 18499a
    return c(@files);
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub get_no_longer_viewed {
Luc Didry 18499a
    my $c    = shift;
Luc Didry 18499a
    my $time = shift;
Luc Didry 18499a
Luc Didry 18499a
    my @files;
Luc Didry 9c62d4
    my $records = $c->app->pg->db->query('SELECT * FROM files WHERE deleted = false AND last_access_at < ?', $time)->hashes;
Luc Didry 18499a
    $records->each(
Luc Didry 18499a
        sub {
Luc Didry 18499a
            my ($e, $num) = @_;
Luc Didry 18499a
            my $i = Lufi::DB::File->new(app => $c->app);
Luc Didry 18499a
Luc Didry 18499a
            push @files, $i->_slurp($e);
Luc Didry 18499a
        }
Luc Didry 18499a
    );
Luc Didry 18499a
Luc Didry 18499a
    return c(@files);
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub delete_creator_before {
Luc Didry 18499a
    my $c          = shift;
Luc Didry 18499a
    my $separation = shift;
Luc Didry 18499a
Luc Didry 18499a
    $c->app->pg->db->query('UPDATE files SET created_by = NULL WHERE created_by IS NOT NULL AND created_at < ?', $separation);
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
sub _slurp {
Luc Didry 18499a
    my $c = shift;
Luc Didry 18499a
    my $r = shift;
Luc Didry 18499a
Luc Didry 18499a
    my $file;
Luc Didry 18499a
    if (defined $r) {
Luc Didry 18499a
        $file = $r;
Luc Didry 18499a
    } else {
Luc Didry 18499a
        my $files = $c->app->pg->db->query('SELECT * FROM files WHERE short = ?', $c->short)->hashes;
Luc Didry 18499a
Luc Didry 18499a
        if ($files->size) {
Luc Didry 18499a
            $file = $files->first;
Luc Didry 18499a
        }
Luc Didry 18499a
    }
Luc Didry 18499a
Luc Didry 18499a
    if ($file) {
Luc Didry 18499a
        $c->short($file->{short});
Luc Didry 18499a
        $c->deleted($file->{deleted});
Luc Didry 18499a
        $c->mediatype($file->{mediatype});
Luc Didry 18499a
        $c->filename($file->{filename});
Luc Didry 18499a
        $c->filesize($file->{filesize});
Luc Didry 18499a
        $c->counter($file->{counter});
Luc Didry 18499a
        $c->delete_at_first_view($file->{delete_at_first_view});
Luc Didry 18499a
        $c->delete_at_day($file->{delete_at_day});
Luc Didry 18499a
        $c->created_at($file->{created_at});
Luc Didry 18499a
        $c->created_by($file->{created_by});
Luc Didry 18499a
        $c->last_access_at($file->{last_access_at});
Luc Didry 18499a
        $c->mod_token($file->{mod_token});
Luc Didry 18499a
        $c->nbslices($file->{nbslices});
Luc Didry 18499a
        $c->complete($file->{complete});
Luc Didry 18499a
        $c->passwd($file->{passwd});
Luc Didry 18499a
Luc Didry 18499a
        $c->record(1) unless $c->record;
Luc Didry 18499a
    }
Luc Didry 18499a
Luc Didry 18499a
    $c->slices(Lufi::DB::Slice->new(app => $c->app)->get_slices_of_file($c->short));
Luc Didry 18499a
Luc Didry 18499a
    return $c;
Luc Didry 18499a
}
Luc Didry 18499a
Luc Didry 18499a
1;