@@ -209,6 +209,7 @@ pub struct Db {
209
209
matcher : Matcher ,
210
210
// time
211
211
last_update : i64 ,
212
+ data_version : i64 ,
212
213
}
213
214
214
215
impl Db {
@@ -273,6 +274,7 @@ impl Db {
273
274
}
274
275
275
276
let mut db = Db {
277
+ data_version : fetch_data_version ( & mut conn) . await ?,
276
278
conn,
277
279
hashs : HashMap :: default ( ) ,
278
280
state : BTreeMap :: default ( ) ,
@@ -524,73 +526,37 @@ impl Db {
524
526
self . filtered . len ( )
525
527
}
526
528
}
527
- }
528
-
529
- #[ derive( Clone , Debug ) ]
530
- pub enum DbMessage {
531
- DbWasUpdated ,
532
- Ready ( mpsc:: Sender < DbMessage > ) ,
533
- }
534
529
535
- pub fn sub ( ) -> Subscription < DbMessage > {
536
- struct Update ;
530
+ pub async fn handle_message ( & mut self , _message : DbMessage ) -> Result < ( ) > {
531
+ let data_version = fetch_data_version ( & mut self . conn ) . await ? ;
537
532
538
- enum State {
539
- Starting ,
540
- Ready ( mpsc:: Receiver < DbMessage > ) ,
541
- }
533
+ if self . data_version != data_version {
534
+ self . reload ( ) . await ?;
535
+ }
542
536
543
- subscription:: channel (
544
- std:: any:: TypeId :: of :: < Update > ( ) ,
545
- 5 ,
546
- |mut output| async move {
547
- let mut state = State :: Starting ;
537
+ self . data_version = data_version;
548
538
549
- loop {
550
- match & mut state {
551
- State :: Starting => {
552
- tokio:: time:: sleep ( Duration :: from_millis ( 500 ) ) . await ;
539
+ Ok ( ( ) )
540
+ }
541
+ }
553
542
554
- let ( tx, rx) = mpsc:: channel ( 100 ) ;
555
- output. send ( DbMessage :: Ready ( tx) ) . await . unwrap ( ) ;
543
+ /// https://www.sqlite.org/pragma.html#pragma_data_version
544
+ async fn fetch_data_version ( conn : & mut SqliteConnection ) -> Result < i64 > {
545
+ let data_version: i64 = sqlx:: query ( "PRAGMA data_version" )
546
+ . fetch_one ( conn)
547
+ . await ?
548
+ . get ( "data_version" ) ;
556
549
557
- state = State :: Ready ( rx) ;
558
- }
559
- State :: Ready ( rx) => {
560
- if let Some ( mess) = rx. recv ( ) . await {
561
- output. send ( mess) . await . unwrap ( ) ;
562
- }
563
- }
564
- }
565
- }
566
- } ,
567
- )
550
+ Ok ( data_version)
568
551
}
569
552
570
- impl Db {
571
- pub async fn handle_message ( & mut self , message : DbMessage ) -> Result < ( ) > {
572
- info ! ( "db handle_message {:?}" , message) ;
573
-
574
- match message {
575
- DbMessage :: DbWasUpdated => {
576
- if now_millis ( ) - self . last_update > 500 {
577
- self . reload ( ) . await ?;
578
- }
579
- }
580
- DbMessage :: Ready ( tx) => {
581
- self . conn
582
- . lock_handle ( )
583
- . await ?
584
- . set_update_hook ( move |_result| {
585
- if let Err ( err) = tx. blocking_send ( DbMessage :: DbWasUpdated ) {
586
- error ! ( "can't send to db {err}" ) ;
587
- }
588
- } ) ;
589
- }
590
- }
553
+ #[ derive( Clone , Debug ) ]
554
+ pub enum DbMessage {
555
+ CheckUpdate ,
556
+ }
591
557
592
- Ok ( ( ) )
593
- }
558
+ pub fn sub ( ) -> Subscription < DbMessage > {
559
+ cosmic :: iced :: time :: every ( Duration :: from_millis ( 1000 ) ) . map ( |_| DbMessage :: CheckUpdate )
594
560
}
595
561
596
562
#[ cfg( test) ]
0 commit comments