Skip to content

Commit d764082

Browse files
committed
Add optional max_state_group param
1 parent b9be6c5 commit d764082

File tree

2 files changed

+46
-16
lines changed

2 files changed

+46
-16
lines changed

src/database.rs

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,14 @@ use StateGroupEntry;
2626

2727
/// Fetch the entries in state_groups_state (and their prev groups) for the
2828
/// given `room_id` by connecting to the postgres database at `db_url`.
29-
pub fn get_data_from_db(db_url: &str, room_id: &str) -> BTreeMap<i64, StateGroupEntry> {
29+
pub fn get_data_from_db(
30+
db_url: &str,
31+
room_id: &str,
32+
max_state_group: Option<i64>,
33+
) -> BTreeMap<i64, StateGroupEntry> {
3034
let conn = Connection::connect(db_url, TlsMode::None).unwrap();
3135

32-
let mut state_group_map = get_initial_data_from_db(&conn, room_id);
36+
let mut state_group_map = get_initial_data_from_db(&conn, room_id, max_state_group);
3337

3438
println!("Got initial state from database. Checking for any missing state groups...");
3539

@@ -69,21 +73,36 @@ pub fn get_data_from_db(db_url: &str, room_id: &str) -> BTreeMap<i64, StateGroup
6973

7074
/// Fetch the entries in state_groups_state (and their prev groups) for the
7175
/// given `room_id` by fetching all state with the given `room_id`.
72-
fn get_initial_data_from_db(conn: &Connection, room_id: &str) -> BTreeMap<i64, StateGroupEntry> {
73-
let stmt = conn
74-
.prepare(
75-
r#"
76-
SELECT m.id, prev_state_group, type, state_key, s.event_id
77-
FROM state_groups AS m
78-
LEFT JOIN state_groups_state AS s ON (m.id = s.state_group)
79-
LEFT JOIN state_group_edges AS e ON (m.id = e.state_group)
80-
WHERE m.room_id = $1
81-
"#,
82-
)
83-
.unwrap();
76+
fn get_initial_data_from_db(
77+
conn: &Connection,
78+
room_id: &str,
79+
max_state_group: Option<i64>,
80+
) -> BTreeMap<i64, StateGroupEntry> {
81+
let sql = format!(
82+
r#"
83+
SELECT m.id, prev_state_group, type, state_key, s.event_id
84+
FROM state_groups AS m
85+
LEFT JOIN state_groups_state AS s ON (m.id = s.state_group)
86+
LEFT JOIN state_group_edges AS e ON (m.id = e.state_group)
87+
WHERE m.room_id = $1 {}
88+
"#,
89+
if max_state_group.is_some() {
90+
"AND state_group <= $2"
91+
} else {
92+
""
93+
}
94+
);
95+
96+
let stmt = conn.prepare(&sql).unwrap();
8497

8598
let trans = conn.transaction().unwrap();
86-
let mut rows = stmt.lazy_query(&trans, &[&room_id], 1000).unwrap();
99+
100+
let mut rows = if let Some(s) = max_state_group {
101+
stmt.lazy_query(&trans, &[&room_id, &s], 1000)
102+
} else {
103+
stmt.lazy_query(&trans, &[&room_id], 1000)
104+
}
105+
.unwrap();
87106

88107
let mut state_group_map: BTreeMap<i64, StateGroupEntry> = BTreeMap::new();
89108

src/main.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ fn main() {
124124
.help("The room to process")
125125
.takes_value(true)
126126
.required(true),
127+
).arg(
128+
Arg::with_name("max_state_group")
129+
.short("s")
130+
.help("The maximum state group to process up to")
131+
.takes_value(true)
132+
.required(false),
127133
).arg(
128134
Arg::with_name("output_file")
129135
.short("o")
@@ -161,17 +167,22 @@ fn main() {
161167
let mut output_file = matches
162168
.value_of("output_file")
163169
.map(|path| File::create(path).unwrap());
170+
164171
let room_id = matches
165172
.value_of("room_id")
166173
.expect("room_id should be required since no file");
167174

175+
let max_state_group = matches
176+
.value_of("max_state_group")
177+
.map(|s| s.parse().expect("max_state_group must be an integer"));
178+
168179
let transactions = matches.is_present("transactions");
169180

170181
let level_sizes = value_t_or_exit!(matches, "level_sizes", LevelSizes);
171182

172183
// First we need to get the current state groups
173184
println!("Fetching state from DB for room '{}'...", room_id);
174-
let state_group_map = database::get_data_from_db(db_url, room_id);
185+
let state_group_map = database::get_data_from_db(db_url, room_id, max_state_group);
175186

176187
println!("Number of state groups: {}", state_group_map.len());
177188

0 commit comments

Comments
 (0)