# 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;