1use intel_cache_lib::ic_types::IcPacket;
2use intel_cache_lib::lib_backend::show_entries;
3use intel_cache_lib::lib_backend::delete_entry;
4use intel_cache_lib::ic_types::ic_execute_mod::IcExecute;
5use intel_cache_lib::lib_backend::make_file_entry;
6use intel_cache_lib::lib_backend::get_entry_by_id;
7use intel_cache_lib::lib_backend::update_entry;
8use intel_cache_lib::lib_backend::get_entry;
9use intel_cache_lib::ic_types::IcConnection;
10
11use futures::executor::block_on;
12use std::str;
13
14#[derive(Clone)]
15pub struct StorageEntry { }
16impl StorageEntry{
17 #[no_mangle]
18 pub fn se_new() -> StorageEntry {
19 StorageEntry {}
20 }
21
22 #[no_mangle]
23 pub fn se_to_exe() -> Box<dyn IcExecute<Connection = IcConnection>> {
24 Box::new(StorageEntry::se_new())
25 }
26}
27impl IcExecute for StorageEntry {
28 type Connection = IcConnection;
29 fn exec(&mut self,con: &mut Self::Connection,cmd: Option<Vec<String>>, data: Option<Vec<u8>>,cached: bool) -> IcPacket {
30 match cmd {
31 Some(c) => {
32 if con.login != None && con.login.as_ref().unwrap().cookie == c[c.len() - 1..][0] {
33 let mut get = false;
34 let mut set = false;
35 let mut create = false;
36 let mut delete = false;
37 let mut show = false;
38 let mut rstr = "".to_string();
39
40 match c[1].as_str() {
41 "DELETE" => delete = true,
42 "SHOW" => show = true,
43 "CREATE" => create = true,
44 "GET" => get = true,
45 "SET" => set = true,
46 _ => eprintln!("{} is not a valid subcommand of ENTRY",c[0]),
47 }
48
49 if create {
50 let public;
52 if (c.len() as i32) >= 5 {
53 match c[3].as_ref() {
54 "PUBLIC" => public = true,
55 _ => public = false,
56 }
57 let loc: i32;
58 match str::parse::<i32>(&c[5]){
59 Ok(l) => loc = l,
60 Err(_err) => return IcPacket::new(Some("ERR: Sixth argument isn't a number.".to_string()),None),
61 }
62 let r = make_file_entry(con,&c[2],data.unwrap_or(Vec::new()),Some(loc),None,public,cached);
63 match r {
64 Ok(_e) => return IcPacket::new(Some("OK!".to_string()),Some(rstr.as_bytes().to_vec())),
65 Err(_err) => panic!("{}",_err),}
67 } else if (c.len() as i32) >= 4 {
68 match c[3].as_ref() {
69 "PUBLIC" => public = true,
70 _ => public = false,
71 }
72 let r = make_file_entry(con,&c[2],data.unwrap_or(Vec::new()),None,None,public,cached);
73 match r {
74 Ok(_e) => return IcPacket::new(Some("OK!".to_string()),Some(rstr.as_bytes().to_vec())),
75 Err(_err) => panic!("{}",_err)}
77 } else { return IcPacket::new(Some(format!("ERR: Requires 5 to 7 arguments But {} were given",c.len()).to_string()),None) }
78 }
79 if delete {
80 if c.len() == 4 {
82 let etd: i32;
83 match c[2].parse::<i32>() {
84 Ok(e) => etd = e,
85 Err(_err) => return IcPacket::new(Some(format!("ERR: Third argument is not a number ({})",c[2]).to_string()),None),
86 }
87 let res = delete_entry(&con.backend_con,etd);
88 match res {
89 Ok(_e) => return IcPacket::new(Some("OK!".to_string()),Some(rstr.as_bytes().to_vec())),
90 Err(_err) => return IcPacket::new(Some("ERR: Deleting entry failed.".to_string()),None),
91 }
92 }
93 }
94 if show {
95 if c.len() >= 4 {
97 rstr = show_entries(&con.backend_con,Some(false),Some(true),Some(c[3].parse::<i32>().unwrap()),&(con.login).as_ref().unwrap().id,true);
98 } else {
99 rstr = show_entries(&con.backend_con,Some(false),Some(true),None,&(con.login).as_ref().unwrap().id,true);
100 }
101 return if rstr != "" {IcPacket::new(Some("OK!".to_string()),Some(rstr.as_bytes().to_vec()))} else {IcPacket::new(Some("Err.".to_string()),None)};
102 }
103 if get {
104 if c.len() == 4 {
106 if let Some(e) = get_entry_by_id(&con.backend_con,c[2].parse::<i32>().unwrap_or(-1)) {
107 return get_entry(con,c[2].parse::<i32>().unwrap(),&e.name)
108 } else {return IcPacket::new(Some(format!("ERR: Entry {} not found.",c[2]).to_string()),None)}
109 } else {return IcPacket::new(Some(format!("ERR: Requires 4 Arguments but {} were provided.",c.len()).to_string()),None)}
110 }
111 if set {
112 if c.len() == 4 { println!("MARKER 1");
115 match c[2].parse::<i32>() {
116 Ok(v) => {
117 match block_on(update_entry(&con.backend_con,v,data,None,None,None)) {
118 Ok(_v) => return IcPacket::new(Some("OK!".to_string()),None),
119 Err(_err) => return IcPacket::new(Some("Err.".to_string()),None),
120 };
121 },
122 Err(_err) => { return IcPacket::new(Some("Err.".to_string()),None)},
123 }
124 } else if c.len() == 5 { println!("MARKER 2");
126 let its: i32;
127 match c[2].parse::<i32>() {
128 Ok(v) => its = v,
129 Err(_err) => { return IcPacket::new(Some("ERR: Third argument isn't a number.".to_string()),None)},
130 }
131 let pnl = c[3].parse::<i32>().unwrap_or(-1);
132 if pnl == -1 {
133 match block_on(update_entry(&con.backend_con,its,data,Some(&c[3]),None,None)) {
134 Ok(_v) => return IcPacket::new(Some("OK!".to_string()),None),
135 Err(_err) => return IcPacket::new(Some("ERR: Cannot update entry with new name.".to_string()),None),
136 };
137 } else {
138 match block_on(update_entry(&con.backend_con,its,data,None,Some(c[3].parse::<i32>().unwrap()),None)) {
139 Ok(_v) => return IcPacket::new(Some("OK!".to_string()),None),
140 Err(_err) => return IcPacket::new(Some("ERR: Cannot update entry with new loc.".to_string()),None),
141 };
142 }
143 } else if c.len() > 5 { println!("MARKER 3");
145 let its: i32;
147 match c[2].parse::<i32>() {
148 Ok(v) => its = v,
149 Err(_err) => { return IcPacket::new(Some("Err.".to_string()),None)},
150 }
151 let nli: i32;
153 match c[4].parse::<i32>() {
154 Ok(v) => nli = v,
155 Err(_err) => { return IcPacket::new(Some("Err.".to_string()),None)},
156 }
157 match block_on(update_entry(&con.backend_con,its,data,Some(&c[3]),Some(nli),None)) {
158 Ok(_v) => return IcPacket::new(Some("OK!".to_string()),None),
159 Err(_err) => return IcPacket::new(Some("Err.".to_string()),None),
160 };
161 }
162 }
163 IcPacket::new(Some(format!("ERR: STORAGE COMMAND {:?} NOT FOUND",c).to_string()),None)
164 } else { return IcPacket::new_denied(); }
165 },
166 None => return IcPacket::new(Some("Err.".to_string()),None),
167 }
168 }
169
170 fn login_required(&mut self) -> bool {
171 true
172 }
173}