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_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 "