ic_storage_module/
storage_entry_command.rs

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						//ENTRY CREATE ((NAME)) {PUBLIC|PRIVATE} [UNDER <LOC>]
51						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),//return IcPacket::new(Some("ERR: Failed to make entry.".to_string()),None),
66							}
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)//return IcPacket::new(Some("ERR: Failed to make entry.".to_string()),None),
76							}
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						//ENTRY DELETE ((NAME)) <COOKIE>
81						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						//ENTRY SHOW {PUBLIC|PRIVATE} [<DIR ID>] <COOKIE>
96						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						//ENTRY GET <ENTRY ID> <COOKIE>
105						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						//ENTRY SET <ENTRY ID> {<NEW NAME>|<NEW LOC>} <COOKIE>
113						if c.len() == 4 { //No new loc or name.
114							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 { //New loc OR new name
125							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 { //New loc + new name
144							println!("MARKER 3");
145							//Harden entry id
146							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							//Harden new loc id
152							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}