Skip to content

Commit 2490ef2

Browse files
arminsabouribenalleng
authored andcommitted
Look up RK instead of looping
Follow up from payjoin#995. We can replace a loop over all active session ids with a WHERE clause.
1 parent 659fcc9 commit 2490ef2

2 files changed

Lines changed: 25 additions & 26 deletions

File tree

payjoin-cli/src/app/v2/mod.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -206,23 +206,16 @@ impl AppTrait for App {
206206
}
207207
PjParam::V2(pj_param) => {
208208
let receiver_pubkey = pj_param.receiver_pubkey();
209-
let sender_state =
210-
self.db.get_send_session_ids()?.into_iter().find_map(|session_id| {
211-
let session_receiver_pubkey = self
212-
.db
213-
.get_send_session_receiver_pk(&session_id)
214-
.expect("Receiver pubkey should exist if session id exists");
215-
if session_receiver_pubkey == *receiver_pubkey {
216-
let sender_persister =
217-
SenderPersister::from_id(self.db.clone(), session_id);
218-
let (send_session, _) = replay_sender_event_log(&sender_persister)
219-
.map_err(|e| anyhow!("Failed to replay sender event log: {:?}", e))
220-
.ok()?;
221-
222-
Some((send_session, sender_persister))
223-
} else {
224-
None
225-
}
209+
let sender_state = self
210+
.db
211+
.get_send_session_id_by_receiver_pk(receiver_pubkey)?
212+
.and_then(|session_id| {
213+
let sender_persister =
214+
SenderPersister::from_id(self.db.clone(), session_id);
215+
let (send_session, _) = replay_sender_event_log(&sender_persister)
216+
.map_err(|e| anyhow!("Failed to replay sender event log: {:?}", e))
217+
.ok()?;
218+
Some((send_session, sender_persister))
226219
});
227220

228221
let (sender_state, persister) = match sender_state {

payjoin-cli/src/db/v2.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use payjoin::persist::SessionPersister;
44
use payjoin::receive::v2::SessionEvent as ReceiverSessionEvent;
55
use payjoin::send::v2::SessionEvent as SenderSessionEvent;
66
use payjoin::HpkePublicKey;
7-
use rusqlite::params;
7+
use rusqlite::{params, OptionalExtension};
88

99
use super::*;
1010

@@ -239,16 +239,22 @@ impl Database {
239239
Ok(session_ids)
240240
}
241241

242-
pub(crate) fn get_send_session_receiver_pk(
242+
pub(crate) fn get_send_session_id_by_receiver_pk(
243243
&self,
244-
session_id: &SessionId,
245-
) -> Result<HpkePublicKey> {
244+
receiver_pubkey: &HpkePublicKey,
245+
) -> Result<Option<SessionId>> {
246246
let conn = self.get_connection()?;
247-
let mut stmt =
248-
conn.prepare("SELECT receiver_pubkey FROM send_sessions WHERE session_id = ?1")?;
249-
let receiver_pubkey: Vec<u8> =
250-
stmt.query_row(params![session_id.0.to_string()], |row| row.get(0))?;
251-
Ok(HpkePublicKey::from_compressed_bytes(&receiver_pubkey).expect("Valid receiver pubkey"))
247+
let receiver_pubkey_bytes = receiver_pubkey.to_compressed_bytes();
248+
let mut stmt = conn.prepare(
249+
"SELECT session_id FROM send_sessions WHERE receiver_pubkey = ?1 AND completed_at IS NULL",
250+
)?;
251+
let result = stmt.query_row(params![&receiver_pubkey_bytes], |row| {
252+
let session_id: String = row.get(0)?;
253+
let session_id = uuid::Uuid::parse_str(&session_id)
254+
.expect("Database corruption: invalid session_id UUID");
255+
Ok(SessionId(session_id))
256+
});
257+
Ok(result.optional()?)
252258
}
253259

254260
pub(crate) fn get_inactive_send_session_ids(&self) -> Result<Vec<(SessionId, u64)>> {

0 commit comments

Comments
 (0)