Prune database from settings

This commit is contained in:
Mike Dilger 2023-01-15 20:44:55 +13:00
parent ab80931e7f
commit 905333d381
5 changed files with 56 additions and 0 deletions

View File

@ -16,6 +16,7 @@ pub enum ToOverlordMessage {
ProcessIncomingEvents, ProcessIncomingEvents,
PostReply(String, Vec<Tag>, Id), PostReply(String, Vec<Tag>, Id),
PostTextNote(String, Vec<Tag>), PostTextNote(String, Vec<Tag>),
PruneDatabase,
PullFollowMerge, PullFollowMerge,
PullFollowOverwrite, PullFollowOverwrite,
PushFollow, PushFollow,

View File

@ -32,6 +32,7 @@ use crate::error::Error;
use crate::globals::GLOBALS; use crate::globals::GLOBALS;
use rusqlite::Connection; use rusqlite::Connection;
use std::fs; use std::fs;
use tokio::task;
// This sets up the database // This sets up the database
#[allow(clippy::or_fun_call)] #[allow(clippy::or_fun_call)]
@ -120,3 +121,18 @@ fn upgrade(db: &Connection, mut version: u16) -> Result<(), Error> {
tracing::info!("Database is at version {}", version); tracing::info!("Database is at version {}", version);
Ok(()) Ok(())
} }
pub async fn prune() -> Result<(), Error> {
let sql = include_str!("prune.sql");
task::spawn_blocking(move || {
let maybe_db = GLOBALS.db.blocking_lock();
let db = maybe_db.as_ref().unwrap();
let mut stmt = db.prepare(sql)?;
stmt.execute(())?;
Ok::<(), Error>(())
}).await??;
*GLOBALS.status_message.write().await = "Database prune has completed.".to_owned();
Ok(())
}

22
src/db/prune.sql Normal file
View File

@ -0,0 +1,22 @@
PRAGMA foreign_keys = ON;
-- Delete stale kind=0 events (keep the last one)
DELETE FROM event WHERE kind=0 AND created_at != (SELECT max(created_at) FROM event as event_inner WHERE kind=0 AND pubkey=event.pubkey);
-- Delete stale kind=3 events (keep the last one)
DELETE FROM event WHERE kind=3 AND created_at != (SELECT max(created_at) FROM event as event_inner WHERE kind=3 AND pubkey=event.pubkey);
-- Delete stale kind=10001 events (keep the last one)
DELETE FROM event WHERE kind=10001 AND created_at != (SELECT max(created_at) FROM event as event_inner WHERE kind=10001 AND pubkey=event.pubkey);
-- Delete kind=1 events older than 1 week
DELETE FROM event WHERE kind!=0 AND kind!=3 AND kind!=10001 AND created_at < strftime('%s', 'now') - 60*60*24*7;
-- Due to foreign keys and cascades, the following will also be cleaned up
-- event_relationship
-- event_hashtag
-- event_tag
-- event_seen
VACUUM;

View File

@ -448,6 +448,13 @@ impl Overlord {
} }
}); });
} }
ToOverlordMessage::PruneDatabase => {
let _ = tokio::spawn(async move {
if let Err(e) = crate::db::prune().await {
tracing::error!("{}", e);
}
});
}
ToOverlordMessage::PostReply(content, tags, reply_to) => { ToOverlordMessage::PostReply(content, tags, reply_to) => {
self.post_reply(content, tags, reply_to).await?; self.post_reply(content, tags, reply_to).await?;
} }

View File

@ -143,6 +143,16 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr
ui.add(Slider::new(&mut app.settings.max_fps, 2..=60).text("Frames per second")); ui.add(Slider::new(&mut app.settings.max_fps, 2..=60).text("Frames per second"));
}); });
ui.add_space(12.0);
ui.separator();
ui.add_space(12.0);
if ui.button("Prune Database")
.on_hover_text("This will delete overridden events, events older than a week, and related data while keeping everything important. It make make Gossip somewhat unresponsive until it is complete.")
.clicked() {
let _ = GLOBALS.to_overlord.send(ToOverlordMessage::PruneDatabase);
}
ui.add_space(12.0); ui.add_space(12.0);
ui.separator(); ui.separator();
ui.add_space(24.0); ui.add_space(24.0);