From 50f0104239d9ed2f19880fffd01257d74356f2b8 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Sun, 13 Apr 2025 21:16:26 -0400 Subject: [PATCH] ssb: Add size to messages_stats. Forces an already-necessary rebuild and provides information I'm keen on having readily available. --- src/ssb.db.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ssb.db.c b/src/ssb.db.c index cc697a53f..eaeb53dcc 100644 --- a/src/ssb.db.c +++ b/src/ssb.db.c @@ -132,6 +132,11 @@ void tf_ssb_db_init(tf_ssb_t* ssb) tf_printf("Rebuilding messages_stats.\n"); _tf_ssb_db_exec(db, "DROP TABLE messages_stats"); } + else if (!_tf_ssb_db_has_rows(db, "SELECT name FROM pragma_table_info('messages_stats') WHERE name = 'size'")) + { + tf_printf("Rebuilding messages_stats.\n"); + _tf_ssb_db_exec(db, "DROP TABLE messages_stats"); + } } if (!_tf_ssb_db_has_rows(db, "PRAGMA table_list('messages_stats')")) { @@ -140,20 +145,21 @@ void tf_ssb_db_init(tf_ssb_t* ssb) "CREATE TABLE IF NOT EXISTS messages_stats (" " author TEXT PRIMARY KEY," " max_sequence INTEGER NOT NULL," - " max_timestamp REAL NOT NULL" + " max_timestamp REAL NOT NULL," + " size INTEGER NOT NULL DEFAULT 0" ")"); _tf_ssb_db_exec( - db, "INSERT OR REPLACE INTO messages_stats (author, max_sequence, max_timestamp) SELECT author, MAX(sequence), MAX(timestamp) FROM messages GROUP BY author"); + db, "INSERT OR REPLACE INTO messages_stats (author, max_sequence, max_timestamp, size) SELECT author, MAX(sequence), MAX(timestamp), SUM(length(json(content))) FROM messages GROUP BY author"); _tf_ssb_db_exec(db, "COMMIT TRANSACTION"); } _tf_ssb_db_exec(db, - "CREATE TRIGGER IF NOT EXISTS messages_ai_stats AFTER INSERT ON messages BEGIN INSERT INTO messages_stats(author, max_sequence, max_timestamp) VALUES (new.author, " - "new.sequence, new.timestamp) ON CONFLICT DO UPDATE SET max_sequence = MAX(max_sequence, new.sequence), max_timestamp = MAX(max_timestamp, " - "new.timestamp); END"); + "CREATE TRIGGER IF NOT EXISTS messages_ai_stats AFTER INSERT ON messages BEGIN INSERT INTO messages_stats(author, max_sequence, max_timestamp, size) VALUES (new.author, " + "new.sequence, new.timestamp, length(json(new.content))) ON CONFLICT DO UPDATE SET max_sequence = MAX(max_sequence, new.sequence), max_timestamp = MAX(max_timestamp, " + "new.timestamp), size = size + length(json(new.content)); END"); _tf_ssb_db_exec(db, "DROP TRIGGER IF EXISTS messages_ad_stats"); _tf_ssb_db_exec(db, "CREATE TRIGGER IF NOT EXISTS messages_ad_stats AFTER DELETE ON messages BEGIN " - "UPDATE messages_stats SET max_sequence = updated.sequence, max_timestamp = updated.timestamp " + "UPDATE messages_stats SET max_sequence = updated.sequence, max_timestamp = updated.timestamp, size = size - length(json(old.content)) " "FROM (" " SELECT COALESCE(MAX(messages.sequence), 0) AS sequence, COALESCE(MAX(messages.timestamp), 0) AS timestamp " " FROM messages WHERE messages.author = old.author) AS updated "