mirror of
https://framagit.org/fiat-tux/hat-softwares/lutim.git
synced 2026-03-28 17:42:54 +01:00
278 lines
7.6 KiB
Perl
278 lines
7.6 KiB
Perl
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
|
package Lutim::DB::Image::SQLite;
|
|
use Mojo::Base 'Lutim::DB::Image';
|
|
use Mojo::Collection 'c';
|
|
|
|
has 'record' => 0;
|
|
|
|
sub new {
|
|
my $c = shift;
|
|
|
|
$c = $c->SUPER::new(@_);
|
|
$c = $c->_slurp if ($c->short);
|
|
|
|
return $c;
|
|
}
|
|
|
|
sub accessed {
|
|
my $c = shift;
|
|
my $time = shift;
|
|
|
|
$c->app->sqlite->db->query('UPDATE lutim SET counter = counter + 1, last_access_at = ? WHERE short = ?', $time, $c->short);
|
|
my $h = $c->app->sqlite->db->query('SELECT counter, last_access_at FROM lutim WHERE short = ?', $c->short)->hashes->first;
|
|
$c->counter($h->{counter});
|
|
$c->last_access_at($h->{last_access_at});
|
|
|
|
return $c;
|
|
}
|
|
|
|
sub count_delete_at_day_endis {
|
|
my $c = shift;
|
|
my $day = shift;
|
|
my $enabled = shift;
|
|
my $created = shift;
|
|
|
|
if (defined $created) {
|
|
return $c->app->sqlite->db->query('SELECT count(short) AS count FROM lutim WHERE path IS NOT NULL AND delete_at_day = ? AND enabled = ? AND created_at < ?', $day, $enabled, $created)->hashes->first->{count};
|
|
} else {
|
|
return $c->app->sqlite->db->query('SELECT count(short) AS count FROM lutim WHERE path IS NOT NULL AND delete_at_day = ? AND enabled = ?', $day, $enabled)->hashes->first->{count};
|
|
}
|
|
}
|
|
|
|
sub count_created_before {
|
|
my $c = shift;
|
|
my $time = shift;
|
|
|
|
return $c->app->sqlite->db->query('SELECT count(short) AS count FROM lutim WHERE path IS NOT NULL AND created_at < ?', $time)->hashes->first->{count};
|
|
}
|
|
|
|
sub select_created_after {
|
|
my $c = shift;
|
|
my $time = shift;
|
|
|
|
my @images;
|
|
|
|
my $records = $c->app->sqlite->db->query('SELECT * FROM lutim WHERE path IS NOT NULL AND created_at >= ?', $time)->hashes;
|
|
|
|
$records->each(
|
|
sub {
|
|
my ($e, $num) = @_;
|
|
my $i = Lutim::DB::Image->new(app => $c->app);
|
|
$i->_slurp($e);
|
|
|
|
push @images, $i;
|
|
}
|
|
);
|
|
|
|
return c(@images);
|
|
}
|
|
|
|
sub select_empty {
|
|
my $c = shift;
|
|
|
|
my $record = $c->app->sqlite->db->query('SELECT * FROM lutim WHERE path IS NULL')->hashes->shuffle->first;
|
|
$c->app->sqlite->db->query('UPDATE lutim SET path = ? WHERE short = ?', 'used', $record->{short});
|
|
|
|
$c = $c->_slurp($record);
|
|
|
|
return $c;
|
|
}
|
|
|
|
sub write {
|
|
my $c = shift;
|
|
my $provisioning = shift;
|
|
|
|
if ($c->record) {
|
|
$c->app->sqlite->db->query('UPDATE lutim SET counter = ?, created_at = ?, created_by = ?, delete_at_day = ?, delete_at_first_view = ?, enabled = ?, filename = ?, footprint = ?, height = ?, last_access_at = ?, mediatype = ?, mod_token = ?, path = ?, short = ?, width = ?, iv = ? WHERE short = ?', $c->counter, $c->created_at, $c->created_by, $c->delete_at_day, $c->delete_at_first_view, $c->enabled, $c->filename, $c->footprint, $c->height, $c->last_access_at, $c->mediatype, $c->mod_token, $c->path, $c->short, $c->width, $c->iv, $c->short);
|
|
} else {
|
|
my $query = 'INSERT INTO lutim (counter, created_at, created_by, delete_at_day, delete_at_first_view, enabled, filename, footprint, height, last_access_at, mediatype, mod_token, path, short, width, iv) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
|
|
$query .= ' ON CONFLICT DO NOTHING' if $provisioning;
|
|
$c->app->sqlite->db->query($query, $c->counter, $c->created_at, $c->created_by, $c->delete_at_day, $c->delete_at_first_view, $c->enabled, $c->filename, $c->footprint, $c->height, $c->last_access_at, $c->mediatype, $c->mod_token, $c->path, $c->short, $c->width, $c->iv);
|
|
$c->record(1);
|
|
}
|
|
|
|
return $c;
|
|
}
|
|
|
|
sub count_short {
|
|
my $c = shift;
|
|
my $short = shift;
|
|
|
|
return $c->app->sqlite->db->query('SELECT count(short) AS count FROM lutim WHERE short = ?', $short)->hashes->first->{count};
|
|
}
|
|
|
|
sub count_empty {
|
|
my $c = shift;
|
|
|
|
return $c->app->sqlite->db->query('SELECT count(short) AS count FROM lutim WHERE path IS NULL')->hashes->first->{count};
|
|
}
|
|
|
|
sub count_not_empty {
|
|
my $c = shift;
|
|
|
|
return $c->app->sqlite->db->query('SELECT count(short) AS count FROM lutim WHERE path IS NOT NULL')->hashes->first->{count};
|
|
}
|
|
|
|
sub clean_ips_until {
|
|
my $c = shift;
|
|
my $time = shift;
|
|
|
|
$c->app->sqlite->db->query('UPDATE lutim SET created_by = NULL WHERE path IS NOT NULL AND created_at < ?', $time);
|
|
|
|
return $c;
|
|
}
|
|
|
|
sub get_no_longer_viewed_files {
|
|
my $c = shift;
|
|
my $time = shift;
|
|
|
|
my @images;
|
|
|
|
my $records = $c->app->sqlite->db->query('SELECT * FROM lutim WHERE enabled = 1 AND last_access_at < ?', $time)->{hashes};
|
|
|
|
$records->each(
|
|
sub {
|
|
my ($e, $num) = @_;
|
|
my $i = Lutim::DB::Image->new(app => $c->app);
|
|
$i->record(1);
|
|
$i->_slurp($e);
|
|
|
|
push @images, $i;
|
|
}
|
|
);
|
|
|
|
return c(@images);
|
|
}
|
|
|
|
sub get_images_to_clean {
|
|
my $c = shift;
|
|
|
|
my @images;
|
|
|
|
my $records = $c->app->sqlite->db->query('SELECT * FROM lutim WHERE enabled = 1 AND (delete_at_day * 86400) < (? - created_at) AND delete_at_day != 0', time())->hashes;
|
|
|
|
$records->each(
|
|
sub {
|
|
my ($e, $num) = @_;
|
|
my $i = Lutim::DB::Image->new(app => $c->app);
|
|
$i->_slurp($e);
|
|
|
|
push @images, $i;
|
|
}
|
|
);
|
|
|
|
return c(@images);
|
|
}
|
|
|
|
sub get_50_oldest {
|
|
my $c = shift;
|
|
|
|
my @images;
|
|
|
|
my $records = $c->app->sqlite->db->query('SELECT * FROM lutim WHERE path IS NOT NULL AND enabled = 1 ORDER BY created_at ASC LIMIT 50')->hashes;
|
|
|
|
$records->each(
|
|
sub {
|
|
my ($e, $num) = @_;
|
|
my $i = Lutim::DB::Image->new(app => $c->app);
|
|
$i->_slurp($e);
|
|
|
|
push @images, $i;
|
|
}
|
|
);
|
|
|
|
return c(@images);
|
|
}
|
|
|
|
sub disable {
|
|
my $c = shift;
|
|
|
|
$c->app->sqlite->db->query('UPDATE lutim SET enabled = 0 WHERE short = ?', $c->short);
|
|
$c->enabled(0);
|
|
|
|
return $c;
|
|
}
|
|
|
|
sub search_created_by {
|
|
my $c = shift;
|
|
my $ip = shift;
|
|
|
|
my @images;
|
|
|
|
my $records = $c->app->sqlite->db->select('lutim', undef, { enabled => 1, created_by => { -like => $ip.'%' } })->hashes;
|
|
|
|
$records->each(
|
|
sub {
|
|
my ($e, $num) = @_;
|
|
my $i = Lutim::DB::Image->new(app => $c->app);
|
|
$i->_slurp($e);
|
|
|
|
push @images, $i;
|
|
}
|
|
);
|
|
|
|
return c(@images);
|
|
}
|
|
|
|
sub search_exact_created_by {
|
|
my $c = shift;
|
|
my $ip = shift;
|
|
|
|
my @images;
|
|
|
|
my $records = $c->app->sqlite->db->select('lutim', undef, { enabled => 1, created_by => $ip })->hashes;
|
|
|
|
$records->each(
|
|
sub {
|
|
my ($e, $num) = @_;
|
|
my $i = Lutim::DB::Image->new(app => $c->app);
|
|
$i->_slurp($e);
|
|
|
|
push @images, $i;
|
|
}
|
|
);
|
|
|
|
return c(@images);
|
|
}
|
|
|
|
sub _slurp {
|
|
my $c = shift;
|
|
my $r = shift;
|
|
|
|
my $image;
|
|
if (defined $r) {
|
|
$image = $r;
|
|
} else {
|
|
my $images = $c->app->sqlite->db->query('SELECT * FROM lutim WHERE short = ?', $c->short)->hashes;
|
|
|
|
if ($images->size) {
|
|
$image = $images->first;
|
|
}
|
|
}
|
|
|
|
if ($image) {
|
|
$c->short($image->{short});
|
|
$c->path($image->{path});
|
|
$c->footprint($image->{footprint});
|
|
$c->enabled($image->{enabled});
|
|
$c->mediatype($image->{mediatype});
|
|
$c->filename($image->{filename});
|
|
$c->counter($image->{counter});
|
|
$c->delete_at_first_view($image->{delete_at_first_view});
|
|
$c->delete_at_day($image->{delete_at_day});
|
|
$c->created_at($image->{created_at});
|
|
$c->created_by($image->{created_by});
|
|
$c->last_access_at($image->{last_access_at});
|
|
$c->mod_token($image->{mod_token});
|
|
$c->width($image->{width});
|
|
$c->height($image->{height});
|
|
$c->iv($image->{iv});
|
|
|
|
$c->record(1);
|
|
}
|
|
|
|
return $c;
|
|
}
|
|
|
|
1;
|