@@ -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
0 commit comments