mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-19 19:46:50 +00:00
Prune database from settings
This commit is contained in:
parent
ab80931e7f
commit
905333d381
@ -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,
|
||||||
|
@ -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
22
src/db/prune.sql
Normal 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;
|
@ -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?;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user