ssb: Add size to messages_stats. Forces an already-necessary rebuild and provides information I'm keen on having readily available.

This commit is contained in:
Cory McWilliams 2025-04-13 21:16:26 -04:00
parent 40fa7edadf
commit 50f0104239

View File

@ -132,6 +132,11 @@ void tf_ssb_db_init(tf_ssb_t* ssb)
tf_printf("Rebuilding messages_stats.\n"); tf_printf("Rebuilding messages_stats.\n");
_tf_ssb_db_exec(db, "DROP TABLE messages_stats"); _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')")) 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 (" "CREATE TABLE IF NOT EXISTS messages_stats ("
" author TEXT PRIMARY KEY," " author TEXT PRIMARY KEY,"
" max_sequence INTEGER NOT NULL," " 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( _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, "COMMIT TRANSACTION");
} }
_tf_ssb_db_exec(db, _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, " "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) ON CONFLICT DO UPDATE SET max_sequence = MAX(max_sequence, new.sequence), max_timestamp = MAX(max_timestamp, " "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); END"); "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, "DROP TRIGGER IF EXISTS messages_ad_stats");
_tf_ssb_db_exec(db, _tf_ssb_db_exec(db,
"CREATE TRIGGER IF NOT EXISTS messages_ad_stats AFTER DELETE ON messages BEGIN " "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 (" "FROM ("
" SELECT COALESCE(MAX(messages.sequence), 0) AS sequence, COALESCE(MAX(messages.timestamp), 0) AS timestamp " " SELECT COALESCE(MAX(messages.sequence), 0) AS sequence, COALESCE(MAX(messages.timestamp), 0) AS timestamp "
" FROM messages WHERE messages.author = old.author) AS updated " " FROM messages WHERE messages.author = old.author) AS updated "