From 7947f7d8bdbb81b5f4932987b9abbf54c5bae113 Mon Sep 17 00:00:00 2001 From: Patrick Haun Date: Sat, 8 Jul 2017 16:49:14 +0200 Subject: [PATCH] [wip] improve lua performance --- src/filter.rs | 72 +++++++++++++++++++++++++++++++++++---------------- src/main.rs | 4 ++- 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/filter.rs b/src/filter.rs index 53eaeb8..34c1f6e 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -1,18 +1,36 @@ -use hlua::{Lua, LuaError}; +use hlua::{Lua, LuaError, AnyLuaValue}; use std::collections::BTreeMap; -pub fn show_log_entry(log_entry: &BTreeMap, filter_expr: &str, implicit_return: bool) -> Result { - let mut lua = Lua::new(); - lua.openlibs(); - for (key, value) in log_entry { - lua.set(key.to_owned(), value.to_owned()); +pub struct Filter<'filter> { + lua: Lua<'filter> +} + +impl<'filter> Filter<'filter> { + + pub fn new() -> Filter<'filter> { + let mut lua = Lua::new(); + lua.openlibs(); + Filter{ lua: lua } } - if implicit_return { - lua.execute(&format!("return {};", filter_expr)) - } else { - lua.execute(filter_expr) + pub fn show_log_entry(&mut self, log_entry: &BTreeMap, filter_expr: &str, implicit_return: bool) -> Result { + + for (key, value) in log_entry { + self.lua.set(key.to_owned(), value.to_owned()); + } + + let result: Result = if implicit_return { + self.lua.execute(&format!("return {};", filter_expr)) + } else { + self.lua.execute(filter_expr) + }; + + for key in log_entry.keys() { + self.lua.set(key.to_owned(), AnyLuaValue::LuaNil); + } + + result } } @@ -32,54 +50,62 @@ mod tests { #[test] fn allow_all() { let log_entry: BTreeMap = test_log_entry(); - assert_eq!(true, show_log_entry(&log_entry, "true", true).unwrap()); + let mut filter = Filter::new(); + assert_eq!(true, filter.show_log_entry(&log_entry, "true", true).unwrap()); } #[test] fn deny_all() { let log_entry: BTreeMap = test_log_entry(); - assert_eq!(false, show_log_entry(&log_entry, "false", true).unwrap()); + let mut filter = Filter::new(); + assert_eq!(false, filter.show_log_entry(&log_entry, "false", true).unwrap()); } #[test] fn filter_process() { let log_entry: BTreeMap = test_log_entry(); - assert_eq!(true, show_log_entry(&log_entry, r#"process == "rust""#, true).unwrap()); - assert_eq!(false, show_log_entry(&log_entry, r#"process == "meep""#, true).unwrap()); + let mut filter = Filter::new(); + assert_eq!(true, filter.show_log_entry(&log_entry, r#"process == "rust""#, true).unwrap()); + assert_eq!(false, filter.show_log_entry(&log_entry, r#"process == "meep""#, true).unwrap()); } #[test] fn filter_logical_operators() { let log_entry: BTreeMap = test_log_entry(); - assert_eq!(true, show_log_entry(&log_entry, r#"process == "rust" and fu == "bower""#, true).unwrap()); - assert_eq!(true, show_log_entry(&log_entry, r#"process == "rust" or fu == "bauer""#, true).unwrap()); + let mut filter = Filter::new(); + assert_eq!(true, filter.show_log_entry(&log_entry, r#"process == "rust" and fu == "bower""#, true).unwrap()); + assert_eq!(true, filter.show_log_entry(&log_entry, r#"process == "rust" or fu == "bauer""#, true).unwrap()); } #[test] fn filter_contains() { let log_entry: BTreeMap = test_log_entry(); - assert_eq!(true, show_log_entry(&log_entry, r#"string.find(message, "something") ~= nil"#, true).unwrap()); - assert_eq!(false, show_log_entry(&log_entry, r#"string.find(message, "bla") ~= nil"#, true).unwrap()); + let mut filter = Filter::new(); + assert_eq!(true, filter.show_log_entry(&log_entry, r#"string.find(message, "something") ~= nil"#, true).unwrap()); + assert_eq!(false, filter.show_log_entry(&log_entry, r#"string.find(message, "bla") ~= nil"#, true).unwrap()); } #[test] fn filter_regex() { let log_entry: BTreeMap = test_log_entry(); - assert_eq!(true, show_log_entry(&log_entry, r#"string.find(fu, "bow.*") ~= nil"#, true).unwrap()); - assert_eq!(false, show_log_entry(&log_entry, r#"string.find(fu, "bow.*sd") ~= nil"#, true).unwrap()); + let mut filter = Filter::new(); + assert_eq!(true, filter.show_log_entry(&log_entry, r#"string.find(fu, "bow.*") ~= nil"#, true).unwrap()); + assert_eq!(false, filter.show_log_entry(&log_entry, r#"string.find(fu, "bow.*sd") ~= nil"#, true).unwrap()); } #[test] fn unknown_variable() { let log_entry: BTreeMap = test_log_entry(); - assert_eq!(false, show_log_entry(&log_entry, r#"sdkfjsdfjsf ~= nil and string.find(sdkfjsdfjsf, "bow.*") ~= nil"#, true).unwrap()); + let mut filter = Filter::new(); + assert_eq!(false, filter.show_log_entry(&log_entry, r#"sdkfjsdfjsf ~= nil and string.find(sdkfjsdfjsf, "bow.*") ~= nil"#, true).unwrap()); } #[test] fn no_implicit_return() { let log_entry: BTreeMap = test_log_entry(); - assert_eq!(true, show_log_entry(&log_entry, r#"if 3 > 2 then return true else return false end"#, false).unwrap()); - assert_eq!(false, show_log_entry(&log_entry, r#"if 1 > 2 then return true else return false end"#, false).unwrap()); + let mut filter = Filter::new(); + assert_eq!(true, filter.show_log_entry(&log_entry, r#"if 3 > 2 then return true else return false end"#, false).unwrap()); + assert_eq!(false, filter.show_log_entry(&log_entry, r#"if 1 > 2 then return true else return false end"#, false).unwrap()); } } diff --git a/src/main.rs b/src/main.rs index a2b98f4..dba03b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,6 +34,8 @@ fn main() { let implicit_return = !matches.is_present("no-implicit-filter-return-statement"); let maybe_filter = matches.value_of("filter"); + let mut lua_filter = filter::Filter::new(); + let stdin = io::stdin(); let reader = stdin.lock(); for line in reader.lines() { @@ -42,7 +44,7 @@ fn main() { Ok(Value::Object(log_entry)) => { let string_log_entry = &extract_string_values(&log_entry); if let Some(filter) = maybe_filter { - match filter::show_log_entry(string_log_entry, filter, implicit_return) { + match lua_filter.show_log_entry(string_log_entry, filter, implicit_return) { Ok(true) => log::print_log_line(&mut io::stdout(), string_log_entry, &additional_values, dump_all), Ok(false) => (), Err(e) => {