11use hstreamdb:: client:: Client ;
22use hstreamdb:: producer:: FlushSettings ;
33use hstreamdb:: { CompressionType , Record , Stream } ;
4+ use rustler:: types:: atom:: ok;
45use rustler:: { resource, Atom , Env , ResourceArc , Term } ;
56use tokio:: sync:: mpsc:: { unbounded_channel, UnboundedSender } ;
67
78mod runtime;
89
910rustler:: atoms! {
10- none, gzip, zstd
11+ none, gzip, zstd,
12+ len, size
1113}
1214
15+ rustler:: init!(
16+ "hstreamdb" ,
17+ [ create_stream, start_producer, append] ,
18+ load = load
19+ ) ;
20+
1321#[ derive( Clone ) ]
1422pub struct NifAppender ( UnboundedSender < Record > ) ;
1523
1624fn load ( env : Env , _: Term ) -> bool {
1725 resource ! ( NifAppender , env) ;
26+ env_logger:: init ( ) ;
1827 true
1928}
2029
@@ -25,7 +34,7 @@ pub fn create_stream(
2534 replication_factor : u32 ,
2635 backlog_duration : u32 ,
2736 shard_count : u32 ,
28- ) {
37+ ) -> Atom {
2938 let future = async move {
3039 let mut client = Client :: new ( url) . await . unwrap ( ) ;
3140 client
@@ -38,20 +47,21 @@ pub fn create_stream(
3847 . await
3948 . unwrap ( )
4049 } ;
41- _ = runtime:: spawn ( future)
50+ _ = runtime:: spawn ( future) ;
51+ ok ( )
4252}
4353
4454#[ rustler:: nif]
4555pub fn start_producer (
4656 url : String ,
4757 stream_name : String ,
4858 compression_type : Atom ,
59+ flush_settings : Term ,
4960) -> ResourceArc < NifAppender > {
5061 let ( request_sender, request_receiver) = unbounded_channel :: < Record > ( ) ;
62+ let compression_type = atom_to_compression_type ( compression_type) ;
63+ let flush_settings = new_flush_settings ( flush_settings) ;
5164 let future = async move {
52- let compression_type = atom_to_compression_type ( compression_type) ;
53- let flush_settings = FlushSettings { len : 0 , size : 0 } ;
54-
5565 let mut client = Client :: new ( url) . await . unwrap ( ) ;
5666 let ( appender, mut producer) = client
5767 . new_producer ( stream_name, compression_type, flush_settings)
@@ -72,16 +82,17 @@ pub fn start_producer(
7282}
7383
7484#[ rustler:: nif]
75- fn append ( producer : ResourceArc < NifAppender > , partition_key : String , raw_payload : String ) {
85+ fn append ( producer : ResourceArc < NifAppender > , partition_key : String , raw_payload : String ) -> Atom {
7686 let record = Record {
7787 partition_key,
7888 payload : hstreamdb:: Payload :: RawRecord ( raw_payload. into_bytes ( ) ) ,
7989 } ;
8090 let producer = & producer. 0 ;
8191 producer. send ( record) . unwrap ( ) ;
92+ ok ( )
8293}
8394
84- pub fn atom_to_compression_type ( compression_type : Atom ) -> CompressionType {
95+ fn atom_to_compression_type ( compression_type : Atom ) -> CompressionType {
8596 if compression_type == none ( ) {
8697 CompressionType :: None
8798 } else if compression_type == gzip ( ) {
@@ -93,8 +104,28 @@ pub fn atom_to_compression_type(compression_type: Atom) -> CompressionType {
93104 }
94105}
95106
96- rustler:: init!(
97- "hstreamdb" ,
98- [ create_stream, start_producer, append] ,
99- load = load
100- ) ;
107+ fn new_flush_settings ( proplists : Term ) -> FlushSettings {
108+ let proplists = proplists. into_list_iterator ( ) . unwrap ( ) ;
109+ let mut len_v = usize:: MAX ;
110+ let mut size_v = usize:: MAX ;
111+
112+ for x in proplists {
113+ if x. is_tuple ( ) {
114+ let ( k, v) : ( Atom , usize ) = x. decode ( ) . unwrap ( ) ;
115+ if k == len ( ) {
116+ len_v = v;
117+ } else if k == size ( ) {
118+ size_v = v;
119+ }
120+ }
121+ }
122+
123+ if len_v == usize:: MAX && size_v == usize:: MAX {
124+ len_v = 0 ;
125+ size_v = 0 ;
126+ }
127+ FlushSettings {
128+ len : len_v,
129+ size : size_v,
130+ }
131+ }
0 commit comments