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,
|
||||
PostReply(String, Vec<Tag>, Id),
|
||||
PostTextNote(String, Vec<Tag>),
|
||||
PruneDatabase,
|
||||
PullFollowMerge,
|
||||
PullFollowOverwrite,
|
||||
PushFollow,
|
||||
|
@ -32,6 +32,7 @@ use crate::error::Error;
|
||||
use crate::globals::GLOBALS;
|
||||
use rusqlite::Connection;
|
||||
use std::fs;
|
||||
use tokio::task;
|
||||
|
||||
// This sets up the database
|
||||
#[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);
|
||||
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) => {
|
||||
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_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.separator();
|
||||
ui.add_space(24.0);
|
||||
|
Loading…
Reference in New Issue
Block a user