Repeatedly request logs while in a room

This commit is contained in:
Joscha 2022-06-24 17:25:35 +02:00
parent 76412e8287
commit ce58e5b4be
3 changed files with 120 additions and 12 deletions

View file

@ -100,6 +100,17 @@ impl EuphVault {
};
let _ = self.tx.send(request.into());
}
pub async fn last_span(&self) -> Option<(Option<Snowflake>, Option<Snowflake>)> {
// TODO vault::Error
let (tx, rx) = oneshot::channel();
let request = EuphRequest::LastSpan {
room: self.room.clone(),
result: tx,
};
let _ = self.tx.send(request.into());
rx.await.unwrap()
}
}
#[async_trait]
@ -186,6 +197,10 @@ pub(super) enum EuphRequest {
msgs: Vec<Message>,
next_msg: Option<Snowflake>,
},
LastSpan {
room: String,
result: oneshot::Sender<Option<(Option<Snowflake>, Option<Snowflake>)>>,
},
Path {
room: String,
id: Snowflake,
@ -229,6 +244,7 @@ impl EuphRequest {
msgs,
next_msg,
} => Self::add_msgs(conn, room, msgs, next_msg),
EuphRequest::LastSpan { room, result } => Self::last_span(conn, room, result),
EuphRequest::Path { room, id, result } => Self::path(conn, room, id, result),
EuphRequest::Tree { room, root, result } => Self::tree(conn, room, root, result),
EuphRequest::PrevTree { room, root, result } => {
@ -402,6 +418,27 @@ impl EuphRequest {
Ok(())
}
fn last_span(
conn: &Connection,
room: String,
result: oneshot::Sender<Option<(Option<Snowflake>, Option<Snowflake>)>>,
) -> rusqlite::Result<()> {
let span = conn
.prepare(
"
SELECT start, end
FROM euph_spans
WHERE room = ?
ORDER BY start, end DESC
LIMIT 1
",
)?
.query_row([room], |row| Ok((row.get(0)?, row.get(1)?)))
.optional()?;
let _ = result.send(span);
Ok(())
}
fn path(
conn: &Connection,
room: String,

View file

@ -55,7 +55,9 @@ fn m1(tx: &mut Transaction) -> rusqlite::Result<()> {
PRIMARY KEY (room, start, end),
FOREIGN KEY (room, start) REFERENCES euph_msgs (room, id),
FOREIGN KEY (room, end) REFERENCES euph_msgs (room, id)
FOREIGN KEY (room, end) REFERENCES euph_msgs (room, id),
CHECK (start IS NULL OR end IS NOT NULL)
) STRICT;
CREATE VIEW euph_trees (room, id) AS