App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Vacuum.pm view on Meta::CPAN
# Copyright 2008, 2009, 2010, 2011, 2013, 2014, 2016 Kevin Ryde
# This file is part of Chart.
#
# Chart is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3, or (at your option) any later version.
#
# Chart is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with Chart. If not, see <http://www.gnu.org/licenses/>.
package App::Chart::Vacuum;
use 5.010;
use strict;
use warnings;
use Carp;
use File::stat;
use Locale::TextDomain ('App-Chart');
use PerlIO::via::EscStatus;
use App::Chart::Annotation;
use App::Chart::Database;
use App::Chart::DBI;
use App::Chart::Download;
use App::Chart::Gtk2::Symlist::Alerts;
use App::Chart::Gtk2::Symlist::All;
use App::Chart::Gtk2::Symlist::Historical;
use constant VACUUM_AGE_DAYS => 14;
my $verbose = 0;
sub command_line_vacuum {
my ($class, $output, $args) = @_;
if ($output eq 'tty') {
if (-t STDOUT) {
binmode (STDOUT, ':via(EscStatus)')
or die 'Cannot push EscStatus';
} else {
require PerlIO::via::EscStatus::ShowNone;
binmode (STDOUT, ':via(EscStatus::ShowNone)')
or die 'Cannot push EscStatus::ShowNone';
}
} elsif ($output eq 'all-status') {
require PerlIO::via::EscStatus::ShowAll;
binmode (STDOUT, ':via(EscStatus::ShowAll)')
or die 'Cannot push EscStatus::ShowAll';
}
my %option;
foreach my $arg (@$args) {
if ($arg =~ /^no-?/ip) {
$option{${^POSTMATCH}} = 0;
} else {
$option{$arg} = 1;
}
}
vacuum(%option);
}
sub vacuum {
my %option = @_;
if (! exists $option{'compact'}) { $option{'compact'} = 1; }
if (! exists $option{'consistency'}) { $option{'consistency'} = 1; }
$verbose = $App::Chart::option{'verbose'};
if (exists $option{'verbose'}) { $verbose = $option{'verbose'}; }
App::Chart::Download::status (__('Vacuuming database'));
expire_latest();
expire_intraday();
if ($option{'consistency'}) {
check_listseq();
check_alerts();
check_historical();
check_alphabetical();
}
if ($option{'compact'}) {
vacuum_database();
vacuum_notes();
}
}
sub vacuum_notes {
my $notes_filename = App::Chart::DBI::notes_filename();
my $notes_oldsize = -s $notes_filename;
App::Chart::Download::status (__x('VACUUM notes.sqdb ({oldsize} bytes)',
oldsize => $notes_oldsize));
require DBI;
my $nbh = DBI->connect ("dbi:SQLite:dbname=$notes_filename",
'', '', {RaiseError=>1});
$nbh->func(90_000, 'busy_timeout'); # 90 seconds
$nbh->{sqlite_unicode} = 1;
$nbh->do ('VACUUM');
my $notes_newsize = -s $notes_filename;
print __x("Notes was {oldsize} now {newsize} bytes\n",
oldsize => $notes_oldsize,
newsize => $notes_newsize);
}
sub vacuum_database {
my $dbh = App::Chart::DBI->instance;
my $database_filename = App::Chart::DBI::database_filename();
( run in 1.076 second using v1.01-cache-2.11-cpan-39bf76dae61 )