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