summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2020-04-09 08:34:40 +0200
committerYorhel <git@yorhel.nl>2020-04-09 08:35:32 +0200
commit6fd9ceb051538f11829b7d9b2919665dbeca70ed (patch)
tree5944f52bd30a92aa56bb165e5db4674d527660cf
parent443fc2d8bc509b2231b4b34cb420b84d158a1b02 (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.pm3
-rw-r--r--lib/VNDB/DB/Misc.pm12
-rw-r--r--lib/VNWeb/Discussions/Edit.pm1
-rw-r--r--lib/VNWeb/HTML.pm15
-rw-r--r--lib/VNWeb/User/List.pm3
-rw-r--r--sql/data.sql5
-rw-r--r--sql/func.sql4
-rw-r--r--sql/triggers.sql28
-rw-r--r--util/updates/2020-04-09-stats-cleanup.sql10
-rwxr-xr-xutil/vndb.pl3
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;
};