diff options
author | Yorhel <git@yorhel.nl> | 2020-04-09 08:34:40 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2020-04-09 08:35:32 +0200 |
commit | 6fd9ceb051538f11829b7d9b2919665dbeca70ed (patch) | |
tree | 5944f52bd30a92aa56bb165e5db4674d527660cf | |
parent | 443fc2d8bc509b2231b4b34cb420b84d158a1b02 (diff) |
Stop keeping track of users/threads/posts count cache
Those stats havent been displayed on the site for ages, anyway. The API
will now report '0' for these stats.
-rw-r--r-- | lib/Multi/API.pm | 3 | ||||
-rw-r--r-- | lib/VNDB/DB/Misc.pm | 12 | ||||
-rw-r--r-- | lib/VNWeb/Discussions/Edit.pm | 1 | ||||
-rw-r--r-- | lib/VNWeb/HTML.pm | 15 | ||||
-rw-r--r-- | lib/VNWeb/User/List.pm | 3 | ||||
-rw-r--r-- | sql/data.sql | 5 | ||||
-rw-r--r-- | sql/func.sql | 4 | ||||
-rw-r--r-- | sql/triggers.sql | 28 | ||||
-rw-r--r-- | util/updates/2020-04-09-stats-cleanup.sql | 10 | ||||
-rwxr-xr-x | util/vndb.pl | 3 |
10 files changed, 25 insertions, 59 deletions
diff --git a/lib/Multi/API.pm b/lib/Multi/API.pm index 22152aa0..518d32bc 100644 --- a/lib/Multi/API.pm +++ b/lib/Multi/API.pm @@ -337,8 +337,7 @@ sub dbstats { cpg $c, 'SELECT section, count FROM stats_cache', undef, sub { my $res = shift; - cres $c, [ dbstats => { map { - $_->{section} =~ s/^threads_//; + cres $c, [ dbstats => { users => 0, threads => 0, posts => 0, map { ($_->{section}, 1*$_->{count}) } $res->rowsAsHashes } ], 'dbstats'; }; diff --git a/lib/VNDB/DB/Misc.pm b/lib/VNDB/DB/Misc.pm index 74d2b15e..e089f3fb 100644 --- a/lib/VNDB/DB/Misc.pm +++ b/lib/VNDB/DB/Misc.pm @@ -6,20 +6,10 @@ use warnings; use Exporter 'import'; our @EXPORT = qw| - dbStats dbItemEdit dbRevisionGet dbWikidata dbImageAdd + dbItemEdit dbRevisionGet dbWikidata dbImageAdd |; -# Returns: hashref, key = section, value = number of (visible) entries -# Sections: vn, producers, releases, users, threads, posts -sub dbStats { - my $s = shift; - return { map { - $_->{section} eq 'threads_posts' ? 'posts' : $_->{section}, $_->{count} - } @{$s->dbAll('SELECT * FROM stats_cache')}}; -} - - # Inserts a new revision into the database # Arguments: type [vrpcsd], itemid, rev, %options->{ editsum uid ihid ilock + db[item]RevisionInsert } # rev = changes.rev of the revision this edit is based on, undef to create a new DB item diff --git a/lib/VNWeb/Discussions/Edit.pm b/lib/VNWeb/Discussions/Edit.pm index a0627448..40f13a74 100644 --- a/lib/VNWeb/Discussions/Edit.pm +++ b/lib/VNWeb/Discussions/Edit.pm @@ -52,7 +52,6 @@ elm_api DiscussionsEdit => $FORM_OUT, $FORM_IN, sub { if($data->{delete} && auth->permBoardmod) { warn "AUDIT: Delete t$tid.$num\n"; - # BUG: Doesn't cause stats_cache to be updated. But who cares about that. if($num == 1) { # (This could be a single query if there were proper ON DELETE CASCADE in the DB, though that's hard for notifications...) tuwf->dbExeci('DELETE FROM threads_posts WHERE tid =', \$tid); diff --git a/lib/VNWeb/HTML.pm b/lib/VNWeb/HTML.pm index c33baccc..6cca2164 100644 --- a/lib/VNWeb/HTML.pm +++ b/lib/VNWeb/HTML.pm @@ -265,15 +265,16 @@ sub _menu_ { h2_ 'Database Statistics'; div_ sub { dl_ sub { - dt_ 'Visual Novels'; dd_ tuwf->{stats}{vn}; + my %stats = map +($_->{section}, $_->{count}), tuwf->dbAll('SELECT * FROM stats_cache')->@*; + dt_ 'Visual Novels'; dd_ $stats{vn}; dt_ sub { b_ class => 'grayedout', '> '; lit_ 'Tags' }; - dd_ tuwf->{stats}{tags}; - dt_ 'Releases'; dd_ tuwf->{stats}{releases}; - dt_ 'Producers'; dd_ tuwf->{stats}{producers}; - dt_ 'Staff'; dd_ tuwf->{stats}{staff}; - dt_ 'Characters'; dd_ tuwf->{stats}{chars}; + dd_ $stats{tags}; + dt_ 'Releases'; dd_ $stats{releases}; + dt_ 'Producers'; dd_ $stats{producers}; + dt_ 'Staff'; dd_ $stats{staff}; + dt_ 'Characters'; dd_ $stats{chars}; dt_ sub { b_ class => 'grayedout', '> '; lit_ 'Traits' }; - dd_ tuwf->{stats}{traits}; + dd_ $stats{traits}; }; clearfloat_; } diff --git a/lib/VNWeb/User/List.pm b/lib/VNWeb/User/List.pm index d285d4b5..42e61f16 100644 --- a/lib/VNWeb/User/List.pm +++ b/lib/VNWeb/User/List.pm @@ -86,7 +86,8 @@ TUWF::get qr{/u/(?<char>[0a-z]|all)}, sub { images => 'c_imgvotes', }->{$opt->{s}}, $opt->{o} eq 'd' ? 'DESC' : 'ASC' ); - my $count = @where ? tuwf->dbVali('SELECT count(*) FROM users WHERE', sql_and @where) : tuwf->{stats}{users}; + state $totalusers = tuwf->dbVal('SELECT count(*) FROM users'); + my $count = @where ? tuwf->dbVali('SELECT count(*) FROM users WHERE', sql_and @where) : $totalusers; framework_ title => 'Browse users', sub { div_ class => 'mainbox', sub { diff --git a/sql/data.sql b/sql/data.sql index 3283c035..b49a405c 100644 --- a/sql/data.sql +++ b/sql/data.sql @@ -3,13 +3,10 @@ INSERT INTO users (id, username, mail, perm, notify_dbedit) VALUES (1, 'multi', SELECT setval('users_id_seq', 2); INSERT INTO stats_cache (section, count) VALUES - ('users', 1), ('vn', 0), ('producers', 0), ('releases', 0), ('chars', 0), ('staff', 0), ('tags', 0), - ('traits', 0), - ('threads', 0), - ('threads_posts', 0); + ('traits', 0); diff --git a/sql/func.sql b/sql/func.sql index 673ee4f7..cb120744 100644 --- a/sql/func.sql +++ b/sql/func.sql @@ -298,7 +298,6 @@ $$ LANGUAGE plpgsql SECURITY DEFINER; -- Fully recalculate all rows in stats_cache CREATE OR REPLACE FUNCTION update_stats_cache_full() RETURNS void AS $$ BEGIN - UPDATE stats_cache SET count = (SELECT COUNT(*) FROM users)-1 WHERE section = 'users'; UPDATE stats_cache SET count = (SELECT COUNT(*) FROM vn WHERE hidden = FALSE) WHERE section = 'vn'; UPDATE stats_cache SET count = (SELECT COUNT(*) FROM releases WHERE hidden = FALSE) WHERE section = 'releases'; UPDATE stats_cache SET count = (SELECT COUNT(*) FROM producers WHERE hidden = FALSE) WHERE section = 'producers'; @@ -306,9 +305,6 @@ BEGIN UPDATE stats_cache SET count = (SELECT COUNT(*) FROM staff WHERE hidden = FALSE) WHERE section = 'staff'; UPDATE stats_cache SET count = (SELECT COUNT(*) FROM tags WHERE state = 2) WHERE section = 'tags'; UPDATE stats_cache SET count = (SELECT COUNT(*) FROM traits WHERE state = 2) WHERE section = 'traits'; - UPDATE stats_cache SET count = (SELECT COUNT(*) FROM threads WHERE hidden = FALSE) WHERE section = 'threads'; - UPDATE stats_cache SET count = (SELECT COUNT(*) FROM threads_posts WHERE hidden = FALSE - AND EXISTS(SELECT 1 FROM threads WHERE threads.id = tid AND threads.hidden = FALSE)) WHERE section = 'threads_posts'; END; $$ LANGUAGE plpgsql; diff --git a/sql/triggers.sql b/sql/triggers.sql index dffaadb4..572195ef 100644 --- a/sql/triggers.sql +++ b/sql/triggers.sql @@ -41,17 +41,7 @@ DECLARE hidden boolean; BEGIN IF TG_OP = 'INSERT' THEN - IF TG_TABLE_NAME = 'users' THEN - UPDATE stats_cache SET count = count+1 WHERE section = TG_TABLE_NAME; - ELSE - IF TG_TABLE_NAME = 'threads_posts' THEN - IF EXISTS(SELECT 1 FROM threads WHERE id = NEW.tid AND threads.hidden = FALSE) THEN - UPDATE stats_cache SET count = count+1 WHERE section = TG_TABLE_NAME; - END IF; - ELSE - UPDATE stats_cache SET count = count+1 WHERE section = TG_TABLE_NAME; - END IF; - END IF; + UPDATE stats_cache SET count = count+1 WHERE section = TG_TABLE_NAME; ELSIF TG_OP = 'UPDATE' THEN IF TG_TABLE_NAME IN('tags', 'traits') THEN @@ -59,22 +49,13 @@ BEGIN hidden := OLD.state = 2 AND NEW.state <> 2; ELSE unhidden := OLD.hidden AND NOT NEW.hidden; - hidden := NOT unhidden; + hidden := NEW.hidden AND NOT OLD.hidden; END IF; IF unhidden THEN - IF TG_TABLE_NAME = 'threads' THEN - UPDATE stats_cache SET count = count+NEW.count WHERE section = 'threads_posts'; - END IF; UPDATE stats_cache SET count = count+1 WHERE section = TG_TABLE_NAME; ELSIF hidden THEN - IF TG_TABLE_NAME = 'threads' THEN - UPDATE stats_cache SET count = count-NEW.count WHERE section = 'threads_posts'; - END IF; UPDATE stats_cache SET count = count-1 WHERE section = TG_TABLE_NAME; END IF; - - ELSIF TG_OP = 'DELETE' AND TG_TABLE_NAME = 'users' THEN - UPDATE stats_cache SET count = count-1 WHERE section = TG_TABLE_NAME; END IF; RETURN NULL; END; @@ -94,11 +75,6 @@ CREATE TRIGGER stats_cache_new AFTER INSERT ON tags FOR EAC CREATE TRIGGER stats_cache_edit AFTER UPDATE ON tags FOR EACH ROW WHEN (OLD.state IS DISTINCT FROM NEW.state) EXECUTE PROCEDURE update_stats_cache(); CREATE TRIGGER stats_cache_new AFTER INSERT ON traits FOR EACH ROW WHEN (NEW.state = 2) EXECUTE PROCEDURE update_stats_cache(); CREATE TRIGGER stats_cache_edit AFTER UPDATE ON traits FOR EACH ROW WHEN (OLD.state IS DISTINCT FROM NEW.state) EXECUTE PROCEDURE update_stats_cache(); -CREATE TRIGGER stats_cache_new AFTER INSERT ON threads FOR EACH ROW WHEN (NEW.hidden = FALSE) EXECUTE PROCEDURE update_stats_cache(); -CREATE TRIGGER stats_cache_edit AFTER UPDATE ON threads FOR EACH ROW WHEN (OLD.hidden IS DISTINCT FROM NEW.hidden) EXECUTE PROCEDURE update_stats_cache(); -CREATE TRIGGER stats_cache_new AFTER INSERT ON threads_posts FOR EACH ROW WHEN (NEW.hidden = FALSE) EXECUTE PROCEDURE update_stats_cache(); -CREATE TRIGGER stats_cache_edit AFTER UPDATE ON threads_posts FOR EACH ROW WHEN (OLD.hidden IS DISTINCT FROM NEW.hidden) EXECUTE PROCEDURE update_stats_cache(); -CREATE TRIGGER stats_cache AFTER INSERT OR DELETE ON users FOR EACH ROW EXECUTE PROCEDURE update_stats_cache(); diff --git a/util/updates/2020-04-09-stats-cleanup.sql b/util/updates/2020-04-09-stats-cleanup.sql new file mode 100644 index 00000000..ccd87569 --- /dev/null +++ b/util/updates/2020-04-09-stats-cleanup.sql @@ -0,0 +1,10 @@ +DROP TRIGGER stats_cache_new ON threads; +DROP TRIGGER stats_cache_edit ON threads; +DROP TRIGGER stats_cache_new ON threads_posts; +DROP TRIGGER stats_cache_edit ON threads_posts; +DROP TRIGGER stats_cache ON users; + +DELETE FROM stats_cache WHERE section IN('users', 'threads', 'threads_posts'); + +\i sql/triggers.sql +\i sql/func.sql diff --git a/util/vndb.pl b/util/vndb.pl index d926a04e..3a7dd714 100755 --- a/util/vndb.pl +++ b/util/vndb.pl @@ -66,9 +66,6 @@ TUWF::hook before => sub { # Use a 'SameSite=Strict' cookie to determine whether this page was loaded from internal or external. # Ought to be more reliable than checking the Referer header, but it's unfortunately a bit uglier. tuwf->resCookie(samesite => 1, httponly => 1, samesite => 'Strict') if !tuwf->samesite; - - # load some stats (used for about all pageviews, anyway) - tuwf->{stats} = tuwf->dbStats; }; |