@@ -14,12 +14,12 @@ rustler::atoms! {
14
14
15
15
rustler:: init!(
16
16
"hstreamdb" ,
17
- [ create_stream, start_producer, append] ,
17
+ [ create_stream, start_producer, stop_producer , append] ,
18
18
load = load
19
19
) ;
20
20
21
21
#[ derive( Clone ) ]
22
- pub struct NifAppender ( UnboundedSender < Record > ) ;
22
+ pub struct NifAppender ( UnboundedSender < Option < Record > > ) ;
23
23
24
24
fn load ( env : Env , _: Term ) -> bool {
25
25
resource ! ( NifAppender , env) ;
@@ -65,7 +65,7 @@ pub fn start_producer(
65
65
compression_type : Atom ,
66
66
flush_settings : Term ,
67
67
) -> ResourceArc < NifAppender > {
68
- let ( request_sender, request_receiver) = unbounded_channel :: < Record > ( ) ;
68
+ let ( request_sender, request_receiver) = unbounded_channel :: < Option < Record > > ( ) ;
69
69
let compression_type = atom_to_compression_type ( compression_type) ;
70
70
let flush_settings = new_flush_settings ( flush_settings) ;
71
71
let future = async move {
@@ -93,7 +93,10 @@ pub fn start_producer(
93
93
let mut request_receiver = request_receiver;
94
94
let mut appender = appender;
95
95
while let Some ( record) = request_receiver. recv ( ) . await {
96
- _ = appender. append ( record) . unwrap ( )
96
+ match record {
97
+ Some ( record) => _ = appender. append ( record) . unwrap ( ) ,
98
+ None => request_receiver. close ( ) ,
99
+ }
97
100
}
98
101
} ) ;
99
102
producer. start ( ) . await
@@ -102,14 +105,21 @@ pub fn start_producer(
102
105
ResourceArc :: new ( NifAppender ( request_sender) )
103
106
}
104
107
108
+ #[ rustler:: nif]
109
+ fn stop_producer ( producer : ResourceArc < NifAppender > ) -> Atom {
110
+ let producer = & producer. 0 ;
111
+ producer. send ( None ) . unwrap ( ) ;
112
+ ok ( )
113
+ }
114
+
105
115
#[ rustler:: nif]
106
116
fn append ( producer : ResourceArc < NifAppender > , partition_key : String , raw_payload : String ) -> Atom {
107
117
let record = Record {
108
118
partition_key,
109
119
payload : hstreamdb:: Payload :: RawRecord ( raw_payload. into_bytes ( ) ) ,
110
120
} ;
111
121
let producer = & producer. 0 ;
112
- producer. send ( record) . unwrap ( ) ;
122
+ producer. send ( Some ( record) ) . unwrap ( ) ;
113
123
ok ( )
114
124
}
115
125
0 commit comments