Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.74 KB | None | 0 0
  1. use sled::Db;
  2. use std::str;
  3. use std::time::Instant;
  4.  
  5. #[derive(Debug)]
  6. enum Error {
  7.     InvalidCommand,
  8.     Database,
  9.     InvalidKey,
  10. }
  11.  
  12. fn handle(t: sled::Db, msg: &str) -> Result<String, Error> {
  13.     let mut commands = msg.split_whitespace();
  14.     let cmd = commands.next().ok_or(Error::InvalidCommand)?;
  15.     let key = commands.next().ok_or(Error::InvalidKey)?;
  16.     let val: String = commands.collect::<Vec<&str>>().join(" ");
  17.     match cmd {
  18.         "GET" => {         
  19.             match t.get(key.as_bytes()).map_err(|_| Error::Database)? {
  20.                 Some(val) => String::from_utf8(val.to_vec()).map_err(|_| Error::Database),
  21.                 None => Err(Error::InvalidKey),
  22.             }
  23.         },
  24.         "SET" => {
  25.             match t.insert(key.as_bytes(), val.as_bytes()).map_err(|_| Error::Database)? {
  26.                 Some(val) => String::from_utf8(val.to_vec()).map_err(|_| Error::Database),
  27.                 None => Ok(String::from("done")),
  28.             }
  29.         },
  30.         _ => Err(Error::InvalidCommand)
  31.     }
  32. }
  33.  
  34. fn main() {
  35.     let context = zmq::Context::new();
  36.     let responder = context.socket(zmq::REP).unwrap();
  37.     assert!(responder.bind("tcp://*:5555").is_ok());
  38.     let mut msg = zmq::Message::new();
  39.     let t = Db::open("my_db").unwrap();
  40.     println!("{}", "
  41.       _______ ___ ___ ___
  42.      |_  / __|   \\_ _/ __|
  43.       / /| _|| |) | |\\__ \\
  44.      /___|___|___/___|___/
  45.  
  46.  
  47.     Welcome to zedis a lightweight
  48.     super simple datasore.
  49.  
  50.     transport: tpc://localhost:5555
  51.     database file: my_db");
  52.  
  53.     loop {
  54.         responder.recv(&mut msg, 0).unwrap();
  55.         let msg_text = msg.as_str().unwrap();
  56.         let start = Instant::now();
  57.         let answer = match handle(t.clone(), msg_text) {
  58.             Ok(res) => res,
  59.             Err(e) => format!("Error occurred: {:?}", e)
  60.         };
  61.         responder.send(answer, 0).expect("ZMQ error");
  62.         let _duration = start.elapsed();
  63.     }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement