@@ -4,7 +4,7 @@ use couchbase_lite::{
4
4
} ;
5
5
use log:: { error, trace} ;
6
6
use serde:: { Deserialize , Serialize } ;
7
- use std:: { collections:: HashSet , env, path:: Path } ;
7
+ use std:: { collections:: HashSet , env, path:: Path , sync :: mpsc } ;
8
8
use tokio:: prelude:: * ;
9
9
10
10
#[ derive( Serialize , Deserialize , Debug ) ]
@@ -56,11 +56,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
56
56
}
57
57
} ) ;
58
58
59
- let db_exec2 = db_exec. clone ( ) ;
59
+ let db_exec_repl = db_exec. clone ( ) ;
60
60
db_exec. spawn ( move |db| {
61
61
if let Some ( db) = db. as_mut ( ) {
62
62
db. register_observer ( move || {
63
- db_exec2
63
+ db_exec_repl
64
64
. spawn ( |db| print_external_changes ( db) . expect ( "read external changes failed" ) ) ;
65
65
} )
66
66
. expect ( "register observer failed" ) ;
@@ -69,10 +69,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
69
69
}
70
70
} ) ;
71
71
72
- let db_exec3 = db_exec. clone ( ) ;
73
72
let mut stdin = tokio:: io:: BufReader :: new ( tokio:: io:: stdin ( ) ) ;
74
73
static EDIT_PREFIX : & ' static str = "edit " ;
75
74
75
+ let db_exec_repl = db_exec. clone ( ) ;
76
76
runtime. block_on ( async move {
77
77
let mut buf = String :: new ( ) ;
78
78
let mut edit_id = None ;
@@ -84,7 +84,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
84
84
let msg = & buf;
85
85
let msg = msg. trim_end ( ) ;
86
86
if !msg. is_empty ( ) {
87
- if msg. starts_with ( EDIT_PREFIX ) {
87
+ if msg == "quit" {
88
+ println ! ( "Time to quit" ) ;
89
+ break ;
90
+ } else if msg. starts_with ( EDIT_PREFIX ) {
88
91
edit_id = Some ( ( & msg[ EDIT_PREFIX . len ( ) ..] ) . to_string ( ) ) ;
89
92
println ! ( "ready to edit message {:?}" , edit_id) ;
90
93
} else {
@@ -93,7 +96,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
93
96
{
94
97
let msg = msg. to_string ( ) ;
95
98
let edit_id = edit_id. take ( ) ;
96
- db_exec . spawn ( move |db| {
99
+ db_exec_repl . spawn ( move |db| {
97
100
if let Some ( mut db) = db. as_mut ( ) {
98
101
save_msg ( & mut db, & msg, edit_id. as_ref ( ) . map ( String :: as_str) )
99
102
. expect ( "save to db failed" ) ;
@@ -108,14 +111,15 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
108
111
}
109
112
} ) ;
110
113
111
- db_exec3 . spawn ( |db| {
114
+ db_exec . spawn ( |db| {
112
115
if let Some ( db) = db. as_mut ( ) {
113
116
db. clear_observers ( ) ;
117
+ db. stop_replicator ( ) ;
114
118
} else {
115
119
eprintln ! ( "db is NOT open" ) ;
116
120
}
117
121
} ) ;
118
- drop ( db_exec3 ) ;
122
+ drop ( db_exec ) ;
119
123
db_thread. join ( ) . unwrap ( ) ;
120
124
println ! ( "exiting" ) ;
121
125
Ok ( ( ) )
@@ -125,7 +129,7 @@ type Job<T> = Box<dyn FnOnce(&mut Option<T>) + Send>;
125
129
126
130
#[ derive( Clone ) ]
127
131
struct DbQueryExecutor {
128
- inner : std :: sync :: mpsc:: Sender < Job < Database > > ,
132
+ inner : mpsc:: Sender < Job < Database > > ,
129
133
}
130
134
131
135
impl DbQueryExecutor {
0 commit comments