Skip to content

Commit fee252d

Browse files
committed
Write code for global datastore
1 parent 727d56d commit fee252d

File tree

4 files changed

+89
-0
lines changed

4 files changed

+89
-0
lines changed

Cargo.toml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[package]
2+
name = "dstore"
3+
version = "0.1.0"
4+
authors = ["Devdutt Shenoi <devdutt@outlook.in>"]
5+
edition = "2018"
6+
7+
[[bin]]
8+
name = "global"
9+
path = "src/global.rs"
10+
11+
[[bin]]
12+
name = "local"
13+
path = "src/local.rs"
14+
15+
[dependencies]
16+
tokio = { version = "0.2", features = ["full"] }
17+
bytes = "1"
18+
tonic = "0.3"
19+
prost = "0.6"
20+
21+
[build-dependencies]
22+
tonic-build = "0.3.0"

build.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
tonic_build::compile_protos("proto/dstore.proto").unwrap();
3+
}

src/global.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
use std::collections::HashMap;
2+
use std::sync::{Arc, Mutex};
3+
use tonic::{transport::Server, Request, Response, Status};
4+
5+
use dstore::dstore_proto::dstore_server::{Dstore, DstoreServer};
6+
use dstore::dstore_proto::{GetArg, SetArg, GetResult, SetResult};
7+
struct Store {
8+
db: Arc<Mutex<HashMap<String, String>>>
9+
}
10+
11+
impl Store {
12+
fn new(db: Arc<Mutex<HashMap<String, String>>>) -> Self {
13+
Self { db }
14+
}
15+
}
16+
17+
#[tonic::async_trait]
18+
impl Dstore for Store {
19+
async fn set(&self, set_arg: Request<SetArg>) -> Result<Response<SetResult>, Status> {
20+
let mut db = self.db.lock().unwrap();
21+
let args = set_arg.into_inner();
22+
match db.contains_key(&args.key) {
23+
true => Ok(Response::new(SetResult { success: false })),
24+
false => {
25+
db.insert(args.key, args.value);
26+
Ok(Response::new(SetResult { success: true }))
27+
}
28+
}
29+
}
30+
31+
async fn get(&self, get_arg: Request<GetArg>) -> Result<Response<GetResult>, Status> {
32+
let db = self.db.lock().unwrap();
33+
let args = get_arg.into_inner();
34+
match db.get(&args.key) {
35+
Some(val) => Ok(Response::new(GetResult { value: val.clone(), success: true })),
36+
None => Ok(Response::new(GetResult {value: "".to_string(), success: false}))
37+
}
38+
}
39+
40+
async fn del(&self, del_arg: Request<GetArg>) -> Result<Response<SetResult>, Status> {
41+
let mut db = self.db.lock().unwrap();
42+
let args = del_arg.into_inner();
43+
match db.contains_key(&args.key) {
44+
false => Ok(Response::new(SetResult { success: false })),
45+
true => {
46+
db.remove(&args.key);
47+
Ok(Response::new(SetResult { success: true }))
48+
}
49+
}
50+
}
51+
}
52+
53+
#[tokio::main]
54+
async fn main() {
55+
let addr = "127.0.0.1:50051".parse().unwrap();
56+
let global_store = Arc::new(Mutex::new(HashMap::<String, String>::new()));
57+
58+
println!("Dstore server listening on {}", addr);
59+
60+
Server::builder().add_service(DstoreServer::new(Store::new(global_store))).serve(addr).await;
61+
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod dstore_proto {
2+
tonic::include_proto!("dstore");
3+
}

0 commit comments

Comments
 (0)