1
1
use std:: collections:: HashMap ;
2
- use std:: io:: { self , BufRead , BufReader , Read , Write , IoSlice } ;
2
+ use std:: io:: { self , BufRead , BufReader , Read , Write } ;
3
3
use std:: net:: { TcpListener , TcpStream } ;
4
4
use std:: thread;
5
5
6
6
const MAX_READ_SIZE : u64 = 1024 ;
7
7
8
+ struct Item {
9
+ data : Vec < u8 > ,
10
+ flags : u32 ,
11
+ }
12
+
8
13
fn process_command (
9
- db : & mut HashMap < String , Vec < u8 > > ,
14
+ db : & mut HashMap < String , Item > ,
10
15
mut reader : impl BufRead ,
11
16
mut writer : impl Write ,
12
17
buffer : & mut String ,
@@ -29,14 +34,9 @@ fn process_command(
29
34
anyhow:: bail!( "missing argument: `key`" ) ;
30
35
} ;
31
36
match db. get ( key) {
32
- Some ( data) => {
33
- let header = format ! ( "VALUE {} {} {}\r \n " , key, 0 , data. len( ) ) ;
34
- let resp = [
35
- header. as_bytes ( ) ,
36
- & data[ ..] ,
37
- b"\r \n " ,
38
- b"END\r \n " ,
39
- ] . concat ( ) ;
37
+ Some ( item) => {
38
+ let header = format ! ( "VALUE {} {} {}\r \n " , key, item. flags, item. data. len( ) ) ;
39
+ let resp = [ header. as_bytes ( ) , & item. data [ ..] , b"\r \n " , b"END\r \n " ] . concat ( ) ;
40
40
writer. write_all ( & resp) ?;
41
41
}
42
42
None => {
@@ -51,7 +51,7 @@ fn process_command(
51
51
let Some ( flags) = iter. next ( ) else {
52
52
anyhow:: bail!( "missing argument: `flags`" ) ;
53
53
} ;
54
- let Ok ( _flags ) = flags. parse :: < u32 > ( ) else {
54
+ let Ok ( flags ) = flags. parse :: < u32 > ( ) else {
55
55
anyhow:: bail!( "`flags` must be a 32-bit unsigned integer" ) ;
56
56
} ;
57
57
let Some ( exptime) = iter. next ( ) else {
@@ -77,7 +77,8 @@ fn process_command(
77
77
anyhow:: bail!( "parse error" ) ;
78
78
}
79
79
80
- db. insert ( key. to_owned ( ) , data) ;
80
+ let item = Item { data, flags } ;
81
+ db. insert ( key. to_owned ( ) , item) ;
81
82
82
83
writer. write_all ( b"STORED\r \n " ) ?;
83
84
}
@@ -90,7 +91,7 @@ fn process_command(
90
91
}
91
92
92
93
fn handle_client ( client : TcpStream ) -> anyhow:: Result < ( ) > {
93
- let mut db: HashMap < String , Vec < u8 > > = HashMap :: new ( ) ;
94
+ let mut db: HashMap < String , Item > = HashMap :: new ( ) ;
94
95
let mut reader = BufReader :: new ( & client) ;
95
96
let mut buffer = String :: new ( ) ;
96
97
0 commit comments